From 8515f180ade28d5d61626b2382d366f9572fbd1e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 20 Jan 2021 18:38:08 +0100 Subject: [PATCH] apply changes from pype 2 PR --- pype/tools/launcher/models.py | 28 +++---- pype/tools/launcher/widgets.py | 6 ++ pype/tools/launcher/window.py | 135 +++++++++++++++++---------------- 3 files changed, 91 insertions(+), 78 deletions(-) diff --git a/pype/tools/launcher/models.py b/pype/tools/launcher/models.py index c38e809c74..58f0076871 100644 --- a/pype/tools/launcher/models.py +++ b/pype/tools/launcher/models.py @@ -119,14 +119,11 @@ class ActionModel(QtGui.QStandardItemModel): self.application_manager = ApplicationManager() - self._session = {} self._groups = {} self.default_icon = qtawesome.icon("fa.cube", color="white") # Cache of available actions self._registered_actions = list() - self.discover() - def discover(self): """Set up Actions cache. Run this for each new project.""" # Discover all registered actions @@ -178,14 +175,12 @@ class ActionModel(QtGui.QStandardItemModel): return self.default_icon return icon - def refresh(self): + def filter_actions(self): # Validate actions based on compatibility self.clear() self._groups.clear() - self.discover() - actions = self.filter_compatible_actions(self._registered_actions) self.beginResetModel() @@ -237,14 +232,17 @@ class ActionModel(QtGui.QStandardItemModel): if icon is None: icon = self.default_icon - item = QtGui.QStandardItem(icon, action.label) + item = QtGui.QStandardItem(icon, label) + item.setData(label, QtCore.Qt.ToolTipRole) item.setData(actions, self.ACTION_ROLE) item.setData(True, self.VARIANT_GROUP_ROLE) items_by_order[order].append(item) for action in single_actions: icon = self.get_icon(action) - item = QtGui.QStandardItem(icon, lib.get_action_label(action)) + label = lib.get_action_label(action) + item = QtGui.QStandardItem(icon, label) + item.setData(label, QtCore.Qt.ToolTipRole) item.setData(action, self.ACTION_ROLE) items_by_order[action.order].append(item) @@ -275,11 +273,6 @@ class ActionModel(QtGui.QStandardItemModel): self.endResetModel() - def set_session(self, session): - assert isinstance(session, dict) - self._session = copy.deepcopy(session) - self.refresh() - def filter_compatible_actions(self, actions): """Collect all actions which are compatible with the environment @@ -294,8 +287,15 @@ class ActionModel(QtGui.QStandardItemModel): """ compatible = [] + _session = copy.deepcopy(self.dbcon.Session) + session = { + key: value + for key, value in _session.items() + if value + } + for action in actions: - if action().is_compatible(self._session): + if action().is_compatible(session): compatible.append(action) # Sort by order and name diff --git a/pype/tools/launcher/widgets.py b/pype/tools/launcher/widgets.py index 9344360c3e..42b24de8cd 100644 --- a/pype/tools/launcher/widgets.py +++ b/pype/tools/launcher/widgets.py @@ -123,6 +123,12 @@ class ActionBar(QtWidgets.QWidget): view.clicked.connect(self.on_clicked) + def discover_actions(self): + self.model.discover() + + def filter_actions(self): + self.model.filter_actions() + def set_row_height(self, rows): self.setMinimumHeight(rows * 75) diff --git a/pype/tools/launcher/window.py b/pype/tools/launcher/window.py index ac4558df8b..f4ed7013a8 100644 --- a/pype/tools/launcher/window.py +++ b/pype/tools/launcher/window.py @@ -12,7 +12,11 @@ from avalon.tools.widgets import AssetWidget from avalon.vendor import qtawesome from .models import ProjectModel from .widgets import ( - ProjectBar, ActionBar, TasksWidget, ActionHistory, SlidePageWidget + ProjectBar, + ActionBar, + TasksWidget, + ActionHistory, + SlidePageWidget ) from .flickcharm import FlickCharm @@ -119,6 +123,7 @@ class ProjectsPanel(QtWidgets.QWidget): class AssetsPanel(QtWidgets.QWidget): """Assets page""" back_clicked = QtCore.Signal() + session_changed = QtCore.Signal() def __init__(self, dbcon, parent=None): super(AssetsPanel, self).__init__(parent=parent) @@ -187,6 +192,8 @@ class AssetsPanel(QtWidgets.QWidget): project_bar.project_changed.connect(self.on_project_changed) assets_widget.selection_changed.connect(self.on_asset_changed) assets_widget.refreshed.connect(self.on_asset_changed) + tasks_widget.task_changed.connect(self.on_task_change) + btn_back.clicked.connect(self.back_clicked) # Force initial refresh for the assets since we might not be @@ -197,14 +204,19 @@ class AssetsPanel(QtWidgets.QWidget): def set_project(self, project): before = self.project_bar.get_current_project() - self.project_bar.set_project(project) - if project == before: - # Force a refresh on the assets if the project hasn't changed + if before == project: self.assets_widget.refresh() + return + + self.project_bar.set_project(project) + self.on_project_changed() def on_project_changed(self): project_name = self.project_bar.get_current_project() self.dbcon.Session["AVALON_PROJECT"] = project_name + + self.session_changed.emit() + self.assets_widget.refresh() def on_asset_changed(self): @@ -216,28 +228,41 @@ class AssetsPanel(QtWidgets.QWidget): print("Asset changed..") - asset_doc = self.assets_widget.get_active_asset_document() - if asset_doc: - self.tasks_widget.set_asset(asset_doc["_id"]) - else: - self.tasks_widget.set_asset(None) + asset_name = None + asset_silo = None - def get_current_session(self): + # Check asset on current index and selected assets asset_doc = self.assets_widget.get_active_asset_document() - session = copy.deepcopy(self.dbcon.Session) - - # Clear some values that we are about to collect if available - session.pop("AVALON_SILO", None) - session.pop("AVALON_ASSET", None) - session.pop("AVALON_TASK", None) + selected_asset_docs = self.assets_widget.get_selected_assets() + # If there are not asset selected docs then active asset is not + # selected + if not selected_asset_docs: + asset_doc = None + elif asset_doc: + # If selected asset doc and current asset are not same than + # something bad happened + if selected_asset_docs[0]["_id"] != asset_doc["_id"]: + asset_doc = None if asset_doc: - session["AVALON_ASSET"] = asset_doc["name"] - task_name = self.tasks_widget.get_current_task() - if task_name: - session["AVALON_TASK"] = task_name + asset_name = asset_doc["name"] + asset_silo = asset_doc.get("silo") - return session + self.dbcon.Session["AVALON_TASK"] = None + self.dbcon.Session["AVALON_ASSET"] = asset_name + self.dbcon.Session["AVALON_SILO"] = asset_silo + + self.session_changed.emit() + + asset_id = None + if asset_doc: + asset_id = asset_doc["_id"] + self.tasks_widget.set_asset(asset_id) + + def on_task_change(self): + task_name = self.tasks_widget.get_current_task() + self.dbcon.Session["AVALON_TASK"] = task_name + self.session_changed.emit() class LauncherWindow(QtWidgets.QDialog): @@ -323,14 +348,7 @@ class LauncherWindow(QtWidgets.QDialog): action_history.trigger_history.connect(self.on_history_action) project_panel.project_clicked.connect(self.on_project_clicked) asset_panel.back_clicked.connect(self.on_back_clicked) - - # Add some signals to propagate from the asset panel - for signal in ( - asset_panel.project_bar.project_changed, - asset_panel.assets_widget.selection_changed, - asset_panel.tasks_widget.task_changed - ): - signal.connect(self.on_session_changed) + asset_panel.session_changed.connect(self.on_session_changed) # todo: Simplify this callback connection asset_panel.project_bar.project_changed.connect( @@ -339,6 +357,11 @@ class LauncherWindow(QtWidgets.QDialog): self.resize(520, 740) + def showEvent(self, event): + super().showEvent(event) + # TODO implement refresh/reset which will trigger updating + self.discover_actions() + def set_page(self, page): current = self.page_slider.currentIndex() if current == page and self._page == page: @@ -348,10 +371,6 @@ class LauncherWindow(QtWidgets.QDialog): self._page = page self.page_slider.slide_view(page, direction=direction) - def refresh(self): - self.asset_panel.assets_widget.refresh() - self.refresh_actions() - def echo(self, message): self.message_label.setText(str(message)) QtCore.QTimer.singleShot(5000, lambda: self.message_label.setText("")) @@ -362,30 +381,30 @@ class LauncherWindow(QtWidgets.QDialog): self.dbcon.Session["AVALON_PROJECT"] = project_name # Update the Action plug-ins available for the current project - self.actions_bar.model.discover() + self.discover_actions() def on_session_changed(self): - self.refresh_actions() + self.filter_actions() - def refresh_actions(self, delay=1): - tools_lib.schedule(self.on_refresh_actions, delay) + def discover_actions(self): + self.actions_bar.discover_actions() + self.filter_actions() + + def filter_actions(self): + self.actions_bar.filter_actions() def on_project_clicked(self, project_name): self.dbcon.Session["AVALON_PROJECT"] = project_name # Refresh projects self.asset_panel.set_project(project_name) self.set_page(1) - self.refresh_actions() + self.discover_actions() def on_back_clicked(self): + self.dbcon.Session["AVALON_PROJECT"] = None self.set_page(0) self.project_panel.model.refresh() # Refresh projects - self.refresh_actions() - - def on_refresh_actions(self): - session = self.get_current_session() - self.actions_bar.model.set_session(session) - self.actions_bar.model.refresh() + self.discover_actions() def on_action_clicked(self, action): self.echo("Running action: {}".format(action.name)) @@ -404,33 +423,21 @@ class LauncherWindow(QtWidgets.QDialog): # User is holding control, rerun the action self.run_action(action, session=session) - def get_current_session(self): - if self._page == 1: - # Assets page - return self.asset_panel.get_current_session() - - session = copy.deepcopy(self.dbcon.Session) - - # Remove some potential invalid session values - # that we know are not set when not browsing in - # a project. - session.pop("AVALON_PROJECT", None) - session.pop("AVALON_ASSET", None) - session.pop("AVALON_SILO", None) - session.pop("AVALON_TASK", None) - - return session - def run_action(self, action, session=None): if session is None: - session = self.get_current_session() + session = copy.deepcopy(self.dbcon.Session) + filtered_session = { + key: value + for key, value in session.items() + if value + } # Add to history - self.action_history.add_action(action, session) + self.action_history.add_action(action, filtered_session) # Process the Action try: - action().process(session) + action().process(filtered_session) except Exception as exc: self.log.warning("Action launch failed.", exc_info=True) self.echo("Failed: {}".format(str(exc)))