class MColorPaletteDialog(QtWidgets.QDialog): def __init__(self, init_color, parent=None): super(MColorPaletteDialog, self).__init__(parent) self.setWindowTitle("DAYU Color Palette") self.primary_color = QtGui.QColor(init_color) self.color_chart = MColorChart() self.choose_color_button = QtWidgets.QPushButton() self.choose_color_button.setFixedSize(QtCore.QSize(100, 30)) self.color_label = QtWidgets.QLabel() self.info_label = MLabel() self.info_label.setProperty("error", True) color_lay = QtWidgets.QHBoxLayout() color_lay.addWidget(MLabel("Primary Color:")) color_lay.addWidget(self.choose_color_button) color_lay.addWidget(self.color_label) color_lay.addWidget(self.info_label) color_lay.addStretch() dialog = QtWidgets.QColorDialog(self.primary_color, parent=self) dialog.setWindowFlags(QtCore.Qt.Widget) dialog.setOption(QtWidgets.QColorDialog.NoButtons) dialog.currentColorChanged.connect(self.slot_color_changed) setting_lay = QtWidgets.QVBoxLayout() setting_lay.addLayout(color_lay) setting_lay.addWidget(MDivider()) setting_lay.addWidget(dialog) main_lay = QtWidgets.QHBoxLayout() main_lay.addWidget(self.color_chart) main_lay.addLayout(setting_lay) self.setLayout(main_lay) self.update_color() @QtCore.Slot(QtGui.QColor) def slot_color_changed(self, color): self.primary_color = color light = self.primary_color.lightness() saturation = self.primary_color.saturation() self.info_label.setText("") if light <= 70: self.info_label.setText("亮度建议不低于70(现在 {})".format(light)) if saturation <= 70: self.info_label.setText("饱和度建议不低于70(现在 {})".format(saturation)) self.update_color() def update_color(self): self.choose_color_button.setStyleSheet( "border-radius: 0;border: none;border:1px solid gray;" "background-color:{};".format(self.primary_color.name())) self.color_label.setText(self.primary_color.name()) self.color_chart.set_colors([ utils.generate_color(self.primary_color, index + 1) for index in range(10) ])
class MSequenceFile(QWidget, MFieldMixin): ''' 这个类必须依赖 DayuPath props: path: six.string_types sequence: bool ''' sig_is_sequence_changed = Signal(bool) def __init__(self, size=None, parent=None): super(MSequenceFile, self).__init__(parent) self.sequence_obj = None size = size or dayu_theme.small self._file_label = MLineEdit() self._file_label.set_dayu_size(size) self._file_label.setReadOnly(True) self._is_sequence_check_box = MCheckBox(self.tr('Sequence')) self._is_sequence_check_box.toggled.connect( functools.partial(self.setProperty, 'sequence')) self._is_sequence_check_box.toggled.connect( self.sig_is_sequence_changed) self._info_label = MLabel().secondary() self._error_label = MLabel().secondary() self._error_label.setProperty('error', True) self._error_label.setMinimumWidth(100) self._error_label.set_elide_mode(Qt.ElideMiddle) seq_lay = QHBoxLayout() seq_lay.addWidget(self._is_sequence_check_box) seq_lay.addWidget(self._info_label) seq_lay.addWidget(self._error_label) seq_lay.setStretchFactor(self._is_sequence_check_box, 0) seq_lay.setStretchFactor(self._info_label, 0) seq_lay.setStretchFactor(self._error_label, 100) self._main_lay = QVBoxLayout() self._main_lay.setContentsMargins(0, 0, 0, 0) self._main_lay.addWidget(self._file_label) self._main_lay.addLayout(seq_lay) self.setLayout(self._main_lay) self.set_sequence(True) def _set_path(self, value): path = DayuPath(value) for seq_obj in path.scan(): self.sequence_obj = seq_obj self._update_info() def set_path(self, value): self.setProperty('path', value) def set_sequence(self, value): assert isinstance(value, bool) self.setProperty('sequence', value) def _set_sequence(self, value): if value != self._is_sequence_check_box.isChecked(): # 更新来自代码 self._is_sequence_check_box.setChecked(value) self.sig_is_sequence_changed.emit(value) self._update_info() def _update_info(self): self._file_label.setProperty( 'text', self.sequence_obj if self.property('sequence') else self.property('path')) if self.sequence_obj: self._info_label.setText(u'Format: {ext} ' u'Total: {count} ' u'Range: {start}-{end}'.format( ext=self.sequence_obj.ext, count=len(self.sequence_obj.frames), start=self.sequence_obj.frames[0] if self.sequence_obj.frames else '/', end=self.sequence_obj.frames[-1] if self.sequence_obj.frames else '/')) error_info = u'Missing: {}'.format( self.sequence_obj.missing) if self.sequence_obj.missing else '' self._error_label.setText(error_info) self._error_label.setToolTip(error_info) self._info_label.setVisible(self.property('sequence')) self._error_label.setVisible(self.property('sequence'))