diff --git a/bookmarks/actions.py b/bookmarks/actions.py index 93422577..4e42c153 100644 --- a/bookmarks/actions.py +++ b/bookmarks/actions.py @@ -671,22 +671,6 @@ def toggle_filter_editor(): w.filter_editor.close() -@QtCore.Slot(str) -@QtCore.Slot(str) -@QtCore.Slot(str) -@QtCore.Slot(object) -@must_be_initialized -def asset_identifier_changed(table, source, key, value): - """Refresh the assets model if the identifier changes. - - """ - # All shotgun fields should be prefixed by 'shotgun_' - if not (table == database.BookmarkTable and key == 'identifier'): - return - model = common.source_model(common.AssetTab) - model.reset_data() - - def selection(func): """Decorator function to ensure `QModelIndexes` passed to worker threads are in a valid state. diff --git a/bookmarks/common/signals.py b/bookmarks/common/signals.py index 8b291280..089c5ba5 100644 --- a/bookmarks/common/signals.py +++ b/bookmarks/common/signals.py @@ -147,7 +147,6 @@ def __init__(self, connect_signals=True, parent=None): self.toggleFavouritesButton.connect(actions.toggle_favourite_items) - self.databaseValueUpdated.connect(actions.asset_identifier_changed) self.assetAdded.connect(actions.show_asset) self.taskFolderChanged.connect(actions.set_task_folder) diff --git a/bookmarks/common/ui.py b/bookmarks/common/ui.py index 7b34a024..0b379eb3 100644 --- a/bookmarks/common/ui.py +++ b/bookmarks/common/ui.py @@ -220,13 +220,15 @@ def init_stylesheet(): size_font_medium=int(size(common.size_font_medium)), size_font_large=int(size(common.size_font_large)), size_separator=int(size(common.size_separator)), + size_separator2=int(size(common.size_separator) * 2.0), size_indicator=int(size(common.size_indicator)), - size_indicator1=int(size(common.size_indicator) * 1.33), - size_indicator2=int(size(common.size_indicator) * 1.8), + size_indicator1=int(size(common.size_indicator) * 1.5), + size_indicator2=int(size(common.size_indicator) * 2.0), + size_indicator3=int(size(common.size_indicator) * 3.0), size_margin=int(size(common.size_margin)), - size_margin2=int(size(common.size_margin) * 2), - size_margin3=int(size(common.size_margin) * 3), - size_margin4=int(size(common.size_margin) * 4), + size_margin2=int(size(common.size_margin) * 2.0), + size_margin3=int(size(common.size_margin) * 3.0), + size_margin4=int(size(common.size_margin) * 4.0), size_row_height=int(size(common.size_row_height)), size_row_height2=int(size(common.size_row_height) * 0.8), color_background=rgb(common.color_background), diff --git a/bookmarks/contextmenu.py b/bookmarks/contextmenu.py index cdd31981..b9018e54 100644 --- a/bookmarks/contextmenu.py +++ b/bookmarks/contextmenu.py @@ -1641,45 +1641,47 @@ def import_export_properties_menu(self): self.separator(menu=self.menu[k]) - pp = self.index.data(common.ParentPathRole) - if len(pp) == 3: - clipboard = common.BookmarkPropertyClipboard - elif len(pp) == 4: - clipboard = common.AssetPropertyClipboard - else: - clipboard = None - - # Copy menu - if self.index.isValid() and clipboard: - self.menu[k][key()] = { - 'text': 'Copy properties to clipboard...', - 'action': actions.copy_properties, - 'icon': ui.get_icon('settings'), - 'shortcut': shortcuts.get( - shortcuts.MainWidgetShortcuts, - shortcuts.CopyProperties - ).key(), - 'description': shortcuts.hint( - shortcuts.MainWidgetShortcuts, - shortcuts.CopyProperties - ), - } + # Copy / paste menu + if self.index.isValid(): + pp = self.index.data(common.ParentPathRole) - # Paste menu - if self.index.isValid() and clipboard and common.CLIPBOARD[clipboard]: - self.menu[k][key()] = { - 'text': 'Paste properties from clipboard', - 'action': actions.paste_properties, - 'icon': ui.get_icon('settings'), - 'shortcut': shortcuts.get( - shortcuts.MainWidgetShortcuts, - shortcuts.PasteProperties - ).key(), - 'description': shortcuts.hint( - shortcuts.MainWidgetShortcuts, - shortcuts.PasteProperties - ), - } + clipboard = None + if len(pp) == 3: + clipboard = common.BookmarkPropertyClipboard + elif len(pp) == 4: + clipboard = common.AssetPropertyClipboard + + # Copy menu + if clipboard is not None: + self.menu[k][key()] = { + 'text': 'Copy Properties to Clipboard...', + 'action': actions.copy_properties, + 'icon': ui.get_icon('settings'), + 'shortcut': shortcuts.get( + shortcuts.MainWidgetShortcuts, + shortcuts.CopyProperties + ).key(), + 'description': shortcuts.hint( + shortcuts.MainWidgetShortcuts, + shortcuts.CopyProperties + ), + } + + # Paste menu + if common.CLIPBOARD[clipboard]: + self.menu[k][key()] = { + 'text': 'Paste Properties from Clipboard', + 'action': actions.paste_properties, + 'icon': ui.get_icon('settings'), + 'shortcut': shortcuts.get( + shortcuts.MainWidgetShortcuts, + shortcuts.PasteProperties + ).key(), + 'description': shortcuts.hint( + shortcuts.MainWidgetShortcuts, + shortcuts.PasteProperties + ), + } self.separator(menu=self.menu[k]) if self.index.isValid(): diff --git a/bookmarks/database.py b/bookmarks/database.py index 1b459657..d75343ac 100644 --- a/bookmarks/database.py +++ b/bookmarks/database.py @@ -223,10 +223,6 @@ 'sql': 'INT', 'type': int }, - 'identifier': { - 'sql': 'TEXT', - 'type': str - }, 'shotgun_domain': { 'sql': 'TEXT', 'type': str diff --git a/bookmarks/editor/base.py b/bookmarks/editor/base.py index 1d288ae0..12d6285d 100644 --- a/bookmarks/editor/base.py +++ b/bookmarks/editor/base.py @@ -172,7 +172,7 @@ def __init__( self._frameless = frameless self.section_buttons = section_buttons - self._section_widgets = [] + self.section_headers_widget = None self.server = server self.job = job @@ -181,7 +181,6 @@ def __init__( self.thumbnail_editor = None self._hide_thumbnail_editor = hide_thumbnail_editor - self.section_headers_widget = None if not self.parent(): common.set_stylesheet(self) @@ -267,10 +266,8 @@ def _create_ui(self): self.section_headers_widget = QtWidgets.QWidget(parent=self) QtWidgets.QVBoxLayout(self.section_headers_widget) - self.section_headers_widget.layout().setContentsMargins(0, 0, 0, 0) - self.section_headers_widget.layout().setSpacing( - common.size(common.size_indicator) * 2 - ) + self.section_headers_widget.layout().setContentsMargins(o, o, o, o) + self.section_headers_widget.layout().setSpacing(o) parent = QtWidgets.QWidget(parent=self) QtWidgets.QVBoxLayout(parent) diff --git a/bookmarks/editor/bookmark_properties.py b/bookmarks/editor/bookmark_properties.py index e5c8d6b4..ae77b8be 100644 --- a/bookmarks/editor/bookmark_properties.py +++ b/bookmarks/editor/bookmark_properties.py @@ -135,30 +135,6 @@ class BookmarkPropertyEditor(base.BasePropertyEditor): 'e.g. \'150\'', }, }, - 3: { - 'identifier': { - 'name': 'Asset Identifier', - 'key': 'identifier', - 'validator': None, - 'widget': ui.LineEdit, - 'placeholder': 'A file name, e.g. \'workspace.mel\'', - 'description': 'Only folders containing the file specified ' - 'above will be read as assets.\n\nUsing the ' - 'default Maya Workspace the identifier normally ' - 'is \'workspace.mel\', however any other ' - 'arbitrary file can be used as long it is ' - 'present in the root of an asset ' - 'folder.\n\nWhen left empty all folders in the ' - 'bookmark will be read.', - 'help': 'Only folders containing the file specified here will ' - 'be read as assets.\nUsing the default Maya Workspace ' - 'the identifier normally is \'workspace.mel\', ' - 'however any other arbitrary file can be used as long ' - 'it is present in the root of an asset folder.\n\nWhen ' - 'left empty, all folders in the bookmark will be ' - 'interpreted as assets.', - } - }, 4: { 0: { 'name': 'Bookmark Display Name', diff --git a/bookmarks/maya/base.py b/bookmarks/maya/base.py index acfff2a1..961a66d3 100644 --- a/bookmarks/maya/base.py +++ b/bookmarks/maya/base.py @@ -8,11 +8,13 @@ import uuid try: + from maya import OpenMayaUI import maya.cmds as cmds except ImportError: raise ImportError('Could not find the Maya modules.') from PySide2 import QtWidgets, QtCore +import shiboken2 from .. import common from .. import database @@ -188,6 +190,15 @@ is imported multiple times.' +def maya_main_window(): + """ + Return the Maya main window widget as a Python object + + """ + main_window_ptr = OpenMayaUI.MQtUtil.mainWindow() + return shiboken2.wrapInstance(int(main_window_ptr), QtWidgets.QWidget) + + def patch_workspace_file_rules(): """Patches the current maya workspace to use the directories defined in the active bookmark item's token configuration. diff --git a/bookmarks/maya/export.py b/bookmarks/maya/export.py index eeba6300..f63c88ff 100644 --- a/bookmarks/maya/export.py +++ b/bookmarks/maya/export.py @@ -37,8 +37,9 @@ def show(): """ close() - common.maya_export_widget = ExportWidget() - common.maya_export_widget.open() + common.maya_export_widget = ExportWidget(parent=mayabase.maya_main_window()) + common.set_stylesheet(common.maya_export_widget) + common.maya_export_widget.show() return common.maya_export_widget @@ -493,8 +494,8 @@ class ExportWidget(base.BasePropertyEditor): #: UI layout definition sections = { 0: { - 'name': 'Export', - 'icon': '', + 'name': 'Export Object Sets', + 'icon': 'set', 'color': common.color(common.color_dark_background), 'groups': { 0: { diff --git a/bookmarks/maya/scripts/aka_character_caches.py b/bookmarks/maya/scripts/aka_character_caches.py index b135c842..0a065c99 100644 --- a/bookmarks/maya/scripts/aka_character_caches.py +++ b/bookmarks/maya/scripts/aka_character_caches.py @@ -173,7 +173,13 @@ def get_cache_path(set_name, ext, makedir=True): _version += 1 if makedir: - QtCore.QFileInfo(file_path).dir().mkpath('.') + _dir = QtCore.QFileInfo(file_path).dir() + if not _dir.exists(): + if _dir.mkpath('.'): + print(f'Created directory: {_dir.path()}') + else: + raise RuntimeError(f'Could not create directory: {_dir.path()}') + return file_path diff --git a/bookmarks/maya/scripts/aka_shader_templates.py b/bookmarks/maya/scripts/aka_shader_templates.py index 39409659..8e59983a 100644 --- a/bookmarks/maya/scripts/aka_shader_templates.py +++ b/bookmarks/maya/scripts/aka_shader_templates.py @@ -29,6 +29,8 @@ import maya.cmds as cmds from PySide2 import QtCore, QtGui, QtWidgets +from .. import base as mayabase + WINDOW_TITLE = 'Aka Shader Templates' NUMERIC_TYPES = ['double', 'float', 'long', 'short', 'byte', 'int'] @@ -914,7 +916,7 @@ def run(): except: pass - instance = PresetsWidget() + instance = PresetsWidget(parent=mayabase.get_maya_window()) instance.show() diff --git a/bookmarks/rsc/stylesheet.qss b/bookmarks/rsc/stylesheet.qss index e2d505d5..9e9ec8ad 100644 --- a/bookmarks/rsc/stylesheet.qss +++ b/bookmarks/rsc/stylesheet.qss @@ -185,34 +185,29 @@ QComboBox QListView::item:hover {{ QLineEdit, -QTextEdit {{ +QTextEdit, +QTextBrowser {{ background-color: transparent; height: {size_row_height2}px; max-height: {size_row_height2}px; min-height: {size_row_height2}px; border: {size_separator}px solid transparent; border-radius: {size_indicator1}px; - margin: 0; padding-left: {size_indicator}px; padding-right: {size_indicator}px; }} +QLineEdit:disabled, QTextEdit:disabled, -QLineEdit:disabled {{ +QTextBrowser:disabled {{ color: {color_disabled_text}; background-color: transparent; }} - QLineEdit:focus, -QTextEdit:focus {{ +QTextEdit:focus, +QTextBrowser:focus {{ background-color: {color_opaque}; }} -QTextBrowser {{ - height: -1px; - max-height: -1px; - min-height: -1px; -}} - QScrollBar {{ background: {color_separator}; width: {size_indicator2}px; @@ -384,17 +379,15 @@ QLabel:disabled {{ }} QMenu {{ - font-size: {size_font_medium}px; background-color: {color_dark_background}; menu-scrollable: 1; - border-radius: {menu_border_radius}px; - border: 2px solid {color_background}; icon-size: {size_margin2}px; + margin: {size_indicator}px; }} QMenu::separator {{ - height: {size_separator}px; - margin-top: {size_indicator}px; - margin-bottom: {size_indicator}px; + height: {size_separator2}px; + margin-top: {size_indicator2}px; + margin-bottom: {size_indicator2}px; background-color: {color_opaque}; color: transparent; min-width: 1000px; @@ -408,37 +401,40 @@ QMenu::item {{ QMenu::icon {{ padding: {size_margin}px; }} - +QMenu::item:hover, QMenu::item:selected {{ color: {color_selected_text}; - background-color: {color_light_background}; +}} +QMenu::item:selected {{ + background-color: {color_light_background}; }} QMenu::item:disabled {{ color: {color_disabled_text}; - background-color: {color_opaque}; + background-color: {color_opaque}; }} QMenu::right-arrow {{ - margin: 0; + margin: 0; padding-right: {size_margin}px; - image: url({branch_closed}); - height: {size_margin}px; - width: {size_margin}px; -}} -QMenu::keystroke {{ - color: red; + image: url({branch_closed}); + height: {size_margin}px; + width: {size_margin}px; }} +QMenu::keystroke, QMenu::shortcut {{ - color: red; + color: {color_blue}; }} + QToolTip {{ - opacity: 200; - font-family: "{font_secondary}"; - font-size: {size_font_small}px; - background-color: {color_dark_background}; - padding: {size_indicator1}px; - color: {color_secondary_text}; - border: {size_separator}px solid {color_separator}; + font-family: "{font_primary}"; + font-size: {size_font_medium}px; + color: {color_text}; + background: {color_dark_background}; + background-color: {color_dark_background}; + padding: {size_indicator3}px; + margin: 0px; + border-radius: {size_indicator1}px; + border: {size_separator2}px solid {color_blue}; }} QProgressBar, QProgressDialog {{ diff --git a/bookmarks/threads/workers.py b/bookmarks/threads/workers.py index 51bbf244..4fb9adf5 100644 --- a/bookmarks/threads/workers.py +++ b/bookmarks/threads/workers.py @@ -403,7 +403,7 @@ def count_todos(asset_row_data): return len(v) if isinstance(v, dict) else 0 -def count_assets(path, ASSET_IDENTIFIER): +def count_assets(path): """Get the number of asset items. """ @@ -417,13 +417,7 @@ def count_assets(path, ASSET_IDENTIFIER): continue if not entry.is_dir(): continue - if not ASSET_IDENTIFIER: - n += 1 - continue path = entry.path.replace('\\', '/') - identifier = '/'.join((path, ASSET_IDENTIFIER)) - if not QtCore.QFileInfo(identifier).exists(): - continue n += 1 return n @@ -717,7 +711,7 @@ def _process_bookmark_item(self, ref, source, bookmark_row_data, pp): return description = get_bookmark_description(bookmark_row_data) - count = count_assets(source, bookmark_row_data['identifier']) + count = count_assets(source) if not self.is_valid(ref): return False diff --git a/bookmarks/topbar/buttons.py b/bookmarks/topbar/buttons.py index 2a364572..6dcca487 100644 --- a/bookmarks/topbar/buttons.py +++ b/bookmarks/topbar/buttons.py @@ -215,7 +215,7 @@ def __init__(self, parent=None): ) super(ToggleInlineIcons, self).__init__( 'branch_closed', - f'Show/Hide List Buttons - {s}', + f'Toggle Buttons - {s}', parent=parent ) diff --git a/bookmarks/topbar/quickswitch.py b/bookmarks/topbar/quickswitch.py deleted file mode 100644 index ccb88dd8..00000000 --- a/bookmarks/topbar/quickswitch.py +++ /dev/null @@ -1,138 +0,0 @@ -"""Quick item switch menus used by the top bar. - -""" -import functools - -from PySide2 import QtGui, QtCore - -from .. import actions -from .. import common -from .. import contextmenu -from .. import images -from .. import shortcuts -from .. import ui - - -class BaseQuickSwitchMenu(contextmenu.BaseContextMenu): - """A context menu used to quickly change the active bookmark or asset. - - """ - - def add_switch_menu(self, idx, label): - """Adds the items needed to quickly change bookmarks or assets.""" - active_index = common.active_index(idx) - if not common.model(idx).rowCount(): - return - - if common.current_tab() == common.BookmarkTab: - item_icon = ui.get_icon( - 'bookmark_item', - color=common.color(common.color_secondary_text) - ) - elif common.current_tab() == common.AssetTab: - item_icon = ui.get_icon( - 'asset_item', - color=common.color(common.color_secondary_text) - ) - elif common.current_tab() == common.FileTab: - item_icon = ui.get_icon( - 'file_item', - color=common.color(common.color_secondary_text) - ) - elif common.current_tab() == common.FavouriteTab: - item_icon = ui.get_icon( - 'favourite_item', - color=common.color(common.color_secondary_text) - ) - - on_icon = ui.get_icon('check', color=common.color(common.color_green)) - - self.menu[label] = { - 'disabled': True - } - - model = common.model(idx) - for n in range(model.rowCount()): - index = model.index(n, 0) - - pixmap, _ = images.get_thumbnail( - index.data(common.ParentPathRole)[0], - index.data(common.ParentPathRole)[1], - index.data(common.ParentPathRole)[2], - index.data(common.PathRole), - size=common.size(common.size_margin) * 4, - fallback_thumb='icon_bw' - ) - if not pixmap or pixmap.isNull(): - icon = ui.get_icon('icon_bw') - elif active_index.isValid() and active_index.data(common.PathRole) == index.data(common.PathRole): - icon = on_icon - else: - icon = QtGui.QIcon(pixmap) - - name = index.data(QtCore.Qt.DisplayRole) - self.menu[contextmenu.key()] = { - 'text': name, - 'icon': icon, - 'action': functools.partial(common.widget(idx).activate, index) - } - - -class SwitchBookmarkMenu(BaseQuickSwitchMenu): - @common.error - @common.debug - def setup(self): - """Creates the context menu. - - """ - self.add_menu() - self.separator() - self.add_switch_menu( - common.BookmarkTab, - 'Change bookmark' - ) - - def add_menu(self): - self.menu['add'] = { - 'icon': ui.get_icon('add', color=common.color(common.color_green)), - 'text': 'Edit Jobs...', - 'action': actions.show_job_editor, - 'shortcut': shortcuts.string( - shortcuts.MainWidgetShortcuts, - shortcuts.AddItem - ), - 'description': shortcuts.hint( - shortcuts.MainWidgetShortcuts, - shortcuts.AddItem - ), - } - - -class SwitchAssetMenu(BaseQuickSwitchMenu): - @common.error - @common.debug - def setup(self): - """Creates the context menu. - - """ - self.add_menu() - self.separator() - self.add_switch_menu( - common.AssetTab, - 'Switch active asset' - ) - - def add_menu(self): - self.menu['add'] = { - 'icon': ui.get_icon('add', color=common.color(common.color_green)), - 'text': 'Create new asset...', - 'action': actions.show_add_asset, - 'shortcut': shortcuts.string( - shortcuts.MainWidgetShortcuts, - shortcuts.AddItem - ), - 'description': shortcuts.hint( - shortcuts.MainWidgetShortcuts, - shortcuts.AddItem - ), - } diff --git a/bookmarks/topbar/tabs.py b/bookmarks/topbar/tabs.py index 179c4110..b6481ab2 100644 --- a/bookmarks/topbar/tabs.py +++ b/bookmarks/topbar/tabs.py @@ -3,8 +3,7 @@ """ from PySide2 import QtWidgets, QtGui, QtCore -from . import quickswitch -from .. import actions +from .. import shortcuts from .. import common from .. import images from ..items import delegate @@ -153,7 +152,7 @@ def paintEvent(self, event): painter.setOpacity(0.9) color = common.color( common.color_text - ) if hover else common.color(common.color_red) + ) if hover else common.color(common.color_selected_text) else: painter.setOpacity(0.3) color = common.color( @@ -169,36 +168,34 @@ class BookmarksTabButton(BaseTabButton): icon = 'bookmark' def __init__(self, parent=None): - super(BookmarksTabButton, self).__init__( + s = shortcuts.string( + shortcuts.MainWidgetShortcuts, + shortcuts.ShowBookmarksTab + ) + super().__init__( 'Bookmarks', common.BookmarkTab, - 'Browse bookmark items', + f'Bookmark items - {s}', parent=parent ) - def contextMenuEvent(self, event): - menu = quickswitch.SwitchBookmarkMenu(QtCore.QModelIndex(), parent=self) - pos = self.mapToGlobal(event.pos()) - menu.move(pos) - menu.exec_() class AssetsTabButton(BaseTabButton): icon = 'asset' def __init__(self, parent=None): + s = shortcuts.string( + shortcuts.MainWidgetShortcuts, + shortcuts.ShowAssetsTab + ) super().__init__( 'Assets', common.AssetTab, - 'Browse the active bookmark item\'s assets', + f'Asset items - {s}', parent=parent ) - def contextMenuEvent(self, event): - menu = quickswitch.SwitchAssetMenu(QtCore.QModelIndex(), parent=self) - pos = self.mapToGlobal(event.pos()) - menu.move(pos) - menu.exec_() @QtCore.Slot() def emit_tab_changed(self): @@ -212,10 +209,14 @@ class FilesTabButton(BaseTabButton): icon = 'file' def __init__(self, parent=None): + s = shortcuts.string( + shortcuts.MainWidgetShortcuts, + shortcuts.ShowFilesTab + ) super().__init__( 'Files', common.FileTab, - 'Browse the active asset\'s files', + f'File items - {s}', parent=parent ) @@ -227,8 +228,6 @@ def emit_tab_changed(self): super().emit_tab_changed() - def contextMenuEvent(self, event): - self.clicked.emit() class FavouritesTabButton(BaseTabButton): diff --git a/bookmarks/ui.py b/bookmarks/ui.py index 56dc7ffd..3168683c 100644 --- a/bookmarks/ui.py +++ b/bookmarks/ui.py @@ -389,6 +389,7 @@ def __init__( self._size = size self._color = color self._text = text + self._fixed_width = None self.update() @@ -402,12 +403,19 @@ def set_color(self, v): self.update() def update_size(self): + if self._fixed_width: + super().setFixedWidth(self._fixed_width) + return + font, metrics = common.font_db.bold_font(self._size) self.setFixedHeight(metrics.height()) - self.setFixedWidth( + super().setFixedWidth( metrics.horizontalAdvance(self._text) + common.size(common.size_indicator) * 2 ) + def setFixedWidth(self, v): + self._fixed_width = v + super().setFixedWidth(v) def paintEvent(self, event): """Event handler. @@ -1210,8 +1218,8 @@ def add_row( w.layout().setAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft) w.setSizePolicy( - QtWidgets.QSizePolicy.Expanding, - QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.MinimumExpanding, + QtWidgets.QSizePolicy.MinimumExpanding, ) if height: w.setFixedHeight(height) @@ -1227,7 +1235,7 @@ def add_row( parent=parent ) l.setFixedWidth(common.size(common.size_margin) * 8.6667) - w.layout().addWidget(l, 1) + w.layout().addWidget(l, 0) if parent: parent.layout().addWidget(w, 1)