예제 #1
0
def test_label_elide_mode(qtbot, text, elide):
    """Test MLabel elide mode"""
    main_widget = QWidget()
    main_widget.setGeometry(0, 0, 30, 200)
    main_lay = QVBoxLayout()
    main_widget.setLayout(main_lay)

    label_left = MLabel()
    label_left.set_elide_mode(Qt.ElideLeft)
    label_left.setText(text)
    label_right = MLabel()
    label_right.set_elide_mode(Qt.ElideRight)
    label_right.setText(text)
    label_center = MLabel(text)
    label_center.set_elide_mode(Qt.ElideMiddle)
    label_center.setText(text)

    main_lay.addWidget(label_left)
    main_lay.addWidget(label_right)
    main_lay.addWidget(label_center)

    qtbot.addWidget(main_widget)

    main_widget.show()
    ellipsis = u'…'
    if elide:
        assert label_left.property('text').startswith(ellipsis)
        assert label_right.property('text').endswith(ellipsis)
        center_text = label_center.property('text')
        assert center_text.count(ellipsis) \
               and not center_text.endswith(ellipsis)
    else:
        assert label_left.property('text') == label_left.text()
        assert label_right.property('text') == label_right.text()
        assert label_center.property('text') == label_center.text()
    assert label_left.get_elide_mode() == Qt.ElideLeft
    assert label_right.get_elide_mode() == Qt.ElideRight
    assert label_center.get_elide_mode() == Qt.ElideMiddle
예제 #2
0
class MSequenceFile(QWidget, MFieldMixin):
    '''
    这个类必须依赖 DayuPath
    props:
        path: basestring
        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'))
예제 #3
0
파일: card.py 프로젝트: muyr/dayu_widgets3
class MMeta(QWidget):
    def __init__(self,
                 cover=None,
                 avatar=None,
                 title=None,
                 description=None,
                 extra=False,
                 parent=None):
        super(MMeta, self).__init__(parent)
        self.setAttribute(Qt.WA_StyledBackground)
        self._cover_label = QLabel()
        self._avatar = MAvatar()
        self._title_label = MLabel().h4()
        self._description_label = MLabel().secondary()
        self._description_label.setWordWrap(True)
        self._description_label.set_elide_mode(Qt.ElideRight)
        self._title_layout = QHBoxLayout()
        self._title_layout.addWidget(self._title_label)
        self._title_layout.addStretch()
        self._extra_button = MToolButton(
            parent=self).icon_only().svg('more.svg')
        self._title_layout.addWidget(self._extra_button)
        self._extra_button.setVisible(extra)

        content_lay = QFormLayout()
        content_lay.setContentsMargins(5, 5, 5, 5)
        content_lay.addRow(self._avatar, self._title_layout)
        content_lay.addRow(self._description_label)

        self._button_layout = QHBoxLayout()

        main_lay = QVBoxLayout()
        main_lay.setSpacing(0)
        main_lay.setContentsMargins(1, 1, 1, 1)
        main_lay.addWidget(self._cover_label)
        main_lay.addLayout(content_lay)
        main_lay.addLayout(self._button_layout)
        main_lay.addStretch()
        self.setLayout(main_lay)
        self._cover_label.setFixedSize(QSize(200, 200))
        # self.setFixedWidth(200)

    def get_more_button(self):
        return self._extra_button

    def setup_data(self, data_dict):
        if data_dict.get('title'):
            self._title_label.setText(data_dict.get('title'))
            self._title_label.setVisible(True)
        else:
            self._title_label.setVisible(False)

        if data_dict.get('description'):
            self._description_label.setText(data_dict.get('description'))
            self._description_label.setVisible(True)
        else:
            self._description_label.setVisible(False)

        if data_dict.get('avatar'):
            self._avatar.set_dayu_image(data_dict.get('avatar'))
            self._avatar.setVisible(True)
        else:
            self._avatar.setVisible(False)

        if data_dict.get('cover'):
            fixed_height = self._cover_label.width()
            self._cover_label.setPixmap(
                data_dict.get('cover').scaledToWidth(fixed_height,
                                                     Qt.SmoothTransformation))
            self._cover_label.setVisible(True)
        else:
            self._cover_label.setVisible(False)
예제 #4
0
    def _init_ui(self):
        title_lay = QGridLayout()
        title_lay.addWidget(MLabel(u'一级标题').h1(), 0, 0)
        title_lay.addWidget(MLabel(u'二级标题').h2(), 1, 0)
        title_lay.addWidget(MLabel(u'三级标题').h3(), 2, 0)
        title_lay.addWidget(MLabel(u'四级标题').h4(), 3, 0)
        title_lay.addWidget(MLabel('h1 Level').h1(), 0, 1)
        title_lay.addWidget(MLabel('h2 Level').h2(), 1, 1)
        title_lay.addWidget(MLabel('h3 Level').h3(), 2, 1)
        title_lay.addWidget(MLabel('h4 Level').h4(), 3, 1)

        text_type_lay = QHBoxLayout()
        text_type_lay.addWidget(MLabel('MLabel: Normal'))
        text_type_lay.addWidget(MLabel('MLabel: Secondary').secondary())
        text_type_lay.addWidget(MLabel('MLabel: Warning').warning())
        text_type_lay.addWidget(MLabel('MLabel: Danger').danger())
        disable_text = MLabel('MLabel: Disabled')
        disable_text.setEnabled(False)
        text_type_lay.addWidget(disable_text)

        text_attr_lay = QHBoxLayout()
        text_attr_lay.addWidget(MLabel('MLabel: Mark').mark())
        text_attr_lay.addWidget(MLabel('MLabel: Code').code())
        text_attr_lay.addWidget(MLabel('MLabel: Underline').underline())
        text_attr_lay.addWidget(MLabel('MLabel: Delete').delete())
        text_attr_lay.addWidget(MLabel('MLabel: Strong').strong())

        text_mix_lay = QHBoxLayout()
        text_mix_lay.addWidget(MLabel('MLabel: Strong & Underline').strong().underline())
        text_mix_lay.addWidget(MLabel('MLabel: Danger & Delete').danger().delete())
        text_mix_lay.addWidget(MLabel('MLabel: Warning & Strong').warning().strong())
        text_mix_lay.addWidget(MLabel('MLabel: H4 & Mark').h4().mark())

        data_bind_lay = QHBoxLayout()
        data_bind_label = MLabel()
        button = MPushButton(text='Random An Animal').primary()
        button.clicked.connect(self.slot_change_text)
        data_bind_lay.addWidget(data_bind_label)
        data_bind_lay.addWidget(button)
        data_bind_lay.addStretch()
        self.register_field('show_text', 'Guess')
        self.bind('show_text', data_bind_label, 'text')

        lay_elide = QVBoxLayout()
        label_none = MLabel('This is a elide NONE mode label. '
                            'Ellipsis should NOT appear in the text.')
        label_left = MLabel(
            'This is a elide LEFT mode label. '
            'The ellipsis should appear at the beginning of the text. '
            'xiao mao xiao gou xiao ci wei')
        label_left.set_elide_mode(Qt.ElideLeft)
        label_middle = MLabel(
            'This is a elide MIDDLE mode label. '
            'The ellipsis should appear in the middle of the text. '
            'xiao mao xiao gou xiao ci wei')
        label_middle.set_elide_mode(Qt.ElideMiddle)
        label_right = MLabel()
        label_right.setText('This is a elide RIGHT mode label. '
            'The ellipsis should appear at the end of the text. '
            'Some text to fill the line bala bala bala.')
        label_right.set_elide_mode(Qt.ElideRight)
        lay_elide.addWidget(label_none)
        lay_elide.addWidget(label_left)
        lay_elide.addWidget(label_middle)
        lay_elide.addWidget(label_right)

        main_lay = QVBoxLayout()
        main_lay.addWidget(MDivider('different level'))
        main_lay.addLayout(title_lay)
        main_lay.addWidget(MDivider('different type'))
        main_lay.addLayout(text_type_lay)
        main_lay.addWidget(MDivider('different property'))
        main_lay.addLayout(text_attr_lay)
        main_lay.addWidget(MDivider('mix'))
        main_lay.addLayout(text_mix_lay)

        # main_lay.addWidget(MDivider('data bind'))
        # main_lay.addLayout(data_bind_lay)
        main_lay.addWidget(MDivider('elide mode'))
        main_lay.addLayout(lay_elide)
        main_lay.addStretch()
        self.setLayout(main_lay)
예제 #5
0
    def _init_ui(self):
        browser_1 = MClickBrowserFilePushButton(
            text='Browser File PushButton').primary()
        browser_2 = MClickBrowserFolderPushButton(
            text='Browser Folder PushButton')
        browser_2.setIcon(MIcon('upload_line.svg'))
        browser_3 = MClickBrowserFilePushButton(text='Browser Multi Files',
                                                multiple=True).primary()
        lay_1 = QHBoxLayout()
        lay_1.addWidget(browser_1)
        lay_1.addWidget(browser_2)
        lay_1.addWidget(browser_3)

        browser_4 = MClickBrowserFileToolButton().huge()
        label_4 = MLabel()
        label_4.set_elide_mode(Qt.ElideMiddle)
        browser_4.sig_file_changed.connect(label_4.setText)

        browser_5 = MClickBrowserFolderToolButton().huge()
        label_5 = MLabel()
        label_5.set_elide_mode(Qt.ElideMiddle)
        browser_5.sig_folder_changed.connect(label_5.setText)

        lay_2 = QHBoxLayout()
        lay_2.addWidget(label_4)
        lay_2.addWidget(browser_4)
        lay_2.addWidget(label_5)
        lay_2.addWidget(browser_5)

        browser_6 = MDragFileButton(text='Click or drag file here')
        browser_6.set_dayu_svg('attachment_line.svg')
        label_6 = MLabel()
        label_6.set_elide_mode(Qt.ElideMiddle)
        browser_6.sig_file_changed.connect(label_6.setText)

        browser_7 = MDragFolderButton()
        label_7 = MLabel()
        label_7.set_elide_mode(Qt.ElideRight)
        browser_7.sig_folder_changed.connect(label_7.setText)

        lay_3 = QGridLayout()
        lay_3.addWidget(browser_6, 2, 0)
        lay_3.addWidget(browser_7, 2, 1)
        lay_3.addWidget(label_6, 3, 0)
        lay_3.addWidget(label_7, 3, 1)

        browser_8 = MDragFileButton(text='Click or drag media file here',
                                    multiple=False)
        browser_8.set_dayu_svg('media_line.svg')
        browser_8.set_dayu_filters(['.mov', '.mp4'])
        browser_8_label = MLabel()
        browser_8_label.set_elide_mode(Qt.ElideRight)
        self.register_field('current_file', '')
        self.bind('current_file',
                  browser_8,
                  'dayu_path',
                  signal='sig_file_changed')
        self.bind('current_file', browser_8_label, 'text')

        main_lay = QVBoxLayout()
        main_lay.addWidget(MDivider('MClickBrowser*PushButton'))
        main_lay.addLayout(lay_1)
        main_lay.addWidget(MDivider('MClickBrowser*ToolButton'))
        main_lay.addLayout(lay_2)
        main_lay.addWidget(MDivider('MDragBrowser*ToolButton'))
        main_lay.addLayout(lay_3)
        main_lay.addWidget(MDivider('data bind'))
        main_lay.addWidget(browser_8)
        main_lay.addWidget(browser_8_label)
        main_lay.addStretch()
        self.setLayout(main_lay)