Ejemplo n.º 1
0
class ConfigDialog(QDialog, Ui_Dialog):
    def __init__(self, params: dict, parent=None):
        QDialog.__init__(self, parent)
        self.params = copy.deepcopy(params)
        self.setupUi(self)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.set_styles()
        self.setGeometry(0, 0, self.width(), self.height())
        for f in self.findChildren(QFrame):
            if f.objectName().startswith("frm"):
                f.mousePressEvent = partial(self.frame_pressed, f)
        self.selected_param: Parameter = None
        self.selected_param_frame = QFrame()
        self.setup_ui()
        self.d_params = {}
        self.frm_aceptar.mousePressEvent = partial(self.frm_aceptar_pressed)
        self.frm_cancelar.mousePressEvent = partial(self.frm_cancelar_pressed)
        self.frm_volver.mousePressEvent = partial(self.frm_volver_pressed)
        self.uncommited_change = False  # flag para indica que se cambió el valor de un parámetro, pero no se ha guardado
        self.frm_param_op_mode_pcv.mousePressEvent = partial(
            self.frm_param_op_mode_pcv_pressed)
        self.frm_param_op_mode_vcv.mousePressEvent = partial(
            self.frm_param_op_mode_vcv_pressed)
        self.set_labels()
        self.update_ie_times()

    def set_styles(self):
        self.line.hide()
        self.setStyleSheet("background-color: " + st.BLACK +
                           "; color: lightgrey;")
        self.frm_op_mode.setStyleSheet(st.qss_frm_group)
        self.frm_buttons.setStyleSheet(st.qss_frm_group)
        self.frm_values.setStyleSheet(st.qss_frm_group)
        self.frm_times.setStyleSheet(st.qss_frm_group)
        self.lbl_title_op_mode.setStyleSheet(
            "background-color: rgba(0, 0, 0, 0)")
        self.lbl_title_basic_params.setStyleSheet(
            "background-color: rgba(0, 0, 0, 0)")
        self.lbl_title_right.setStyleSheet(
            "background-color: rgba(0, 0, 0, 0)")
        for lbl in self.frm_times.findChildren(QLabel):
            lbl.setStyleSheet("background-color: rgba(0, 0, 0, 0)")
        self.frm_aceptar.setStyleSheet(st.qss_frm_but_enabled)
        self.frm_cancelar.setStyleSheet(st.qss_frm_but_enabled)
        self.frm_volver.setStyleSheet(st.qss_frm_but_enabled)
        self.frm_left_arrow.setStyleSheet(st.qss_frm_top)
        self.frm_right_arrow.setStyleSheet(st.qss_frm_top)
        self.frm_left_arrow_2.setStyleSheet(st.qss_frm_top)
        self.frm_right_arrow_2.setStyleSheet(st.qss_frm_top)
        self.frm_param_op_mode_simv.hide()
        frames = self.findChildren(QFrame)
        for f in frames:
            if f.objectName().startswith('frm_param_'):
                f.setStyleSheet(st.qss_frm_top)

    def set_frame_mode_dependent_labels(self, frame, param, idx=None):
        if idx is None:
            # TODO: extract idx from frame name
            raise NotImplementedError

        label = frame.findChild(QLabel, name="lbl_basic_{}".format(idx))
        val_label = frame.findChild(QLabel,
                                    name="lbl_basic_value_{}".format(idx))
        if label is None or val_label is None:
            raise ValueError
        label.setText("<html>{}<br>[{}]</html>".format(param.screen_name,
                                                       param.units))
        val_label.setText(f"{param.value:{param.value_format}}")

    def set_labels(self):
        for name, param in self.params.items():
            if name in (ParamEnum.ier_i.name, ParamEnum.ier_e.name):
                continue
            elif name in (ParamEnum.tvm.name, ParamEnum.mp.name):
                continue
            frame_name = "frm_param_" + name
            f = self.findChild(QFrame, name=frame_name)
            if f:
                self.get_value_label(f).setText(
                    f"{param.value:{param.value_format}}")

        if self.params['mode'].value == OpModEnum.vcv.value:
            self.frm_param_op_mode_vcv.setStyleSheet(st.qss_frm_selected)
            self.frm_param_op_mode_pcv.setStyleSheet(st.qss_frm_top)
            self.set_frame_mode_dependent_labels(
                self.frm_param_mode_dep_1, self.params[ParamEnum.tvm.name], 1)
        elif self.params['mode'].value == OpModEnum.pcv.value:
            self.frm_param_op_mode_pcv.setStyleSheet(st.qss_frm_selected)
            self.frm_param_op_mode_vcv.setStyleSheet(st.qss_frm_top)
            self.set_frame_mode_dependent_labels(
                self.frm_param_mode_dep_1, self.params[ParamEnum.mp.name], 1)

        # ier
        ier_i = self.params[ParamEnum.ier_i.name]
        ier_e = self.params[ParamEnum.ier_e.name]
        f = self.findChild(QFrame, name="frm_param_ier")
        if f:
            self.get_value_label(f).setText(
                f"{ier_i.value:{ier_i.value_format}}:{ier_e.value:{ier_e.value_format}}"
            )

    def setup_ui(self):
        try:
            self.horizontalSlider.valueChanged.disconnect()
        except TypeError:
            pass
        try:
            self.horizontalSlider_2.valueChanged.disconnect()
        except TypeError:
            pass

        if self.params['mode'].value == OpModEnum.vcv.value:
            self.frm_param_pt.show()
            self.lbl_ptt_title.show()
            self.lbl_ptt.show()
        elif self.params['mode'].value == OpModEnum.pcv.value:
            self.frm_param_pt.hide()
            self.lbl_ptt_title.hide()
            self.lbl_ptt.hide()

        if self.selected_param is None:
            self.frm_left_arrow.hide()
            self.frm_right_arrow.hide()
            self.horizontalSlider.hide()
            self.frm_left_arrow_2.hide()
            self.frm_right_arrow_2.hide()
            self.horizontalSlider_2.hide()
            self.frm_volver.setEnabled(True)
            self.frm_volver.setStyleSheet(st.qss_frm_but_enabled)
            self.frm_aceptar.setDisabled(True)
            self.frm_aceptar.setStyleSheet(st.qss_frm_but_disbled)
            self.frm_cancelar.setDisabled(True)
            self.frm_cancelar.setStyleSheet(st.qss_frm_but_disbled)
            self.frm_op_mode.setEnabled(True)
            self.frm_left_arrow.setEnabled(False)
            self.frm_right_arrow.setEnabled(False)
            self.horizontalSlider.setEnabled(False)
            self.horizontalSlider_2.setEnabled(False)
        else:
            self.frm_left_arrow.show()
            self.frm_right_arrow.show()
            self.horizontalSlider.show()
            self.frm_volver.setDisabled(True)
            self.frm_volver.setStyleSheet(st.qss_frm_but_disbled)
            self.frm_aceptar.setEnabled(True)
            self.frm_aceptar.setStyleSheet(st.qss_frm_but_enabled)
            self.frm_cancelar.setEnabled(True)
            self.frm_cancelar.setStyleSheet(st.qss_frm_but_enabled)
            self.frm_op_mode.setDisabled(True)
            self.frm_left_arrow.setEnabled(True)
            self.frm_right_arrow.setEnabled(True)
            self.horizontalSlider.setEnabled(True)

            if self.selected_param == ParamEnum.ier.name:
                ier_i_param = self.params[ParamEnum.ier_i.name]
                ier_e_param = self.params[ParamEnum.ier_e.name]
                self.horizontalSlider_2.setEnabled(True)
                self.horizontalSlider.setMaximum(ier_i_param.value_max *
                                                 SLIDER_MULTIPLIER)
                self.horizontalSlider.setMinimum(ier_i_param.value_min *
                                                 SLIDER_MULTIPLIER)
                self.horizontalSlider.setSingleStep(1)
                self.horizontalSlider_2.setMaximum(ier_e_param.value_max *
                                                   SLIDER_MULTIPLIER)
                self.horizontalSlider_2.setMinimum(ier_e_param.value_min *
                                                   SLIDER_MULTIPLIER)
                self.horizontalSlider_2.setSingleStep(1)
                self.frm_left_arrow_2.show()
                self.frm_right_arrow_2.show()
                self.horizontalSlider_2.show()
            else:
                param = self.params[self.selected_param]
                self.horizontalSlider.setMaximum(param.value_max *
                                                 SLIDER_MULTIPLIER)
                self.horizontalSlider.setMinimum(param.value_min *
                                                 SLIDER_MULTIPLIER)
                self.horizontalSlider.setSingleStep(1)
                self.frm_left_arrow_2.hide()
                self.frm_right_arrow_2.hide()
                self.horizontalSlider_2.hide()

            self.horizontalSlider.valueChanged.connect(
                self.slider_value_changed)
            self.frm_left_arrow.mousePressEvent = partial(
                self.frm_left_arrow_pressed)
            self.frm_right_arrow.mousePressEvent = partial(
                self.frm_right_arrow_pressed)
            if self.selected_param == ParamEnum.ier.name:
                self.horizontalSlider_2.valueChanged.connect(
                    self.slider_2_value_changed)
                self.frm_left_arrow_2.mousePressEvent = partial(
                    self.frm_left_arrow_2_pressed)
                self.frm_right_arrow_2.mousePressEvent = partial(
                    self.frm_right_arrow_2_pressed)

    def update_ie_times(self):
        it, et, ft, ptt = Parameter.calculate_ie_times(self.d_params,
                                                       self.params)
        lbl_it = self.findChild(QLabel, name='lbl_it')
        lbl_et = self.findChild(QLabel, name='lbl_et')
        lbl_ft = self.findChild(QLabel, name='lbl_flowt')
        lbl_ptt = self.findChild(QLabel, name='lbl_ptt')
        lbl_it.setText(f"{it:.1f}")
        lbl_et.setText(f"{et:.1f}")
        lbl_ft.setText(f"{ft:.1f}")
        lbl_ptt.setText(f"{ptt:.1f}")

    def update_ui(self):
        if self.selected_param == ParamEnum.ier.name:
            param = self.params[ParamEnum.ier_i.name]
        else:
            param = self.params[self.selected_param]
        step = param.value_step
        val = self.d_params[param.name]['value']
        if val + step > param.value_max + EPS:
            self.frm_right_arrow.setEnabled(False)
        if val - step > param.value_min - EPS:
            self.frm_left_arrow.setEnabled(True)
        if val - step < param.value_min - EPS:
            self.frm_left_arrow.setEnabled(False)
        if val + step < param.value_max + EPS:
            self.frm_right_arrow.setEnabled(True)

        if self.selected_param == ParamEnum.ier.name:
            param = self.params[ParamEnum.ier_e.name]
            step = param.value_step
            val2 = self.d_params[ParamEnum.ier_e.name]['value']
            if val2 + step > param.value_max + EPS:
                self.frm_right_arrow_2.setEnabled(False)
            if val2 - step > param.value_min - EPS:
                self.frm_left_arrow_2.setEnabled(True)
            if val2 - step < param.value_min - EPS:
                self.frm_left_arrow_2.setEnabled(False)
            if val2 + step < param.value_max + EPS:
                self.frm_right_arrow_2.setEnabled(True)

        for name, param in self.d_params.items():
            # update affected params values
            if param['dependent']:
                param['value'] = Parameter.calculate_param(
                    name, self.d_params, self.params)

            frame_name = "frm_param_" + name
            f = self.findChild(QFrame, name=frame_name)
            if f:
                label = self.get_value_label(f)
                label.setText(
                    f"{param['value']:{self.params[name].value_format}}")

        self.update_ie_times()

        label = self.get_value_label(self.selected_param_frame)
        if self.selected_param == ParamEnum.ier.name:
            ier_i_param = self.params[ParamEnum.ier_i.name]
            ier_e_param = self.params[ParamEnum.ier_e.name]
            val2 = self.d_params[ParamEnum.ier_e.name]['value']
            label.setText(
                f"{val:{ier_i_param.value_format}}:{val2:{ier_e_param.value_format}}"
            )
        else:
            param = self.params[self.selected_param]
            label.setText(f"{val:{param.value_format}}")

    def update_slider(self, slider, value, valueChangedCallback):
        try:
            slider.valueChanged.disconnect()
        except TypeError:
            pass
        slider.setValue(self.param_to_slider_value(value))
        slider.valueChanged.connect(valueChangedCallback)

    def frm_param_op_mode_pcv_pressed(self, event: QMouseEvent):
        self.params['mode'].value = OpModEnum.pcv.value
        self.frm_param_op_mode_pcv.setStyleSheet(st.qss_frm_selected)
        self.frm_param_op_mode_vcv.setStyleSheet(st.qss_frm_top)
        self.frm_param_pt.hide()
        self.lbl_ptt_title.hide()
        self.lbl_ptt.hide()
        self.set_labels()
        self.update_ie_times()

    def frm_param_op_mode_vcv_pressed(self, event: QMouseEvent):
        self.params['mode'].value = OpModEnum.vcv.value
        self.frm_param_op_mode_vcv.setStyleSheet(st.qss_frm_selected)
        self.frm_param_op_mode_pcv.setStyleSheet(st.qss_frm_top)
        self.frm_param_pt.show()
        self.lbl_ptt_title.show()
        self.lbl_ptt.show()
        self.set_labels()
        self.update_ie_times()

    def frm_aceptar_pressed(self, event: QMouseEvent):
        if self.selected_param is not None:
            self.confirm_param()

    def frm_cancelar_pressed(self, event: QMouseEvent):
        if self.selected_param is not None:
            self.set_labels()
            self.selected_param_frame.setStyleSheet(st.qss_frm_top)
            self.unselect_child_frames(self.selected_param_frame.parent())
            self.selected_param = None
            self.selected_param_frame = None
        self.setup_ui()
        self.uncommited_change = False

    def frm_volver_pressed(self, event: QMouseEvent):
        dlg = ConfirmDialog(parent=self.frm_main)
        if dlg.exec_():
            self.accept()
        else:
            self.reject()

    def slider_value_changed(self, val):
        if self.selected_param == ParamEnum.ier.name:
            param = self.params[ParamEnum.ier_i.name]
        else:
            param = self.params[self.selected_param]
        self.d_params[param.name]['value'] = self.slider_to_param_value(
            self.horizontalSlider, param)
        self.update_ui()
        self.uncommited_change = True

    def frm_left_arrow_pressed(self, event: QMouseEvent):
        if self.selected_param == ParamEnum.ier.name:
            param = self.params[ParamEnum.ier_i.name]
        else:
            param = self.params[self.selected_param]
        step = param.value_step
        str_value = self.get_value_label(self.selected_param_frame).text()
        self.d_params[param.name]['value'] -= step
        self.update_ui()
        self.update_slider(self.horizontalSlider,
                           self.d_params[param.name]['value'],
                           self.slider_value_changed)
        self.uncommited_change = True

    def frm_right_arrow_pressed(self, event: QMouseEvent):
        if self.selected_param == ParamEnum.ier.name:
            param = self.params[ParamEnum.ier_i.name]
        else:
            param = self.params[self.selected_param]
        step = param.value_step
        str_value = self.get_value_label(self.selected_param_frame).text()
        self.d_params[param.name]['value'] += step
        self.update_ui()
        self.update_slider(self.horizontalSlider,
                           self.d_params[param.name]['value'],
                           self.slider_value_changed)
        self.uncommited_change = True

    def slider_2_value_changed(self, val):
        param = self.params[ParamEnum.ier_e.name]
        self.d_params[
            ParamEnum.ier_e.name]['value'] = self.slider_to_param_value(
                self.horizontalSlider_2, param)
        self.update_ui()
        self.uncommited_change = True

    def frm_left_arrow_2_pressed(self, event: QMouseEvent):
        param = self.params[ParamEnum.ier_e.name]
        step = param.value_step
        str_value = self.get_value_label(self.selected_param_frame).text()
        self.d_params[ParamEnum.ier_e.name]['value'] -= step
        self.update_ui()
        self.update_slider(self.horizontalSlider_2,
                           self.d_params[ParamEnum.ier_e.name]['value'],
                           self.slider_2_value_changed)
        self.uncommited_change = True

    def frm_right_arrow_2_pressed(self, event: QMouseEvent):
        param = self.params[ParamEnum.ier_e.name]
        step = param.value_step
        str_value = self.get_value_label(self.selected_param_frame).text()
        self.d_params[ParamEnum.ier_e.name]['value'] += step
        self.update_ui()
        self.update_slider(self.horizontalSlider_2,
                           self.d_params[ParamEnum.ier_e.name]['value'],
                           self.slider_2_value_changed)
        self.uncommited_change = True

    def confirm_param(self):
        for name, param in self.d_params.items():
            self.params[name].value = param['value']
        self.selected_param_frame.setStyleSheet(st.qss_frm_top)
        self.unselect_child_frames(self.selected_param_frame.parent())
        self.selected_param = None
        self.selected_param_frame = None
        self.setup_ui()
        self.uncommited_change = False
        self.set_labels()

    def frame_pressed(self, frame: QFrame, event: QMouseEvent):
        if frame.parent().objectName() == "frm_values":
            if frame == self.selected_param_frame:  # Confirma el parámetro
                self.confirm_param()
                return
            elif not self.uncommited_change:
                self.unselect_child_frames(frame.parent())
                frame.setStyleSheet(st.qss_frm_selected)
                param_name = frame.objectName().replace("frm_param_", "")
                if param_name == "mode_dep_1":
                    if self.params['mode'].value == OpModEnum.vcv.value:
                        param_name = ParamEnum.tvm.name
                    elif self.params['mode'].value == OpModEnum.pcv.value:
                        param_name = ParamEnum.mp.name

                self.selected_param = param_name
                self.selected_param_frame = frame
                self.d_params = {}

                if param_name == ParamEnum.ier.name:
                    self.d_params[ParamEnum.ier_i.name] = {
                        'value': self.params[ParamEnum.ier_i.name].value,
                        'dependent': False
                    }
                    self.d_params[ParamEnum.ier_e.name] = {
                        'value': self.params[ParamEnum.ier_e.name].value,
                        'dependent': False
                    }
                    dep1 = Parameter.get_dependents(
                        self.params[ParamEnum.ier_i.name],
                        self.params[ParamEnum.mode.name].value)
                    dep2 = Parameter.get_dependents(
                        self.params[ParamEnum.ier_e.name],
                        self.params[ParamEnum.mode.name].value)
                    dependents = dep1 + list(set(dep2) - set(dep1))
                else:
                    self.d_params[param_name] = {
                        'value': self.params[param_name].value,
                        'dependent': False
                    }
                    dependents = Parameter.get_dependents(
                        self.params[param_name],
                        self.params[ParamEnum.mode.name].value)

                for dep in dependents:
                    self.d_params[dep] = {
                        'value': self.params[dep].value,
                        'dependent': True
                    }
                    frame_name = "frm_param_" + dep
                    f = self.findChild(QFrame, name=frame_name)
                    if f:
                        f.setStyleSheet(st.qss_frm_top + st.qss_lbl_yellow)

                self.setup_ui()
                self.update_ui()
                if param_name == ParamEnum.ier.name:
                    self.update_slider(
                        self.horizontalSlider,
                        self.d_params[ParamEnum.ier_i.name]['value'],
                        self.slider_value_changed)
                    self.update_slider(
                        self.horizontalSlider_2,
                        self.d_params[ParamEnum.ier_e.name]['value'],
                        self.slider_2_value_changed)
                else:
                    self.update_slider(self.horizontalSlider,
                                       self.d_params[param_name]['value'],
                                       self.slider_value_changed)
        elif frame.parent().objectName(
        ) == "frm_op_mode" and not self.uncommited_change:
            self.unselect_child_frames(frame.parent())
            frame.setFrameShadow(QFrame.Sunken)

    def unselect_child_frames(self, frame):
        for f in frame.findChildren(QFrame,
                                    options=QtCore.Qt.FindDirectChildrenOnly):
            if f.objectName().startswith('frm_param_'):
                f.setStyleSheet(st.qss_frm_top)

    def get_value_label(self, frame):
        for label in frame.findChildren(QLabel):
            if "value" in label.objectName():
                return label

    def slider_to_param_value(self, slider, param):
        val = slider.value() / SLIDER_MULTIPLIER
        return val - (val % param.value_step
                      )  # float(f"{val:{param.value_format}}")

    def param_to_slider_value(self, value):
        return value * SLIDER_MULTIPLIER
Ejemplo n.º 2
0
    def frame_pressed(self, frame: QFrame, event: QMouseEvent):
        if frame.parent().objectName() == "frm_values":
            if frame == self.selected_param_frame:  # Confirma el parámetro
                self.confirm_param()
                return
            elif not self.uncommited_change:
                self.unselect_child_frames(frame.parent())
                frame.setStyleSheet(st.qss_frm_selected)
                param_name = frame.objectName().replace("frm_param_", "")
                if param_name == "mode_dep_1":
                    if self.params['mode'].value == OpModEnum.vcv.value:
                        param_name = ParamEnum.tvm.name
                    elif self.params['mode'].value == OpModEnum.pcv.value:
                        param_name = ParamEnum.mp.name

                self.selected_param = param_name
                self.selected_param_frame = frame
                self.d_params = {}

                if param_name == ParamEnum.ier.name:
                    self.d_params[ParamEnum.ier_i.name] = {
                        'value': self.params[ParamEnum.ier_i.name].value,
                        'dependent': False
                    }
                    self.d_params[ParamEnum.ier_e.name] = {
                        'value': self.params[ParamEnum.ier_e.name].value,
                        'dependent': False
                    }
                    dep1 = Parameter.get_dependents(
                        self.params[ParamEnum.ier_i.name],
                        self.params[ParamEnum.mode.name].value)
                    dep2 = Parameter.get_dependents(
                        self.params[ParamEnum.ier_e.name],
                        self.params[ParamEnum.mode.name].value)
                    dependents = dep1 + list(set(dep2) - set(dep1))
                else:
                    self.d_params[param_name] = {
                        'value': self.params[param_name].value,
                        'dependent': False
                    }
                    dependents = Parameter.get_dependents(
                        self.params[param_name],
                        self.params[ParamEnum.mode.name].value)

                for dep in dependents:
                    self.d_params[dep] = {
                        'value': self.params[dep].value,
                        'dependent': True
                    }
                    frame_name = "frm_param_" + dep
                    f = self.findChild(QFrame, name=frame_name)
                    if f:
                        f.setStyleSheet(st.qss_frm_top + st.qss_lbl_yellow)

                self.setup_ui()
                self.update_ui()
                if param_name == ParamEnum.ier.name:
                    self.update_slider(
                        self.horizontalSlider,
                        self.d_params[ParamEnum.ier_i.name]['value'],
                        self.slider_value_changed)
                    self.update_slider(
                        self.horizontalSlider_2,
                        self.d_params[ParamEnum.ier_e.name]['value'],
                        self.slider_2_value_changed)
                else:
                    self.update_slider(self.horizontalSlider,
                                       self.d_params[param_name]['value'],
                                       self.slider_value_changed)
        elif frame.parent().objectName(
        ) == "frm_op_mode" and not self.uncommited_change:
            self.unselect_child_frames(frame.parent())
            frame.setFrameShadow(QFrame.Sunken)
Ejemplo n.º 3
0
 def mouseMoveEvent(self, event):
     if event.buttons() & QtCore.Qt.LeftButton:
         self.move(self.mapToParent(event.pos() - self._offset))
         QFrame.parent(self).repaint()