class IntegrateEditor(BaseEditor): """ Editor to integrate defined regions. """ Integrators_classes = Integrate.INTEGRALS Integrators = [a.name for a in Integrators_classes] def __init__(self, parent=None, **kwargs): super().__init__(parent, **kwargs) self._limits = [] self.setLayout(QVBoxLayout()) self.form_set = QFormLayout() self.form_lim = QFormLayout() self.layout().addLayout(self.form_set) self.layout().addLayout(self.form_lim) self.methodcb = QComboBox() self.methodcb.addItems(self.Integrators) self.form_set.addRow("Integration method:", self.methodcb) self.methodcb.currentIndexChanged.connect(self.changed) self.methodcb.activated.connect(self.edited) self.focusIn = self.activateOptions self.add_limit() button = QPushButton("Add Region") self.layout().addWidget(button) button.clicked.connect(self.add_limit) self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred) self.user_changed = False def activateOptions(self): self.parent_widget.curveplot.clear_markings() for row in range(self.form_lim.count()): limitbox = self.form_lim.itemAt(row, 1) if limitbox: self.parent_widget.curveplot.add_marking(limitbox.line1) self.parent_widget.curveplot.add_marking(limitbox.line2) def add_limit(self, *args, row=None): if row is None: row = len(self._limits) try: self._limits.append(self._limits[-1]) except IndexError: self._limits.append([0., 1.]) label = "Region {0}".format(row + 1) limitbox = LimitsBox(limits=self._limits[row], label=label) if self.form_lim.rowCount() < row + 1: # new row self.form_lim.addRow(limitbox) else: # row already exists self.form_lim.setLayout(row, 2, limitbox) limitbox.focusIn = self.activateOptions limitbox.valueChanged.connect(self.set_limits) limitbox.editingFinished.connect(self.edited) limitbox.deleted.connect(self.remove_limit) self.edited.emit() return limitbox def remove_limit(self, limitbox): row, role = self.form_lim.getLayoutPosition(limitbox) for r in range(row, len(self._limits)): limitbox = self.form_lim.itemAt(r, 1) limitbox.removeLayout() self._limits.pop(row) self.set_all_limits(self._limits) def set_limits(self, limits, limitbox, user=True): if user: self.user_changed = True row, role = self.form_lim.getLayoutPosition(limitbox) if self._limits[row] != limits: self._limits[row] = limits with blocked(self.form_lim): limitbox.lowlime.setValue(limits[0]) limitbox.highlime.setValue(limits[1]) self.changed.emit() def set_all_limits(self, limits, user=True): if user: self.user_changed = True self._limits = limits for row in range(len(limits)): limitbox = self.form_lim.itemAt(row, 1) if limitbox is None: limitbox = self.add_limit(row=row) with blocked(limitbox): limitbox.lowlime.setValue(limits[row][0]) limitbox.highlime.setValue(limits[row][1]) self.changed.emit() def setParameters(self, params): if params: # parameters were manually set somewhere else self.user_changed = True self.methodcb.setCurrentIndex( params.get("method", self.Integrators_classes.index(Integrate.Baseline))) self.set_all_limits(params.get("limits", [[0., 1.]]), user=False) def parameters(self): return {"method": self.methodcb.currentIndex(), "limits": self._limits} @staticmethod def createinstance(params): methodindex = params.get( "method", IntegrateEditor.Integrators_classes.index(Integrate.Baseline)) method = IntegrateEditor.Integrators_classes[methodindex] limits = params.get("limits", None) return Integrate(methods=method, limits=limits) def set_preview_data(self, data): if not self.user_changed: x = getx(data) if len(x): self.set_all_limits([[min(x), max(x)]]) self.edited.emit()
class IntegrateEditor(BaseEditor): """ Editor to integrate defined regions. """ Integrators_classes = Integrate.INTEGRALS Integrators = [a.name for a in Integrators_classes] def __init__(self, parent=None, **kwargs): super().__init__(parent, **kwargs) self._limits = [] self.setLayout(QVBoxLayout()) self.form_set = QFormLayout() self.form_lim = QFormLayout() self.layout().addLayout(self.form_set) self.layout().addLayout(self.form_lim) self.methodcb = QComboBox() self.methodcb.addItems(self.Integrators) self.form_set.addRow("Integration method:", self.methodcb) self.methodcb.currentIndexChanged.connect(self.changed) self.methodcb.activated.connect(self.edited) self.focusIn = self.activateOptions self.add_limit() button = QPushButton("Add Region") self.layout().addWidget(button) button.clicked.connect(self.add_limit) self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred) self.user_changed = False def activateOptions(self): self.parent_widget.curveplot.clear_markings() for row in range(self.form_lim.count()): limitbox = self.form_lim.itemAt(row, 1) if limitbox: self.parent_widget.curveplot.add_marking(limitbox.line1) self.parent_widget.curveplot.add_marking(limitbox.line2) def add_limit(self, *args, row=None): if row is None: row = len(self._limits) try: self._limits.append(self._limits[-1]) except IndexError: self._limits.append([0., 1.]) label = "Region {0}".format(row+1) limitbox = LimitsBox(limits=self._limits[row], label=label) if self.form_lim.rowCount() < row+1: # new row self.form_lim.addRow(limitbox) else: # row already exists self.form_lim.setLayout(row, 2, limitbox) limitbox.focusIn = self.activateOptions limitbox.valueChanged.connect(self.set_limits) limitbox.editingFinished.connect(self.edited) limitbox.deleted.connect(self.remove_limit) self.edited.emit() return limitbox def remove_limit(self, limitbox): row, role = self.form_lim.getLayoutPosition(limitbox) for r in range(row, len(self._limits)): limitbox = self.form_lim.itemAt(r, 1) limitbox.removeLayout() self._limits.pop(row) self.set_all_limits(self._limits) def set_limits(self, limits, limitbox, user=True): if user: self.user_changed = True row, role = self.form_lim.getLayoutPosition(limitbox) if self._limits[row] != limits: self._limits[row] = limits with blocked(self.form_lim): limitbox.lowlime.setValue(limits[0]) limitbox.highlime.setValue(limits[1]) self.changed.emit() def set_all_limits(self, limits, user=True): if user: self.user_changed = True self._limits = limits for row in range(len(limits)): limitbox = self.form_lim.itemAt(row, 1) if limitbox is None: limitbox = self.add_limit(row=row) with blocked(limitbox): limitbox.lowlime.setValue(limits[row][0]) limitbox.highlime.setValue(limits[row][1]) self.changed.emit() def setParameters(self, params): if params: # parameters were manually set somewhere else self.user_changed = True self.methodcb.setCurrentIndex( params.get("method", self.Integrators_classes.index(Integrate.Baseline))) self.set_all_limits(params.get("limits", [[0., 1.]]), user=False) def parameters(self): return {"method": self.methodcb.currentIndex(), "limits": self._limits} @staticmethod def createinstance(params): methodindex = params.get("method", IntegrateEditor.Integrators_classes.index(Integrate.Baseline)) method = IntegrateEditor.Integrators_classes[methodindex] limits = params.get("limits", None) return Integrate(methods=method, limits=limits) def set_preview_data(self, data): if not self.user_changed: x = getx(data) if len(x): self.set_all_limits([[min(x), max(x)]]) self.edited.emit()