Example #1
0
def get_widget_from_ranking(ranking):
    assert isinstance(ranking, RankingItem)
    qual = ranking.qual.name
    qual_checkbox = QCheckBox(ranking.qual.get_title())
    qual_checkbox.setFixedWidth(50)
    qual_checkbox.setObjectName(qual + '_checkbox')

    type_combo = AdvComboBox()
    type_combo.addItems({_('Rank'), _('Max place'), _('Result time')})
    type_combo.setFixedWidth(150)
    type_combo.setObjectName(qual + '_combo')

    max_place = QSpinBox()
    max_place.setValue(0)
    max_place.setFixedWidth(70)
    max_place.setObjectName(qual + '_place')

    max_time = QTimeEdit()
    max_time.setFixedWidth(70)
    max_time.setDisplayFormat("hh:mm:ss")
    max_time.setObjectName(qual + '_time')

    def select_type():
        text = type_combo.currentText()
        max_place.setVisible(text == _('Max place'))
        max_time.setVisible(text == _('Result time'))

    def set_enabled():
        flag = qual_checkbox.isChecked()
        type_combo.setEnabled(flag)
        max_place.setEnabled(flag)
        max_time.setEnabled(flag)

    type_combo.currentIndexChanged.connect(select_type)
    qual_checkbox.stateChanged.connect(set_enabled)

    if ranking.use_scores:
        type_combo.setCurrentText(_('Rank'))
    elif ranking.max_place:
        type_combo.setCurrentText(_('Max place'))
        max_place.setValue(ranking.max_place)
    else:
        type_combo.setCurrentText(_('Result time'))
        max_time.setTime(time_to_qtime(ranking.max_time))

    qual_checkbox.setChecked(ranking.is_active)
    select_type()
    set_enabled()

    layout = QHBoxLayout()
    layout.addWidget(qual_checkbox)
    layout.addWidget(type_combo)
    layout.addWidget(max_place)
    layout.addWidget(max_time)
    return layout
Example #2
0
class VCTimeCounter(QWidget):
    timeChanged = pyqtSignal(QTime)

    def __init__(self, parent=None):
        super(VCTimeCounter, self).__init__(parent)
        self.parent = parent
        self.timeedit = QTimeEdit(QTime(0, 0))
        self.timeedit.setObjectName('timeCounter')
        self.timeedit.setStyle(QStyleFactory.create('Fusion'))
        self.timeedit.setFrame(False)
        self.timeedit.setDisplayFormat('hh:mm:ss.zzz')
        self.timeedit.timeChanged.connect(self.timeChangeHandler)
        separator = QLabel('/')
        separator.setObjectName('timeSeparator')
        self.duration = QLabel('00:00:00.000')
        self.duration.setObjectName('timeDuration')
        layout = QHBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(5)
        layout.addWidget(self.timeedit)
        layout.addWidget(separator)
        layout.addWidget(self.duration)
        self.setLayout(layout)

    def setRange(self, minval: str, maxval: str) -> None:
        self.timeedit.setTimeRange(QTime.fromString(minval, 'hh:mm:ss.zzz'),
                                   QTime.fromString(maxval, 'hh:mm:ss.zzz'))

    def setMinimum(self, val: str = None) -> None:
        if val is None:
            self.timeedit.setMinimumTime(QTime(0, 0))
        else:
            self.timeedit.setMinimumTime(QTime.fromString(val, 'hh:mm:ss.zzz'))

    def setMaximum(self, val: str) -> None:
        self.timeedit.setMaximumTime(QTime.fromString(val, 'hh:mm:ss.zzz'))

    def setTime(self, time: str) -> None:
        self.timeedit.setTime(QTime.fromString(time, 'hh:mm:ss.zzz'))

    def setDuration(self, time: str) -> None:
        self.duration.setText(time)
        self.setMaximum(time)

    def clearFocus(self) -> None:
        self.timeedit.clearFocus()

    def hasFocus(self) -> bool:
        if self.timeedit.hasFocus():
            return True
        return super(VCTimeCounter, self).hasFocus()

    def reset(self) -> None:
        self.timeedit.setTime(QTime(0, 0))
        self.setDuration('00:00:00.000')

    def setReadOnly(self, readonly: bool) -> None:
        self.timeedit.setReadOnly(readonly)
        if readonly:
            self.timeedit.setButtonSymbols(QAbstractSpinBox.NoButtons)
        else:
            self.timeedit.setButtonSymbols(QAbstractSpinBox.UpDownArrows)

    @pyqtSlot(QTime)
    def timeChangeHandler(self, newtime: QTime) -> None:
        if self.timeedit.hasFocus():
            self.timeChanged.emit(newtime)
Example #3
0
class TimeItem(QListWidgetItem):
    def __init__(self, parent=None, *args, **kwargs):
        super().__init__(parent)
        self.parent = parent

    def setupUi(self, *args, **kwargs):
        self.widget = QWidget()
        try:
            self.setSizeHint(QSize(self.parent.width() - 20, 40))
            self.widget.setGeometry(
                QtCore.QRect(0, 0,
                             self.parent.width() - 20, 40))
        except Exception as e:
            logging.warning(e)
            self.setSizeHint(QSize(80, 60))
        self.widget.setObjectName("Form")
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.widget)
        self.horizontalLayoutWidget.setGeometry(
            QtCore.QRect(10, 0,
                         self.widget.width() - 10, self.widget.height()))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(
            self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.radioButton = QtWidgets.QRadioButton(self.horizontalLayoutWidget)
        self.radioButton.setObjectName("radioButton")
        self.radioButton.setText('禁用')
        self.horizontalLayout.addWidget(self.radioButton)
        self.lineEdit = QtWidgets.QLineEdit(self.horizontalLayoutWidget)
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit.setText('abc')
        self.horizontalLayout.addWidget(self.lineEdit)
        self.comboBox = QtWidgets.QComboBox(self.horizontalLayoutWidget)
        self.comboBox.setObjectName("comboBox")
        self.comboBoxSel = {'间隔': "interval", '周期': 'cron', '仅一次': 'date'}
        for sel in self.comboBoxSel:
            self.comboBox.addItem(sel)
        self.horizontalLayout.addWidget(self.comboBox)
        self.timeEdit = QTimeEdit(self.horizontalLayoutWidget)
        self.timeEdit.setObjectName("timeEdit")
        self.timeEdit.setDisplayFormat('hh:mm:ss')
        self.horizontalLayout.addWidget(self.timeEdit)
        QtCore.QMetaObject.connectSlotsByName(self.widget)
        # 设置配置
        try:
            self.set_data(info=kwargs['info'])
        except Exception as e:
            self.set_data(info=None)
        # 设置交互
        self.set_connect()
        return self.widget

    def set_data(self, *args, **kwargs):
        if 'info' in kwargs.keys() and kwargs['info']:
            self.info = kwargs['info']
        else:
            self.info = {
                "id": "luck",
                "trigger": "interval",
                "time": 3600,
                "is_action": False,
                "mission_name": 'new mission'
            }
        self.set_ui()

    def set_ui(self):
        try:
            self.radioButton.setChecked(self.info['is_action'])
            self.radio_check()
            self.lineEdit.setText(self.info['mission_name'])
            index = list(self.comboBoxSel.values()).index(self.info['trigger'])
            self.comboBox.setCurrentIndex(index)
            # to do
            if 'interval' == self.info['trigger']:
                self.timeEdit.setTime(QTime(0, 0).addSecs(self.info['time']))
            elif 'date' == self.info['trigger']:
                logging.warning('暂不支持 date 设置')
            elif 'cron' == self.info['trigger']:
                logging.warning('暂不支持 cron 设置')

        except Exception as e:
            logging.warning(e)

    def update_info(self) -> bool:
        flag = False
        if 'luck' == self.info['id']:
            self.info['id'] = cryptograph_text(str(int(time.time())))
        index = self.comboBox.currentIndex()
        self.info['trigger'] = list(self.comboBoxSel.values())[index]
        self.info['is_action'] = self.radioButton.isChecked()
        self.info['mission_name'] = self.lineEdit.text()
        aps_time = self.timeEdit.time()
        self.info['time'] = aps_time.hour() * 3600 + aps_time.minute(
        ) * 60 + aps_time.second()
        # 新任务无sign
        if 'sign' not in self.info.keys():
            self.info['createtime'] = get_full_datetime()
            self.info['sign'] = cryptograph_text(
                json.dumps(self.info, ensure_ascii=False))
            flag = True
        # 旧任务重新校验
        else:
            sign = self.info.pop('sign')
            if sign != cryptograph_text(
                    json.dumps(self.info, ensure_ascii=False)):
                self.info['sign'] = cryptograph_text(
                    json.dumps(self.info, ensure_ascii=False))
                flag = True
            else:
                self.info['sign'] = sign
        return flag

    def set_connect(self):
        self.radioButton.clicked.connect(self.radio_check)

    def radio_check(self):
        if self.radioButton.isChecked():
            self.radioButton.setStyleSheet('QRadioButton{color:green}')
            self.radioButton.setText('启用')
        else:
            self.radioButton.setStyleSheet('QRadioButton{color:red}')
            self.radioButton.setText('禁用')