Ejemplo n.º 1
0
 def set_rv_path(self, val):
     settings.local_settings.setValue(get_preference(u'rv_path'), val)
     file_info = QtCore.QFileInfo(val)
     if file_info.exists():
         self.rv_path.setStyleSheet(u'color: rgba({})'.format(
             common.rgb(common.ADD)))
     else:
         self.rv_path.setStyleSheet(u'color: rgba({})'.format(
             common.rgb(common.REMOVE)))
Ejemplo n.º 2
0
    def _create_UI(self):
        QtWidgets.QVBoxLayout(self)
        o = common.MARGIN()
        self.layout().setContentsMargins(o, o, o, o)
        self.layout().setSpacing(o)

        row = common_ui.add_row(u'', parent=self)
        self.hide_button = common_ui.ClickableIconButton(
            u'close', (common.REMOVE, common.REMOVE),
            common.MARGIN(),
            description=u'Hide',
            parent=row)

        bookmark = u'{}/{}/{}'.format(self.server, self.job, self.root)
        source = images.get_thumbnail_path(self.server, self.job, self.root,
                                           bookmark)

        pixmap = images.ImageCache.get_pixmap(source, row.height())
        if not pixmap:
            source = images.get_placeholder_path(
                bookmark, fallback=u'thumb_bookmark_gray')
            pixmap = images.ImageCache.get_pixmap(source, row.height())

        if pixmap:
            thumbnail = QtWidgets.QLabel(parent=self)
            thumbnail.setPixmap(pixmap)
            row.layout().addWidget(thumbnail, 0)
            row.layout().addSpacing(o * 0.5)

        text = u'{}  |  {}'.format(self.job.upper(), self.root.upper())
        label = common_ui.PaintedLabel(text, size=common.LARGE_FONT_SIZE())

        row.layout().addWidget(label)
        row.layout().addStretch(1)
        row.layout().addWidget(self.hide_button, 0)

        # *****************************************

        self.templates_widget = managebookmarks.TemplatesWidget(u'asset',
                                                                parent=self)
        self.layout().addWidget(self.templates_widget, 1)

        s = u'Independent of the template, basic <span style="color:rgba({ADD});">mode</span> and \
<span style="color:rgba({ADD});">task</span> are defined in \
<span style="color:rgba({H});">Preferences -> Default Paths</span>. \
Ideally, both the template and the preferences should define the same folders.'.format(
            ADD=common.rgb(common.ADD),
            H=common.rgb(common.TEXT_SELECTED),
        )
        common_ui.add_description(s, label='hint', parent=self)
        self.layout().addStretch(1)
Ejemplo n.º 3
0
        def add_name_template():
            height = common.ROW_HEIGHT() * 0.8
            o = common.MARGIN()

            grp = common_ui.get_group(parent=self)
            grp.layout().setContentsMargins(o, o, o, o)
            grp.layout().setSpacing(0)

            label = common_ui.PaintedLabel(u'Name template',
                                           size=common.LARGE_FONT_SIZE(),
                                           parent=grp)
            grp.layout().addWidget(label)
            grp.layout().addSpacing(o)

            label = u'<span style="color:rgba({ADD});">File name pattern</span> - {v}:'.format(
                ADD=common.rgb(common.ADD),
                v=u'The template used to generate new file names')
            row = common_ui.add_row(None,
                                    padding=None,
                                    height=height,
                                    parent=grp)
            common_ui.add_description(label, label=u'', parent=row)
            row = common_ui.add_row(None,
                                    padding=None,
                                    height=height,
                                    parent=grp)
            line_edit = common_ui.add_line_edit(defaultpaths.FILE_NAME_PATTERN,
                                                parent=row)
            line_edit.textChanged.connect(
                functools.partial(text_changed, defaultpaths.FILE_NAME_PATTERN,
                                  u'defaultpaths/filenamepattern'))
            line_edit.setAlignment(QtCore.Qt.AlignLeft)
            line_edit.setText(defaultpaths.FILE_NAME_PATTERN)

            s = \
                u'Available tokens<br><br>\
<span style="color:rgba({ADD});">{{folder}}</span>  -  The destination folder<br>\
<span style="color:rgba({ADD});">{{prefix}}</span>  -  Prefix defined by the bookmark<br>\
<span style="color:rgba({ADD});">{{asset}}</span>   -  Asset name<br>\
<span style="color:rgba({ADD});">{{mode}}</span>    -  Selected mode (see below)<br>\
<span style="color:rgba({ADD});">{{user}}</span>    -  Name of the current user<br>\
<span style="color:rgba({ADD});">{{version}}</span> -  Version number<br>\
<span style="color:rgba({ADD});">{{ext}}</span>     -  File extension'                                                                      .format(
                    ADD=common.rgb(common.ADD),
                    v=u'The template used to generate new file names'
                )
            grp.layout().addSpacing(o)
            common_ui.add_description(s, label='', parent=grp)
Ejemplo n.º 4
0
    def test_slack_token(self):
        if not self.slacktoken_editor.text():
            return

        try:
            import bookmarks.slacker as slacker
        except ImportError as err:
            common_ui.ErrorBox(
                u'Could not import SlackClient',
                u'The Slack API python module was not loaded:\n{}'.format(err),
            ).open()
            log.error('Slack import error.')
            raise

        client = slacker.Client(self.slacktoken_editor.text())
        client.verify_token(silent=False)

        self.slacktoken_editor.setStyleSheet(u'color: rgba({});'.format(
            common.rgb(common.ADD)))
        pretty_response = u'Slack URL: {url}\nTeam: {team}'.format(
            url=client._response['url'],
            team=client._response['team'],
        )
        common_ui.OkBox(
            u'Token is valid.',
            pretty_response,
        ).open()
Ejemplo n.º 5
0
    def __init__(self, short_text, long_text, parent=None):
        global _message_box_instance
        _message_box_instance = self

        super(MessageBox, self).__init__(parent=parent)

        if parent is None:
            common.set_custom_stylesheet(self)

        self.short_text_label = QtWidgets.QLabel(short_text, parent=self)
        self.short_text_label.setWordWrap(True)
        self.long_text_label = QtWidgets.QLabel(long_text, parent=self)
        self.long_text_label.setWordWrap(True)

        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        self.setAttribute(QtCore.Qt.WA_NoSystemBackground)

        self.setWindowFlags(
            QtCore.Qt.Dialog |
            QtCore.Qt.FramelessWindowHint |
            QtCore.Qt.NoDropShadowWindowHint |
            QtCore.Qt.WindowStaysOnTopHint
        )
        self.installEventFilter(self)
        self.setSizePolicy(
            QtWidgets.QSizePolicy.Preferred,
            QtWidgets.QSizePolicy.Preferred
        )
        self._create_UI()

        self.setStyleSheet("""
QWidget {{
    color: rgba({TEXT});
    background-color: rgba({BG});
    font-family: "{FAMILY}";
    font-size: {SIZE}px;
}}
            """.format(
            SIZE=common.LARGE_FONT_SIZE(),
            FAMILY=common.font_db.primary_font(
                common.MEDIUM_FONT_SIZE())[0].family(),
            TEXT=common.rgb(self.secondary_color.darker(150)),
            BG=common.rgb(self.secondary_color)))

        self.ok_button.clicked.connect(
            lambda: self.done(QtWidgets.QDialog.Accepted))
Ejemplo n.º 6
0
        def add_section(label, description, data):
            """Utility method for creating the layout needed to edit default paths."""
            height = common.ROW_HEIGHT() * 0.8
            o = common.MARGIN()

            grp = common_ui.get_group(parent=self)
            grp.layout().setContentsMargins(o, o, o, o)
            grp.layout().setSpacing(0)

            label = common_ui.PaintedLabel(label,
                                           size=common.LARGE_FONT_SIZE(),
                                           parent=self)
            grp.layout().addWidget(label)
            grp.layout().addSpacing(o)

            if description:
                common_ui.add_description(description, label=None, parent=grp)
                grp.layout().addSpacing(o)

            scroll_area = QtWidgets.QScrollArea(parent=self)
            scroll_area.setWidgetResizable(True)
            scroll_area.setMaximumHeight(common.HEIGHT() * 0.66)
            scroll_area.setAttribute(QtCore.Qt.WA_NoBackground)
            scroll_area.setAttribute(QtCore.Qt.WA_TranslucentBackground)
            grp.layout().addWidget(scroll_area)

            _row = common_ui.add_row(None,
                                     vertical=True,
                                     padding=None,
                                     height=None,
                                     parent=grp)
            _row.layout().setContentsMargins(0, 0, 0, 0)
            _row.layout().setSpacing(0)
            scroll_area.setWidget(_row)

            for k, v in sorted(data.items()):
                label = u'<span style="color:rgba({ADD});">{k}</span> - {v}:'.format(
                    ADD=common.rgb(common.ADD),
                    k=k.upper(),
                    v=v[u'description'])
                row = common_ui.add_row(None,
                                        padding=None,
                                        height=height,
                                        parent=_row)
                common_ui.add_description(label, label=u'', parent=row)
                row = common_ui.add_row(None,
                                        padding=None,
                                        height=height,
                                        parent=_row)
                line_edit = common_ui.add_line_edit(v[u'default'], parent=row)
                line_edit.setAlignment(QtCore.Qt.AlignLeft)
                line_edit.setText(v[u'value'])
                line_edit.textChanged.connect(
                    functools.partial(text_changed, data, k))
Ejemplo n.º 7
0
def add_description(text, label=u' ', padding=common.MARGIN(), parent=None):
    """Utility method for adding a description field.

    Returns:
        QLabel: the added QLabel.

    """
    row = add_row(label, padding=padding, height=None, parent=parent)
    label = QtWidgets.QLabel(text, parent=parent)
    label.setAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft)
    label.setStyleSheet(
        u'color: rgba({}); font-size: {}px'.format(
            common.rgb(common.SECONDARY_TEXT),
            common.SMALL_FONT_SIZE()
        )
    )
    label.setWordWrap(True)
    row.layout().addWidget(label, 1)
    parent.layout().addWidget(row)

    return label
Ejemplo n.º 8
0
    def _init_values(self):
        val = settings.local_settings.value(
            get_preference(u'frameless_window'))
        val = val if not None else False
        if val is not None:
            self.frameless_window.setChecked(val)

        if common.STANDALONE:
            val = settings.local_settings.value(get_preference(u'ui_scale'))
            val = val if not None else 1.0
            if val is not None:
                idx = self.ui_scale.findData(val)
                if idx != -1:
                    self.ui_scale.setCurrentIndex(idx)

        rv_path = settings.local_settings.value(get_preference(u'rv_path'))
        val = rv_path if rv_path else None
        self.rv_path.setText(val)
        file_info = QtCore.QFileInfo(val)
        if file_info.exists():
            self.rv_path.setStyleSheet(u'color: rgba({})'.format(
                common.rgb(common.ADD)))
Ejemplo n.º 9
0
    def _create_UI(self):
        def get_row(vertical=False, parent=None):
            row = QtWidgets.QWidget(parent=parent)
            if vertical:
                QtWidgets.QVBoxLayout(row)
            else:
                QtWidgets.QHBoxLayout(row)
            row.layout().setContentsMargins(0, 0, 0, 0)
            row.layout().setSpacing(0)
            row.setSizePolicy(
                QtWidgets.QSizePolicy.Expanding,
                QtWidgets.QSizePolicy.Expanding,
            )
            parent.layout().addWidget(row)
            return row

        QtWidgets.QHBoxLayout(self)
        o = 0
        self.layout().setContentsMargins(o, o, o, o)
        self.layout().setSpacing(o)

        main_row = get_row(parent=self)
        main_row.layout().setContentsMargins(0, 0, 0, 0)
        main_row.layout().setSpacing(0)

        columns = get_row(vertical=True, parent=main_row)
        columns.layout().setContentsMargins(0, 0, 0, 0)
        columns.layout().setSpacing(0)

        short_text_row = get_row(parent=columns)

        columns.layout().addWidget(short_text_row, 1)
        long_text_row = get_row(parent=columns)

        pixmap = images.ImageCache.get_rsc_pixmap(
            self.icon, self.secondary_color.lighter(150), common.ROW_HEIGHT())
        label = QtWidgets.QLabel(parent=self)
        label.setPixmap(pixmap)
        label.setSizePolicy(
            QtWidgets.QSizePolicy.Minimum,
            QtWidgets.QSizePolicy.Expanding,
        )
        label.setStyleSheet(
            u'padding: {}px; background-color: rgba({});'.format(
                common.MEDIUM_FONT_SIZE(),
                common.rgb(self.primary_color)
            )
        )

        main_row.layout().insertWidget(0, label)

        short_text_row.layout().addWidget(self.short_text_label)
        self.short_text_label.setStyleSheet(
            u'padding:{m}px {s}px {m}px {s}px; background-color: rgba({c}); font-size: {s}px;'.format(
                m=common.MARGIN(),
                c=common.rgb(self.secondary_color.lighter(125)),
                s=common.MEDIUM_FONT_SIZE()
            ))
        self.short_text_label.setAlignment(QtCore.Qt.AlignLeft)

        long_text_row.layout().addWidget(self.long_text_label)
        self.long_text_label.setStyleSheet(
            u'padding:{m}px;background-color: rgba({c}); font-size:{s}px;'.format(
                m=common.MARGIN(),
                c=common.rgb(self.secondary_color),
                s=common.SMALL_FONT_SIZE()
            ))
        self.long_text_label.setAlignment(QtCore.Qt.AlignLeft)

        buttons_row = get_row(parent=columns)
        buttons_row.setStyleSheet(
            u'background-color: rgba({});'.format(common.rgb(self.secondary_color)))
        self.ok_button = QtWidgets.QPushButton(u'Ok', parent=self)
        buttons_row.layout().addWidget(self.ok_button)

        self.ok_button.setStyleSheet(
            """
        QPushButton {{
            font-size: {px}px;
            color: rgba(255,255,255,150);
            border-radius: {i}px;
            border: {s}px solid {c};
            margin: {i}px;
            padding: {i}px;
            background-color: rgba({p});
        }}
        QPushButton:hover {{
            color: white;
            background-color: rgba({pl});
        }}
        QPushButton:pressed {{
            color: rgba(255,255,255,150);
            background-color: rgba({pd});
        }}
        """.format(
                px=common.SMALL_FONT_SIZE(),
                i=common.INDICATOR_WIDTH(),
                s=common.ROW_SEPARATOR(),
                c=common.rgb(self.secondary_color.lighter(150)),
                p=common.rgb(self.primary_color),
                pl=common.rgb(self.primary_color.lighter(120)),
                pd=common.rgb(self.primary_color.darker(120))
            )
        )
Ejemplo n.º 10
0
    def _create_UI(self):
        o = common.INDICATOR_WIDTH()
        self.setMinimumWidth(common.WIDTH() * 0.5)
        height = common.ROW_HEIGHT() * 0.8

        widget = QtWidgets.QWidget(parent=self)
        QtWidgets.QVBoxLayout(widget)
        widget.layout().setAlignment(QtCore.Qt.AlignCenter)
        widget.layout().setContentsMargins(0, 0, 0, 0)
        widget.layout().setSpacing(o * 2)
        self.setWidget(widget)

        # Main group
        grpA = common_ui.get_group(parent=widget)

        # GROUP
        grp = common_ui.get_group(parent=grpA)

        numvalidator = QtGui.QRegExpValidator(parent=self)
        numvalidator.setRegExp(QtCore.QRegExp(ur'[0-9]+[\.]?[0-9]*'))
        textvalidator = QtGui.QRegExpValidator(parent=self)
        textvalidator.setRegExp(QtCore.QRegExp(ur'[a-zA-Z0-9]+'))

        #   ROW1
        self.rectangles_widget = RectanglesWidget(parent=self)
        grp.layout().addWidget(self.rectangles_widget, 1)

        #   ROW
        row = common_ui.add_row(u'Resolution', parent=grp, height=height)
        self.width_editor = common_ui.LineEdit(parent=self)
        self.width_editor.setPlaceholderText(u'Width...')
        self.width_editor.setValidator(numvalidator)
        row.layout().addWidget(self.width_editor, 0)
        self.height_editor = common_ui.LineEdit(parent=self)
        self.height_editor.setPlaceholderText(u'Height...')
        self.height_editor.setValidator(numvalidator)
        row.layout().addWidget(self.height_editor, 0)

        #   ROW
        row = common_ui.add_row(u'Frame rate', parent=grp, height=height)
        self.framerate_editor = common_ui.LineEdit(parent=self)
        self.framerate_editor.setPlaceholderText(u'Frame rate...')
        self.framerate_editor.setValidator(numvalidator)
        row.layout().addWidget(self.framerate_editor, 0)

        # ********************************************
        grp = common_ui.get_group(parent=grpA)
        row = common_ui.add_row(u'Bookmark Prefix', parent=grp, height=height)
        self.prefix_editor = common_ui.LineEdit(parent=self)
        self.prefix_editor.setPlaceholderText(u'Prefix (eg. \'MYJOB\')...')
        self.prefix_editor.setValidator(textvalidator)

        self.suggest_prefix_button = common_ui.PaintedButton(u'Suggest')
        self.suggest_prefix_button.setFixedHeight(height * 0.7)
        row.layout().addWidget(self.prefix_editor, 0)
        row.layout().addWidget(self.suggest_prefix_button, 0)

        # ********************************************
        grp = common_ui.get_group(parent=grpA)

        row = common_ui.add_row(u'Start Frame', parent=grp, height=height)
        self.startframe_editor = common_ui.LineEdit(parent=self)
        self.startframe_editor.setPlaceholderText(u'Start Frame...')
        self.startframe_editor.setValidator(numvalidator)
        row.layout().addWidget(self.startframe_editor, 0)

        row = common_ui.add_row(u'Duration', parent=grp, height=height)
        self.duration_editor = common_ui.LineEdit(parent=self)
        self.duration_editor.setPlaceholderText(u'Duration...')
        self.duration_editor.setValidator(numvalidator)
        row.layout().addWidget(self.duration_editor, 0)
        # ********************************************
        grp = common_ui.get_group(parent=widget)
        row = common_ui.add_row(u'Asset Identifier', parent=grp)
        self.identifier_editor = common_ui.LineEdit(parent=row)
        self.identifier_editor.setPlaceholderText(
            u'Asset identifier, eg. \'workspace.mel\'')
        row.layout().addWidget(self.identifier_editor, 0)

        text = u'Only folders containing this file will be treated as assets.<br>\
Using the default Maya Workspace the identifier normally is \
<span style="text-decoration: underline;">workspace.mel</span>, but \
any other file can be used as long it is present in the root of \
the asset.<br>If not set, all folders inside the Bookmark \
will be read as assets.'.format(common.PRODUCT)
        common_ui.add_description(text, label='Hint', parent=grp)
        # ********************************************
        grpA = common_ui.get_group(parent=widget)

        # Slack API token
        label = common_ui.PaintedLabel(u'Slack Settings',
                                       size=common.MEDIUM_FONT_SIZE() * 1.2)
        grpA.layout().addWidget(label, 0)
        grpA.layout().addSpacing(o * 2)

        grp = common_ui.get_group(parent=grpA)

        row = common_ui.add_row(u'Slack API Token', parent=grp, height=height)
        self.slacktoken_editor = common_ui.LineEdit(parent=self)
        self.slacktoken_editor.setPlaceholderText(
            u'xoxb-01234567890-0123456...')
        button = common_ui.PaintedButton(u'Test Token')
        button.setFixedHeight(height * 0.7)
        button.clicked.connect(self.test_slack_token)
        row.layout().addWidget(self.slacktoken_editor, 0)
        row.layout().addWidget(button)
        text = u'{p} can send messages to team-members using Slack.<br><br>\
To get started, create a new app and install it for your workspace. \
Paste the generated <span style="{h}">OAuth</span> token, usually starting with "xoxb-0123..." above.<br> \
See <a href="http://api.slack.com/apps">http://api.slack.com/apps</a> for more information.<br><br> \
The Slack app needs to have the <span style="{h}">users:read</span> and \
<span style="{h}">chat:write</span> scopes enabled. To send messages to channels \
the bot is not part of, add <span style="{h}">chat:write.public</span>. \
Scopes <span style="{h}">channels:read</span> and <span style="{h}">groups:read</span> are needed to list available \
Slack Channels.<br><br>'.format(p=common.PRODUCT,
                                h='color: rgba({});'.format(
                                    common.rgb(common.ADD)))
        common_ui.add_description(text, label=u'Slack API Hint', parent=grp)
        # ********************************************
        self.widget().layout().addStretch(1)
Ejemplo n.º 11
0
        def add_extensions():
            height = common.ROW_HEIGHT() * 0.8
            o = common.MARGIN()

            grp = common_ui.get_group(parent=self)
            grp.layout().setContentsMargins(o, o, o, o)
            grp.layout().setSpacing(0)

            description = \
                u'Edit the list of valid extensions. Use \
    <span style="color:rgba({ADD});">*</span> to allow all files.'                                                                  .format(
                    p=common.PRODUCT,
                    ADD=common.rgb(common.ADD))

            label = common_ui.PaintedLabel(u'Default extension filters',
                                           size=common.LARGE_FONT_SIZE(),
                                           parent=self)
            grp.layout().addWidget(label)
            grp.layout().addSpacing(o)

            if description:
                common_ui.add_description(description, label=None, parent=grp)
                grp.layout().addSpacing(o)

            scroll_area = QtWidgets.QScrollArea(parent=self)
            scroll_area.setWidgetResizable(True)
            scroll_area.setMaximumHeight(common.HEIGHT() * 0.66)
            scroll_area.setAttribute(QtCore.Qt.WA_NoBackground)
            scroll_area.setAttribute(QtCore.Qt.WA_TranslucentBackground)
            grp.layout().addWidget(scroll_area)

            _row = common_ui.add_row(None,
                                     vertical=True,
                                     padding=None,
                                     height=None,
                                     parent=grp)
            _row.layout().setContentsMargins(0, 0, 0, 0)
            _row.layout().setSpacing(0)
            scroll_area.setWidget(_row)

            for k, v in sorted(defaultpaths.FORMAT_FILTERS.items(),
                               key=lambda x: x[0]):
                label = u'<span style="color:rgba({ADD});">{k}</span> - {v}:'.format(
                    ADD=common.rgb(common.ADD),
                    k=v[u'name'],
                    v=v[u'description'])
                row = common_ui.add_row(None,
                                        padding=None,
                                        height=height,
                                        parent=_row)
                common_ui.add_description(label, label=u'', parent=row)
                row = common_ui.add_row(None,
                                        padding=None,
                                        height=height,
                                        parent=_row)
                line_edit = common_ui.add_line_edit(v[u'default'], parent=row)
                line_edit.textChanged.connect(
                    functools.partial(text_changed,
                                      defaultpaths.FORMAT_FILTERS, k))
                line_edit.setAlignment(QtCore.Qt.AlignLeft)
                line_edit.setText(v[u'value'])
Ejemplo n.º 12
0
    def _create_UI(self):
        @QtCore.Slot()
        def text_changed(*args):
            defaultpaths.save_value(*args)

        def add_section(label, description, data):
            """Utility method for creating the layout needed to edit default paths."""
            height = common.ROW_HEIGHT() * 0.8
            o = common.MARGIN()

            grp = common_ui.get_group(parent=self)
            grp.layout().setContentsMargins(o, o, o, o)
            grp.layout().setSpacing(0)

            label = common_ui.PaintedLabel(label,
                                           size=common.LARGE_FONT_SIZE(),
                                           parent=self)
            grp.layout().addWidget(label)
            grp.layout().addSpacing(o)

            if description:
                common_ui.add_description(description, label=None, parent=grp)
                grp.layout().addSpacing(o)

            scroll_area = QtWidgets.QScrollArea(parent=self)
            scroll_area.setWidgetResizable(True)
            scroll_area.setMaximumHeight(common.HEIGHT() * 0.66)
            scroll_area.setAttribute(QtCore.Qt.WA_NoBackground)
            scroll_area.setAttribute(QtCore.Qt.WA_TranslucentBackground)
            grp.layout().addWidget(scroll_area)

            _row = common_ui.add_row(None,
                                     vertical=True,
                                     padding=None,
                                     height=None,
                                     parent=grp)
            _row.layout().setContentsMargins(0, 0, 0, 0)
            _row.layout().setSpacing(0)
            scroll_area.setWidget(_row)

            for k, v in sorted(data.items()):
                label = u'<span style="color:rgba({ADD});">{k}</span> - {v}:'.format(
                    ADD=common.rgb(common.ADD),
                    k=k.upper(),
                    v=v[u'description'])
                row = common_ui.add_row(None,
                                        padding=None,
                                        height=height,
                                        parent=_row)
                common_ui.add_description(label, label=u'', parent=row)
                row = common_ui.add_row(None,
                                        padding=None,
                                        height=height,
                                        parent=_row)
                line_edit = common_ui.add_line_edit(v[u'default'], parent=row)
                line_edit.setAlignment(QtCore.Qt.AlignLeft)
                line_edit.setText(v[u'value'])
                line_edit.textChanged.connect(
                    functools.partial(text_changed, data, k))

        def add_name_template():
            height = common.ROW_HEIGHT() * 0.8
            o = common.MARGIN()

            grp = common_ui.get_group(parent=self)
            grp.layout().setContentsMargins(o, o, o, o)
            grp.layout().setSpacing(0)

            label = common_ui.PaintedLabel(u'Name template',
                                           size=common.LARGE_FONT_SIZE(),
                                           parent=grp)
            grp.layout().addWidget(label)
            grp.layout().addSpacing(o)

            label = u'<span style="color:rgba({ADD});">File name pattern</span> - {v}:'.format(
                ADD=common.rgb(common.ADD),
                v=u'The template used to generate new file names')
            row = common_ui.add_row(None,
                                    padding=None,
                                    height=height,
                                    parent=grp)
            common_ui.add_description(label, label=u'', parent=row)
            row = common_ui.add_row(None,
                                    padding=None,
                                    height=height,
                                    parent=grp)
            line_edit = common_ui.add_line_edit(defaultpaths.FILE_NAME_PATTERN,
                                                parent=row)
            line_edit.textChanged.connect(
                functools.partial(text_changed, defaultpaths.FILE_NAME_PATTERN,
                                  u'defaultpaths/filenamepattern'))
            line_edit.setAlignment(QtCore.Qt.AlignLeft)
            line_edit.setText(defaultpaths.FILE_NAME_PATTERN)

            s = \
                u'Available tokens<br><br>\
<span style="color:rgba({ADD});">{{folder}}</span>  -  The destination folder<br>\
<span style="color:rgba({ADD});">{{prefix}}</span>  -  Prefix defined by the bookmark<br>\
<span style="color:rgba({ADD});">{{asset}}</span>   -  Asset name<br>\
<span style="color:rgba({ADD});">{{mode}}</span>    -  Selected mode (see below)<br>\
<span style="color:rgba({ADD});">{{user}}</span>    -  Name of the current user<br>\
<span style="color:rgba({ADD});">{{version}}</span> -  Version number<br>\
<span style="color:rgba({ADD});">{{ext}}</span>     -  File extension'                                                                      .format(
                    ADD=common.rgb(common.ADD),
                    v=u'The template used to generate new file names'
                )
            grp.layout().addSpacing(o)
            common_ui.add_description(s, label='', parent=grp)

        def add_extensions():
            height = common.ROW_HEIGHT() * 0.8
            o = common.MARGIN()

            grp = common_ui.get_group(parent=self)
            grp.layout().setContentsMargins(o, o, o, o)
            grp.layout().setSpacing(0)

            description = \
                u'Edit the list of valid extensions. Use \
    <span style="color:rgba({ADD});">*</span> to allow all files.'                                                                  .format(
                    p=common.PRODUCT,
                    ADD=common.rgb(common.ADD))

            label = common_ui.PaintedLabel(u'Default extension filters',
                                           size=common.LARGE_FONT_SIZE(),
                                           parent=self)
            grp.layout().addWidget(label)
            grp.layout().addSpacing(o)

            if description:
                common_ui.add_description(description, label=None, parent=grp)
                grp.layout().addSpacing(o)

            scroll_area = QtWidgets.QScrollArea(parent=self)
            scroll_area.setWidgetResizable(True)
            scroll_area.setMaximumHeight(common.HEIGHT() * 0.66)
            scroll_area.setAttribute(QtCore.Qt.WA_NoBackground)
            scroll_area.setAttribute(QtCore.Qt.WA_TranslucentBackground)
            grp.layout().addWidget(scroll_area)

            _row = common_ui.add_row(None,
                                     vertical=True,
                                     padding=None,
                                     height=None,
                                     parent=grp)
            _row.layout().setContentsMargins(0, 0, 0, 0)
            _row.layout().setSpacing(0)
            scroll_area.setWidget(_row)

            for k, v in sorted(defaultpaths.FORMAT_FILTERS.items(),
                               key=lambda x: x[0]):
                label = u'<span style="color:rgba({ADD});">{k}</span> - {v}:'.format(
                    ADD=common.rgb(common.ADD),
                    k=v[u'name'],
                    v=v[u'description'])
                row = common_ui.add_row(None,
                                        padding=None,
                                        height=height,
                                        parent=_row)
                common_ui.add_description(label, label=u'', parent=row)
                row = common_ui.add_row(None,
                                        padding=None,
                                        height=height,
                                        parent=_row)
                line_edit = common_ui.add_line_edit(v[u'default'], parent=row)
                line_edit.textChanged.connect(
                    functools.partial(text_changed,
                                      defaultpaths.FORMAT_FILTERS, k))
                line_edit.setAlignment(QtCore.Qt.AlignLeft)
                line_edit.setText(v[u'value'])

        description = \
            u'A <span style="color:rgba({ADD});">task folder</span> is any folder \
located in the root of the asset. The folders usually correspond to different \
stages of the asset\'s production cycle and used to categorise CG content.'                                                                           .format(
                p=common.PRODUCT,
                ADD=common.rgb(common.ADD))
        add_section(u'Default task folder names', description,
                    defaultpaths.TASK_FOLDERS)

        description = \
            u'Edit the default mode names. When saving files {p} can suggest paths \
depending on the selected <span style="color:rgba({ADD});">mode</span>.\
<br><br>See below for the available modes - by default each located in the \
<span style="color:rgba({ADD});">scene</span> task folder \
(paths are relative to the asset\'s root folder).'                                                  .format(
                p=common.PRODUCT,
                ADD=common.rgb(common.ADD))
        add_section(u'Default scene paths', description,
                    defaultpaths.SCENE_FOLDERS)

        description = \
            u'Customize the export folder used by DCCs when exporting caches.'.format(
                p=common.PRODUCT,
                ADD=common.rgb(common.ADD))
        add_section(u'Default export paths', description,
                    defaultpaths.EXPORT_FOLDERS)

        add_name_template()
        add_extensions()
Ejemplo n.º 13
0
    def _create_UI(self):
        import bookmarks

        label = common_ui.PaintedLabel(u'General Preferences',
                                       size=common.LARGE_FONT_SIZE(),
                                       parent=self)
        self.layout().addWidget(label)
        grp = common_ui.get_group(parent=self)

        row = common_ui.add_row(u'Frameless window', parent=grp)
        self.frameless_window = QtWidgets.QCheckBox(u'Use frameless window',
                                                    parent=self)
        row.layout().addStretch(1)
        row.layout().addWidget(self.frameless_window)
        label = common_ui.PaintedLabel(u'(Restart required)',
                                       size=common.SMALL_FONT_SIZE(),
                                       color=common.TEXT_DISABLED)
        row.layout().addWidget(label, 0)

        if common.STANDALONE:
            row = common_ui.add_row(u'Scale interface', parent=grp)
            self.ui_scale = QtWidgets.QComboBox(parent=self)
            self.ui_scale.setFixedHeight(common.ROW_HEIGHT() * 0.66)

            for s in (u'100%', u'125%', u'150%', u'175%', u'200%'):
                self.ui_scale.addItem(s)
                idx = self.ui_scale.count() - 1
                data = int(s.strip(u'%')) * 0.01
                self.ui_scale.setItemData(idx, data, role=QtCore.Qt.UserRole)
                data = QtCore.QSize(1, common.ROW_HEIGHT() * 0.66)
                self.ui_scale.setItemData(idx,
                                          data,
                                          role=QtCore.Qt.SizeHintRole)

            row.layout().addWidget(self.ui_scale, 1)
            label = common_ui.PaintedLabel(u'(Restart required)',
                                           size=common.SMALL_FONT_SIZE(),
                                           color=common.TEXT_DISABLED)
            row.layout().addWidget(label, 0)

        ##############################
        row = common_ui.add_row(u'Update', parent=grp)
        self.check_updates = common_ui.PaintedButton(u'Check for Updates',
                                                     parent=row)
        self.show_help = common_ui.PaintedButton(u'Help', parent=row)
        row.layout().addWidget(self.check_updates)
        row.layout().addWidget(self.show_help)
        row.layout().addStretch(1.0)
        #######################################################
        row = common_ui.add_row(None, parent=self)

        label = common_ui.PaintedLabel(u'Shotgun RV',
                                       size=common.LARGE_FONT_SIZE(),
                                       parent=row)
        row.layout().addWidget(label)
        row.layout().addStretch(1)

        grp = common_ui.get_group(parent=self)

        row = common_ui.add_row(u'Path to RV', parent=grp)
        self.rv_path = common_ui.add_line_edit(u'eg. c:/rv/bin/rv.exe',
                                               parent=row)
        row.layout().addWidget(self.rv_path, 1)

        button = common_ui.PaintedButton(u'Pick')
        button.clicked.connect(self.pick_rv)
        row.layout().addWidget(button)
        button = common_ui.PaintedButton(u'Reveal')
        button.clicked.connect(lambda: common.reveal(self.rv_path.text()))
        row.layout().addWidget(button)

        text = \
            u'You can use {} to push footage to Shotgun RV \
(<span style="color:rgba({});">CTRL+P)</span>. Select the RV executable for this to work.'                                                                                          .format(
                common.PRODUCT, common.rgb(common.ADD))
        common_ui.add_description(text, label=u'Hint', parent=grp)

        #######################################################

        label = common_ui.PaintedLabel(u'Shortcuts',
                                       size=common.LARGE_FONT_SIZE(),
                                       parent=self)
        self.layout().addWidget(label)

        grp = common_ui.get_group(parent=self)

        label = QtWidgets.QLabel(parent=self)
        s = u'<table width="100%">'

        def r():
            return unicode('<tr>\
    <td align="center" style="background-color:rgba(0,0,0,80);padding:{pad}px;">\
        <span style="color:rgba({ADD});">{shortcut}</span>\
    </td>\
    <td align="left" style="background-color:rgba(0,0,0,30);padding:{pad}px;">\
        <span style="color:rgba({TEXT});">{description}</span>\
    </td>\
</tr>')

        for shortcut, description in (
            (u'Ctrl+N', u'Open new {} instance'.format(common.PRODUCT)),
            (u'Enter', u'Activate item'),
            (u'Space', u'Preview thumbnail'),
            (u'Arrow Up/Down', u'Navigate list'),
            (u'Ctrl+R', u'Reload'),
            (u'Ctrl+F', u'Edit filter'),
            (u'Ctrl+O', u'Reveal in file manager'),
            (u'Ctrl+C', u'Copy path'),
            (u'Ctrl+Shift+C', u'Copy path (alt)'),
            (u'Ctrl+S', u'Save/remove favourite'),
            (u'Ctrl+A', u'Archive/enable'),
            (u'Ctrl+T', u'Show Notes & Todos'),
            (u'Ctrl+H', u'Hide buttons'),
            (u'Ctrl+M', u'Toggle thumbnail loading'),
            (u'Ctrl+Shift+A', u'Show/Hide archived items'),
            (u'Ctrl+Shift+F', u'Show favourites only/Show all'),
            (u'Tab', u'Edit item description'),
            (u'Shift+Tab', u'Edit item description'),
            (u'Alt+Left', u'Show previous tab'),
            (u'Alt+Right', u'Show next tab'),
            (u'Ctrl+1', u'Show bookmarks'),
            (u'Ctrl+2', u'Show assets'),
            (u'Ctrl+3', u'Show files'),
            (u'Ctrl+4', u'Show favourites'),
            (u'Ctrl+Plus', u'Increase row height'),
            (u'Ctrl+Minus', u'Decrease row height'),
            (u'Ctrl+0', u'Reset row height'),
        ):
            s += r().format(
                shortcut=shortcut,
                description=description,
                pad=int(common.INDICATOR_WIDTH() * 1.5),
                ADD=common.rgb(common.ADD),
                TEXT=common.rgb(common.SECONDARY_TEXT),
            )
        s += u'</table>'
        label.setText(s)
        label.setWordWrap(True)
        grp.layout().addWidget(label)

        label = common_ui.PaintedLabel(u'About {}'.format(common.PRODUCT),
                                       size=common.LARGE_FONT_SIZE(),
                                       parent=grp)
        self.layout().addWidget(label)
        grp = common_ui.get_group(parent=self)
        o = common.MARGIN()
        grp.layout().setContentsMargins(o, o, o, o)
        # row = common_ui.add_row(u'Version', parent=grp, height=None)
        s = u'\n'.join(bookmarks.get_info())
        common_ui.add_description(s, label=None, parent=grp)

        self.layout().addStretch(1)