Example #1
0
class SettingsWindow(QWidget):
    def eventFilter(self, object, event):
        if event.type() == QEvent.FocusIn:
            self.customspeedRB.setChecked(True)
        return super(SettingsWindow, self).eventFilter(object, event)

    def setupUi(self, Form, host='192.168.2.171'):
        Form.resize(250, 900)
        Form.setStyleSheet('font: 10pt \"Tahoma\";')
        self.host = host
        self.downtimechecked = 0
        self.default = defaultsettings
        self.defaultcutbacks = defaultcutbacksettings

        db = connector.connect(host=self.host,
                               user="******",
                               passwd="Sequal1234",
                               database="simulation",
                               use_pure=True)
        buttonSS = "QPushButton {\n" \
            "    background-color: ;\n" \
            "    background-color: qlineargradient(spread:pad, x1:0, y1:0, " \
            "x2:1, y2:1, stop:0 rgba(0, 115, 119, 255), stop:1 rgb(4, 147, " \
            "131));\n" \
            "    color: white;\n" \
            "    height: 25px;\n" \
            "    border: None;\n" \
            "    border-radius: 2px;\n" \
            "    \n" \
            "    font: 11pt \"Tahoma\";\n" \
            "    width: "

        self.mainlayout = QVBoxLayout(Form)
        hlayout = QHBoxLayout()
        self.titlelabel = QLabel(Form)
        self.titlelabel.setStyleSheet(
            'font: 12pt \"Tahoma\"; font-weight: bold;')
        hlayout.addWidget(self.titlelabel)
        hspacer = QSpacerItem(40, 25, QSizePolicy.Expanding,
                              QSizePolicy.Minimum)
        hlayout.addItem(hspacer)
        self.resetbutton = QPushButton(Form)
        self.resetbutton.setStyleSheet(buttonSS + "140px;}")
        self.resetbutton.setCursor(QCursor(Qt.PointingHandCursor))
        hlayout.addWidget(self.resetbutton)
        self.mainlayout.addLayout(hlayout)
        self.hlayout = QVBoxLayout()

        # ################ #
        # GENERAL SETTINGS #
        # ################ #
        self.generalGB = QGroupBox(Form)
        self.generalGB.setStyleSheet('QGroupBox {font: 11pt \"Tahoma\";}')
        self.hlayout2 = QVBoxLayout(self.generalGB)
        self.hlayout2.setSpacing(15)

        self.gridlayout = QGridLayout()
        self.gridlayout.setHorizontalSpacing(2)
        self.loggaplabel = QLabel(self.generalGB)
        self.gridlayout.addWidget(self.loggaplabel, 0, 0, 1, 1)
        self.loggapTB = QDoubleSpinBox(self.generalGB)
        self.loggapTB.setButtonSymbols(QAbstractSpinBox.NoButtons)
        self.loggapTB.setSingleStep(0.1)
        self.loggapTB.setMinimum(0.3)
        self.loggapTB.setStyleSheet(
            'QDoubleSpinBox::disabled {color: rgb(200, 200, 200);}')
        self.gridlayout.addWidget(self.loggapTB, 0, 1, 1, 1)
        self.loggapAuto = QCheckBox(self.generalGB)
        self.gridlayout.addWidget(self.loggapAuto, 0, 2, 1, 1)
        self.numbinslabel = QLabel(self.generalGB)
        self.gridlayout.addWidget(self.numbinslabel, 1, 0, 1, 1)
        self.numbinsTB = QSpinBox(self.generalGB)
        self.numbinsTB.setMinimum(1)
        self.numbinsTB.setMaximum(40)
        self.gridlayout.addWidget(self.numbinsTB, 1, 1, 1, 1)
        vspacer = QSpacerItem(20, 40, QSizePolicy.Minimum,
                              QSizePolicy.Expanding)
        self.gridlayout.addItem(vspacer, 2, 0, 1, 1)

        self.hlayout2.addLayout(self.gridlayout)
        # hspacer = QSpacerItem(
        #     20, 40, QSizePolicy.Expanding, QSizePolicy.Minimum)
        # self.hlayout2.addItem(hspacer)

        # Line speed group box
        self.linespeedGB = QGroupBox(self.generalGB)
        self.linespeedGB.setStyleSheet('QGroupBox {font: 11pt \"Tahoma\";}')
        vlayout = QVBoxLayout(self.linespeedGB)
        self.highspeedRB = QRadioButton(self.linespeedGB)
        vlayout.addWidget(self.highspeedRB)
        self.lowspeedRB = QRadioButton(self.linespeedGB)
        vlayout.addWidget(self.lowspeedRB)
        self.autospeedRB = QRadioButton(self.linespeedGB)
        vlayout.addWidget(self.autospeedRB)
        hlayout = QHBoxLayout()
        hlayout.setSpacing(0)
        self.customspeedRB = QRadioButton(self.linespeedGB)
        self.customspeedRB.setMinimumWidth(17)
        self.customspeedRB.setMaximumWidth(17)
        hlayout.addWidget(self.customspeedRB)
        self.customspeedTB = QDoubleSpinBox(self.linespeedGB)
        self.customspeedTB.setButtonSymbols(QAbstractSpinBox.NoButtons)
        self.customspeedTB.setDecimals(1)
        self.customspeedTB.setMaximum(200)
        self.customspeedTB.installEventFilter(self)
        hlayout.addWidget(self.customspeedTB)
        vlayout.addLayout(hlayout)
        vspacer = QSpacerItem(20, 40, QSizePolicy.Minimum,
                              QSizePolicy.Expanding)
        vlayout.addItem(vspacer)
        self.hlayout2.addWidget(self.linespeedGB)
        self.hlayout.addWidget(self.generalGB)

        # ################# #
        # DOWNTIME SETTINGS #
        # ################# #
        self.downtimeGB = QGroupBox(Form)
        self.downtimeGB.setStyleSheet('QGroupBox {font: 11pt \"Tahoma\";}')
        gridlayout = QGridLayout(self.downtimeGB)
        self.downtimeCBall = QCheckBox(self.downtimeGB)
        gridlayout.addWidget(self.downtimeCBall, 0, 0, 1, 1)
        self.downtimeCBtexts = list(
            read_sql('SELECT * From DowntimeSettings Where SimID = -1;',
                     db).head())[1:]
        self.downtimeCBs = []
        for i in range(len(self.downtimeCBtexts)):
            self.downtimeCBs.append(QCheckBox(self.downtimeGB))
            row = int(i / 2)
            col = i % 2
            gridlayout.addWidget(self.downtimeCBs[i], row + 1, col, 1, 1)
        vspacer = QSpacerItem(20, 40, QSizePolicy.Minimum,
                              QSizePolicy.Expanding)
        gridlayout.addItem(vspacer, row + 1, 0, 1, 1)
        self.hlayout.addWidget(self.downtimeGB)

        # ################ #
        # CUTBACK SETTINGS #
        # ################ #
        self.cutbackGB = QGroupBox(Form)
        self.cutbackGB.setStyleSheet('QGroupBox {font: 11pt \"Tahoma\";}')
        gridlayout = QGridLayout(self.cutbackGB)
        self.cutbackCBtexts = list(
            read_sql('SELECT * From CutbackSettings Where SimID = -1;',
                     db).head())[1:]
        self.cutbackCBs = []
        for i in range(len(self.cutbackCBtexts)):
            self.cutbackCBs.append(QCheckBox(self.cutbackGB))
            row = int(i / 2)
            col = i % 2
            gridlayout.addWidget(self.cutbackCBs[i], row, col, 1, 1)
        vspacer = QSpacerItem(20, 40, QSizePolicy.Minimum,
                              QSizePolicy.Expanding)
        gridlayout.addItem(vspacer, row + 1, 0, 1, 1)
        self.hlayout.addWidget(self.cutbackGB)

        self.mainlayout.addLayout(self.hlayout)
        self.buttonbox = QDialogButtonBox(Form)
        self.buttonbox.setStandardButtons(QDialogButtonBox.Cancel
                                          | QDialogButtonBox.Ok)
        self.buttonbox.setStyleSheet("QDialogButtonBox " + buttonSS + "70px;}")
        for w in self.buttonbox.children():
            if w.metaObject().className() == "QPushButton":
                w.setCursor(QCursor(Qt.PointingHandCursor))
        self.mainlayout.addWidget(self.buttonbox)
        vspacer = QSpacerItem(20, 40, QSizePolicy.Minimum,
                              QSizePolicy.Expanding)
        self.mainlayout.addItem(vspacer)
        self.retranslateUi(Form)

        self.SetDefaultSettings()

        # ####### #
        # SIGNALS #
        # ####### #
        self.resetbutton.clicked.connect(self.SetDefaultSettings)
        self.loggapAuto.stateChanged.connect(self.onLogGapAuto)
        self.downtimeCBall.stateChanged.connect(self.onDowntimeAll)
        for cb in self.downtimeCBs:
            cb.stateChanged.connect(self.onDowntimeCB)
        for cb in self.cutbackCBs:
            cb.stateChanged.connect(self.onCutbackCB)
        self.numbinsTB.valueChanged.connect(self.showResetButton)
        self.loggapTB.valueChanged.connect(self.showResetButton)
        if defaultsettings[3] == 55.0:
            self.highspeedRB.toggled.connect(self.showResetButton)
        elif defaultsettings[3] == 35.0:
            self.lowspeedRB.toggled.connect(self.showResetButton)
        else:
            self.autospeedRB.toggled.connect(self.showResetButton)

    def SetDefaultSettings(self):
        if defaultsettings[3] == 55.0:
            self.highspeedRB.setChecked(True)
        elif defaultsettings[3] == 35.0:
            self.lowspeedRB.setChecked(True)
        else:
            self.autospeedRB.setChecked(True)
        if defaultsettings[0] > 0:
            self.loggapTB.setValue(defaultsettings[0])
            self.loggapAuto.setChecked(False)
        else:
            self.loggapAuto.setChecked(True)
        self.numbinsTB.setValue(defaultsettings[2])
        self.downtimeCBall.setChecked(Qt.Checked)
        self.downtimechecked = 4
        for cb in self.downtimeCBs:
            cb.setChecked(True)
        for cb in self.cutbackCBs:
            cb.setChecked(False)
        for cb in self.defaultcutbacks:
            self.cutbackCBs[self.cutbackCBtexts.index(cb)].setChecked(True)
        self.resetbutton.setVisible(False)

    def onCutbackCB(self, state):
        self.showResetButton()

    def onDowntimeAll(self, state):
        self.showResetButton()
        if state == Qt.Unchecked:
            for cb in self.downtimeCBs:
                cb.setChecked(False)
        elif state == Qt.Checked:
            for cb in self.downtimeCBs:
                cb.setChecked(True)
        elif state == Qt.PartiallyChecked and self.downtimechecked == 0:
            for cb in self.downtimeCBs:
                cb.setChecked(True)

    def onDowntimeCB(self, state):
        self.showResetButton()
        if state == Qt.Checked:
            self.downtimechecked += 1
        else:
            self.downtimechecked -= 1

        if self.downtimechecked == len(self.downtimeCBs):
            self.downtimeCBall.setCheckState(Qt.Checked)
        elif self.downtimechecked == 0:
            self.downtimeCBall.setCheckState(Qt.Unchecked)
        else:
            self.downtimeCBall.setCheckState(Qt.PartiallyChecked)

    def onLogGapAuto(self, state):
        self.showResetButton()
        self.loggapTB.setDisabled(state)

    def showResetButton(self):
        self.resetbutton.setVisible(True)

    def setupReadOnly(self):
        self.highspeedRB.setDisabled(True)
        self.lowspeedRB.setDisabled(True)
        self.autospeedRB.setDisabled(True)
        self.customspeedRB.setDisabled(True)
        self.customspeedTB.setDisabled(True)
        self.loggapAuto.setDisabled(True)
        self.loggapTB.setDisabled(True)
        self.loggapTB.setStyleSheet('')
        self.numbinsTB.setDisabled(True)
        for cb in self.downtimeCBs:
            cb.setDisabled(True)
        self.downtimeCBall.setDisabled(True)
        for cb in self.cutbackCBs:
            cb.setDisabled(True)
        self.resetbutton.setVisible(False)

    def retranslateUi(self, Form):
        _translate = QCoreApplication.translate
        self.titlelabel.setText(_translate('Form', 'Settings'))
        self.resetbutton.setText(_translate('Form', 'Reset to Default'))
        self.generalGB.setTitle(_translate('Form', 'General'))
        self.linespeedGB.setTitle(_translate('Form', 'Line Speed'))
        self.highspeedRB.setText(_translate('Form', '55 m/min'))
        self.lowspeedRB.setText(_translate('Form', '35 m/min'))
        self.autospeedRB.setText(_translate('Form', 'Auto'))
        self.customspeedRB.setText('')
        self.customspeedTB.setSuffix(_translate('Form', ' m/min'))
        self.loggaplabel.setText(_translate('Form', 'Log Gap: '))
        self.loggapTB.setValue(defaultsettings[0])
        self.loggapTB.setSuffix(_translate('Form', ' m'))
        self.loggapAuto.setText(_translate('Form', 'Auto'))
        self.numbinslabel.setText(_translate('Form', 'Number\nof Bins: '))
        self.downtimeGB.setTitle(_translate('Form', 'Simulated Downtime'))
        for i in range(len(self.downtimeCBtexts)):
            self.downtimeCBs[i].setText(
                _translate('Form', self.downtimeCBtexts[i]))
        self.downtimeCBall.setText(_translate('Form', 'All'))
        self.cutbackGB.setTitle(_translate('Form', 'Cutbacks'))
        for i in range(len(self.cutbackCBtexts)):
            self.cutbackCBs[i].setText(
                _translate('Form', self.cutbackCBtexts[i]))
Example #2
0
class ScopeGroupBox(QGroupBox):
    """Define QGroupBox for icon scope."""

    dataModified = pyqtSignal()

    def __init__(self, name='', options=list(), scope='all', parent=None):
        """Init lineedit."""
        super().__init__(name, parent)
        layout = QFormLayout()
        self.bt_dynamic = QRadioButton(_("Dynamic:"))
        self.bt_dynamic.toggled.connect(lambda: self.btnstate('dynamic'))
        self.bt_dynamic.setMinimumWidth(120)
        self.scope_box = QComboBox()
        found = False
        idx = 0
        for key, item in options.items():
            self.scope_box.addItem(item, key)
            if key == scope:
                self.scope_box.setCurrentIndex(idx)
                self.bt_dynamic.setChecked(True)
                found = True
            idx = idx + 1
        layout.addRow(self.bt_dynamic, self.scope_box)

        self.bt_static = QRadioButton(_("Static:"))
        self.bt_static.toggled.connect(lambda: self.btnstate('static'))
        self.bt_static.setMinimumWidth(120)

        container = QHBoxLayout()
        self.label1 = QLabel(_('From'))
        container.addWidget(self.label1)
        self.cb_lower = QComboBox()
        for set_idx in range(0, scctool.settings.max_no_sets):
            self.cb_lower.addItem(_('Map {}').format(set_idx + 1), set_idx)
        self.cb_lower.currentIndexChanged.connect(self.adjustRangeUpper)
        container.addWidget(self.cb_lower, 0)
        self.label2 = QLabel(_('to'))
        self.label2.setAlignment(Qt.AlignCenter)
        container.addWidget(self.label2, 0)
        self.cb_upper = QComboBox()
        for set_idx in range(0, scctool.settings.max_no_sets):
            self.cb_upper.addItem(_('Map {}').format(set_idx + 1), set_idx)
        container.addWidget(self.cb_upper, 0)
        layout.addRow(self.bt_static, container)

        if not found:
            m = re.match(r'^(\d+)-(\d+)$', scope)
            if m and int(m.group(1)) <= int(m.group(2)):
                self.bt_static.setChecked(True)
                self.cb_upper.setCurrentIndex(int(m.group(2)) - 1)
                self.cb_lower.setCurrentIndex(int(m.group(1)) - 1)

        self.setLayout(layout)

        self.btnstate('dynamic')
        self.btnstate('static')

        self.bt_dynamic.toggled.connect(self.triggerSignal)
        self.bt_static.toggled.connect(self.triggerSignal)
        self.cb_upper.currentIndexChanged.connect(self.triggerSignal)
        self.cb_lower.currentIndexChanged.connect(self.triggerSignal)
        self.scope_box.currentIndexChanged.connect(self.triggerSignal)

    def btnstate(self, b):
        if b == 'dynamic':
            self.scope_box.setEnabled(self.bt_dynamic.isChecked())
        elif b == 'static':
            self.cb_lower.setEnabled(self.bt_static.isChecked())
            self.cb_upper.setEnabled(self.bt_static.isChecked())
            self.label1.setEnabled(self.bt_static.isChecked())
            self.label2.setEnabled(self.bt_static.isChecked())

    def adjustRangeUpper(self, lower):
        current_idx = self.cb_upper.itemData(self.cb_upper.currentIndex())
        self.cb_upper.clear()
        rg = range(lower, scctool.settings.max_no_sets)
        if current_idx not in rg:
            current_idx = lower
        idx = 0
        for set_idx in rg:
            self.cb_upper.addItem(_('Map {}').format(set_idx + 1), set_idx)
            if set_idx == current_idx:
                self.cb_upper.setCurrentIndex(idx)
            idx = idx + 1

    def getScope(self):
        if self.bt_dynamic.isChecked():
            return self.scope_box.itemData(self.scope_box.currentIndex())
        else:
            lower = int(self.cb_lower.itemData(
                self.cb_lower.currentIndex())) + 1
            upper = int(self.cb_upper.itemData(
                self.cb_upper.currentIndex())) + 1
            return '{}-{}'.format(lower, upper)

    def triggerSignal(self):
        self.dataModified.emit()