from PyQt5 import QtCore, QtWidgets # import os, sys, inspect # currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # parentdir = os.path.dirname(currentdir) # sys.path.insert(0, parentdir) # del currentdir, parentdir from gui.filterView import FilterView, MeasureBoxGraphItem from geometricOperations 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.filterHeight = self.filterView.filter.height self.crossBoxGenerator.filterWidth = self.filterView.filter.width 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 viewItems = [] topLefts: list = self.crossBoxGenerator.get_topLeft_of_boxes() boxSize = self.crossBoxGenerator.boxSize for (x, y) in topLefts: newBox: MeasureBoxGraphItem = MeasureBoxGraphItem(x, y, boxSize, boxSize) viewItems.append(newBox) self.filterView.update_measure_boxes(viewItems) 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 = QtWidgets.QGroupBox('Spiral Box Controls') self.spiralBoxGenerator: SpiralSelector = SpiralSelector(None) self.update_measure_viewItems() def update_measure_viewItems(self) -> None: self.spiralBoxGenerator.filterHeight = self.filterView.filter.height self.spiralBoxGenerator.filterWidth = self.filterView.filter.width # 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 viewItems = [] topLefts: list = self.spiralBoxGenerator.get_topLeft_of_boxes() boxSize = self.spiralBoxGenerator.boxSize for (x, y) in topLefts: newBox: MeasureBoxGraphItem = MeasureBoxGraphItem(x, y, boxSize, boxSize) viewItems.append(newBox) self.filterView.update_measure_boxes(viewItems)