from PyQt5 import QtCore, QtWidgets from gui.filterView import FilterView, MeasureBoxGraphItem from geometricMethods import CrossBoxSelector, SpiralSelector class MeasureMode(QtCore.QObject): def __init__(self, relatedFilterView: FilterView): super(MeasureMode, self).__init__() self.filterView = relatedFilterView self.uiControls: QtWidgets.QGroupBox = QtWidgets.QGroupBox() def get_control_groupBox(self) -> QtWidgets.QGroupBox: return self.uiControls def update_measure_viewItems(self) -> None: raise NotImplementedError class CrossBoxMode(MeasureMode): def __init__(self, *args): super(CrossBoxMode, self).__init__(*args) self.uiControls = CrossBoxesControls(self) self.crossBoxGenerator: CrossBoxSelector = CrossBoxSelector(None) self.update_measure_viewItems() def update_measure_viewItems(self) -> None: self.crossBoxGenerator.filterDiameter = self.filterView.filter.diameter self.crossBoxGenerator.numBoxesAcross = int(self.uiControls.numBoxesSelector.currentText()) desiredCoverage: int = self.uiControls.coverageSpinbox.value() maxCoverage: int = int(self.crossBoxGenerator.get_maximum_achievable_fraction() * 100) self.uiControls.set_to_max_possible_coverage(maxCoverage) if desiredCoverage > maxCoverage: desiredCoverage = maxCoverage self.crossBoxGenerator.fraction = desiredCoverage / 100 topLefts: list = self.crossBoxGenerator.get_topLeft_of_boxes() boxSize = self.crossBoxGenerator.boxSize self.filterView.update_measure_boxes(topLefts, boxSize) class CrossBoxesControls(QtWidgets.QGroupBox): """ Gives a groupbox with the controls for setting up the cross boxes. """ def __init__(self, measureModeParent: MeasureMode): super(CrossBoxesControls, self).__init__() self.setTitle('Cross Box Controls') self.measureModeParent = measureModeParent layout = QtWidgets.QHBoxLayout() self.setLayout(layout) layout.addWidget(QtWidgets.QLabel('Number of Boxes across:')) self.numBoxesSelector = QtWidgets.QComboBox() self.numBoxesSelector.addItems([str(3), str(5)]) self.numBoxesSelector.currentTextChanged.connect(self._config_changed) layout.addWidget(self.numBoxesSelector) layout.addStretch() layout.addWidget(QtWidgets.QLabel('Desired Coverage (%)')) self.coverageSpinbox = QtWidgets.QSpinBox() self.coverageSpinbox.setFixedWidth(50) self.coverageSpinbox.setMinimum(0) self.coverageSpinbox.setMaximum(100) self.coverageSpinbox.setValue(10) self.coverageSpinbox.valueChanged.connect(self._config_changed) layout.addWidget(self.coverageSpinbox) def _config_changed(self): self.measureModeParent.update_measure_viewItems() def set_to_max_possible_coverage(self, maxCoverage: int): self.coverageSpinbox.setMaximum(maxCoverage) if maxCoverage < self.coverageSpinbox.value(): self.coverageSpinbox.valueChanged.disconnect() self.coverageSpinbox.setValue(maxCoverage) self.coverageSpinbox.valueChanged.connect(self._config_changed) class SpiralBoxMode(MeasureMode): def __init__(self, *args): super(SpiralBoxMode, self).__init__(*args) self.uiControls: SpiralBoxControls = SpiralBoxControls(self) self.spiralBoxGenerator: SpiralSelector = SpiralSelector(None) self.update_measure_viewItems() def update_measure_viewItems(self) -> None: self.spiralBoxGenerator.filterDiameter = self.filterView.filter.diameter self.spiralBoxGenerator.numBoxes = self.uiControls.numBoxesSpinbox.value() self.spiralBoxGenerator.fraction = self.uiControls.coverageSpinbox.value() / 100 topLefts: list = self.spiralBoxGenerator.get_topLeft_of_boxes() boxSize = self.spiralBoxGenerator.boxSize self.filterView.update_measure_boxes(topLefts, boxSize) class SpiralBoxControls(QtWidgets.QGroupBox): """ Gives a groupbox with the controls for setting up the cross boxes. """ def __init__(self, measureModeParent: MeasureMode): super(SpiralBoxControls, self).__init__() self.setTitle('Spiral Box Controls') self.measureModeParent = measureModeParent layout = QtWidgets.QHBoxLayout() self.setLayout(layout) layout.addWidget(QtWidgets.QLabel('Num Boxes:')) self.numBoxesSpinbox = QtWidgets.QSpinBox() self.numBoxesSpinbox.setValue(10) self.numBoxesSpinbox.valueChanged.connect(self._config_changed) layout.addWidget(self.numBoxesSpinbox) layout.addStretch() layout.addWidget(QtWidgets.QLabel('Desired Coverage (%)')) self.coverageSpinbox = QtWidgets.QSpinBox() self.coverageSpinbox.setFixedWidth(50) self.coverageSpinbox.setMinimum(0) self.coverageSpinbox.setMaximum(100) self.coverageSpinbox.setValue(10) self.coverageSpinbox.valueChanged.connect(self._config_changed) layout.addWidget(self.coverageSpinbox) def _config_changed(self): if self.numBoxesSpinbox.value() > 0: self.measureModeParent.update_measure_viewItems()