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)))
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)
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 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()
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))
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_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
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)))
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)) ) )
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)
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'])
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()
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)