mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +01:00
added my tasks filtering to publisher
This commit is contained in:
parent
3a6ee43f22
commit
f9f55b48b0
5 changed files with 126 additions and 60 deletions
|
|
@ -295,6 +295,21 @@ class AbstractPublisherFrontend(AbstractPublisherCommon):
|
||||||
"""Get folder id from folder path."""
|
"""Get folder id from folder path."""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_my_tasks_entity_ids(
|
||||||
|
self, project_name: str
|
||||||
|
) -> dict[str, list[str]]:
|
||||||
|
"""Get entity ids for my tasks.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
project_name (str): Project name.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict[str, list[str]]: Folder and task ids.
|
||||||
|
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
# --- Create ---
|
# --- Create ---
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def get_creator_items(self) -> Dict[str, "CreatorItem"]:
|
def get_creator_items(self) -> Dict[str, "CreatorItem"]:
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,11 @@ from ayon_core.pipeline import (
|
||||||
registered_host,
|
registered_host,
|
||||||
get_process_id,
|
get_process_id,
|
||||||
)
|
)
|
||||||
from ayon_core.tools.common_models import ProjectsModel, HierarchyModel
|
from ayon_core.tools.common_models import (
|
||||||
|
ProjectsModel,
|
||||||
|
HierarchyModel,
|
||||||
|
UsersModel,
|
||||||
|
)
|
||||||
|
|
||||||
from .models import (
|
from .models import (
|
||||||
PublishModel,
|
PublishModel,
|
||||||
|
|
@ -101,6 +105,7 @@ class PublisherController(
|
||||||
# Cacher of avalon documents
|
# Cacher of avalon documents
|
||||||
self._projects_model = ProjectsModel(self)
|
self._projects_model = ProjectsModel(self)
|
||||||
self._hierarchy_model = HierarchyModel(self)
|
self._hierarchy_model = HierarchyModel(self)
|
||||||
|
self._users_model = UsersModel(self)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def log(self):
|
def log(self):
|
||||||
|
|
@ -317,6 +322,17 @@ class PublisherController(
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def get_my_tasks_entity_ids(
|
||||||
|
self, project_name: str
|
||||||
|
) -> dict[str, list[str]]:
|
||||||
|
username = self._users_model.get_current_username()
|
||||||
|
assignees = []
|
||||||
|
if username:
|
||||||
|
assignees.append(username)
|
||||||
|
return self._hierarchy_model.get_entity_ids_for_assignees(
|
||||||
|
project_name, assignees
|
||||||
|
)
|
||||||
|
|
||||||
# --- Publish specific callbacks ---
|
# --- Publish specific callbacks ---
|
||||||
def get_context_title(self):
|
def get_context_title(self):
|
||||||
"""Get context title for artist shown at the top of main window."""
|
"""Get context title for artist shown at the top of main window."""
|
||||||
|
|
@ -359,6 +375,7 @@ class PublisherController(
|
||||||
self._emit_event("controller.reset.started")
|
self._emit_event("controller.reset.started")
|
||||||
|
|
||||||
self._hierarchy_model.reset()
|
self._hierarchy_model.reset()
|
||||||
|
self._users_model.reset()
|
||||||
|
|
||||||
# Publish part must be reset after plugins
|
# Publish part must be reset after plugins
|
||||||
self._create_model.reset()
|
self._create_model.reset()
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,14 @@
|
||||||
from qtpy import QtWidgets, QtCore
|
from qtpy import QtWidgets, QtCore
|
||||||
|
|
||||||
from ayon_core.lib.events import QueuedEventSystem
|
from ayon_core.lib.events import QueuedEventSystem
|
||||||
from ayon_core.tools.utils import PlaceholderLineEdit, GoToCurrentButton
|
|
||||||
|
|
||||||
from ayon_core.tools.common_models import HierarchyExpectedSelection
|
from ayon_core.tools.common_models import HierarchyExpectedSelection
|
||||||
from ayon_core.tools.utils import FoldersWidget, TasksWidget
|
from ayon_core.tools.utils import (
|
||||||
|
FoldersWidget,
|
||||||
|
TasksWidget,
|
||||||
|
FoldersFiltersWidget,
|
||||||
|
GoToCurrentButton,
|
||||||
|
)
|
||||||
from ayon_core.tools.publisher.abstract import AbstractPublisherFrontend
|
from ayon_core.tools.publisher.abstract import AbstractPublisherFrontend
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -180,8 +184,7 @@ class CreateContextWidget(QtWidgets.QWidget):
|
||||||
|
|
||||||
headers_widget = QtWidgets.QWidget(self)
|
headers_widget = QtWidgets.QWidget(self)
|
||||||
|
|
||||||
folder_filter_input = PlaceholderLineEdit(headers_widget)
|
filters_widget = FoldersFiltersWidget(headers_widget)
|
||||||
folder_filter_input.setPlaceholderText("Filter folders..")
|
|
||||||
|
|
||||||
current_context_btn = GoToCurrentButton(headers_widget)
|
current_context_btn = GoToCurrentButton(headers_widget)
|
||||||
current_context_btn.setToolTip("Go to current context")
|
current_context_btn.setToolTip("Go to current context")
|
||||||
|
|
@ -189,7 +192,8 @@ class CreateContextWidget(QtWidgets.QWidget):
|
||||||
|
|
||||||
headers_layout = QtWidgets.QHBoxLayout(headers_widget)
|
headers_layout = QtWidgets.QHBoxLayout(headers_widget)
|
||||||
headers_layout.setContentsMargins(0, 0, 0, 0)
|
headers_layout.setContentsMargins(0, 0, 0, 0)
|
||||||
headers_layout.addWidget(folder_filter_input, 1)
|
headers_layout.setSpacing(5)
|
||||||
|
headers_layout.addWidget(filters_widget, 1)
|
||||||
headers_layout.addWidget(current_context_btn, 0)
|
headers_layout.addWidget(current_context_btn, 0)
|
||||||
|
|
||||||
hierarchy_controller = CreateHierarchyController(controller)
|
hierarchy_controller = CreateHierarchyController(controller)
|
||||||
|
|
@ -207,15 +211,16 @@ class CreateContextWidget(QtWidgets.QWidget):
|
||||||
main_layout.setContentsMargins(0, 0, 0, 0)
|
main_layout.setContentsMargins(0, 0, 0, 0)
|
||||||
main_layout.setSpacing(0)
|
main_layout.setSpacing(0)
|
||||||
main_layout.addWidget(headers_widget, 0)
|
main_layout.addWidget(headers_widget, 0)
|
||||||
|
main_layout.addSpacing(5)
|
||||||
main_layout.addWidget(folders_widget, 2)
|
main_layout.addWidget(folders_widget, 2)
|
||||||
main_layout.addWidget(tasks_widget, 1)
|
main_layout.addWidget(tasks_widget, 1)
|
||||||
|
|
||||||
folders_widget.selection_changed.connect(self._on_folder_change)
|
folders_widget.selection_changed.connect(self._on_folder_change)
|
||||||
tasks_widget.selection_changed.connect(self._on_task_change)
|
tasks_widget.selection_changed.connect(self._on_task_change)
|
||||||
current_context_btn.clicked.connect(self._on_current_context_click)
|
current_context_btn.clicked.connect(self._on_current_context_click)
|
||||||
folder_filter_input.textChanged.connect(self._on_folder_filter_change)
|
filters_widget.text_changed.connect(self._on_folder_filter_change)
|
||||||
|
filters_widget.my_tasks_changed.connect(self._on_my_tasks_change)
|
||||||
|
|
||||||
self._folder_filter_input = folder_filter_input
|
|
||||||
self._current_context_btn = current_context_btn
|
self._current_context_btn = current_context_btn
|
||||||
self._folders_widget = folders_widget
|
self._folders_widget = folders_widget
|
||||||
self._tasks_widget = tasks_widget
|
self._tasks_widget = tasks_widget
|
||||||
|
|
@ -303,5 +308,17 @@ class CreateContextWidget(QtWidgets.QWidget):
|
||||||
self._last_project_name, folder_id, task_name
|
self._last_project_name, folder_id, task_name
|
||||||
)
|
)
|
||||||
|
|
||||||
def _on_folder_filter_change(self, text):
|
def _on_folder_filter_change(self, text: str) -> None:
|
||||||
self._folders_widget.set_name_filter(text)
|
self._folders_widget.set_name_filter(text)
|
||||||
|
|
||||||
|
def _on_my_tasks_change(self, enabled: bool) -> None:
|
||||||
|
folder_ids = None
|
||||||
|
task_ids = None
|
||||||
|
if enabled:
|
||||||
|
entity_ids = self._controller.get_my_tasks_entity_ids(
|
||||||
|
self._last_project_name
|
||||||
|
)
|
||||||
|
folder_ids = entity_ids["folder_ids"]
|
||||||
|
task_ids = entity_ids["task_ids"]
|
||||||
|
self._folders_widget.set_folder_ids_filter(folder_ids)
|
||||||
|
self._tasks_widget.set_task_ids_filter(task_ids)
|
||||||
|
|
|
||||||
|
|
@ -710,11 +710,13 @@ class CreateWidget(QtWidgets.QWidget):
|
||||||
|
|
||||||
def _on_first_show(self):
|
def _on_first_show(self):
|
||||||
width = self.width()
|
width = self.width()
|
||||||
part = int(width / 4)
|
part = int(width / 9)
|
||||||
rem_width = width - part
|
context_width = part * 3
|
||||||
self._main_splitter_widget.setSizes([part, rem_width])
|
create_sel_width = part * 2
|
||||||
rem_width = rem_width - part
|
rem_width = width - context_width
|
||||||
self._creators_splitter.setSizes([part, rem_width])
|
self._main_splitter_widget.setSizes([context_width, rem_width])
|
||||||
|
rem_width -= create_sel_width
|
||||||
|
self._creators_splitter.setSizes([create_sel_width, rem_width])
|
||||||
|
|
||||||
def showEvent(self, event):
|
def showEvent(self, event):
|
||||||
super().showEvent(event)
|
super().showEvent(event)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
from qtpy import QtWidgets
|
from qtpy import QtWidgets
|
||||||
|
|
||||||
from ayon_core.lib.events import QueuedEventSystem
|
from ayon_core.lib.events import QueuedEventSystem
|
||||||
from ayon_core.tools.utils import PlaceholderLineEdit, FoldersWidget
|
from ayon_core.tools.utils import (
|
||||||
|
FoldersWidget,
|
||||||
|
FoldersFiltersWidget,
|
||||||
|
)
|
||||||
from ayon_core.tools.publisher.abstract import AbstractPublisherFrontend
|
from ayon_core.tools.publisher.abstract import AbstractPublisherFrontend
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -43,8 +46,7 @@ class FoldersDialog(QtWidgets.QDialog):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.setWindowTitle("Select folder")
|
self.setWindowTitle("Select folder")
|
||||||
|
|
||||||
filter_input = PlaceholderLineEdit(self)
|
filters_widget = FoldersFiltersWidget(self)
|
||||||
filter_input.setPlaceholderText("Filter folders..")
|
|
||||||
|
|
||||||
folders_controller = FoldersDialogController(controller)
|
folders_controller = FoldersDialogController(controller)
|
||||||
folders_widget = FoldersWidget(folders_controller, self)
|
folders_widget = FoldersWidget(folders_controller, self)
|
||||||
|
|
@ -59,7 +61,8 @@ class FoldersDialog(QtWidgets.QDialog):
|
||||||
btns_layout.addWidget(cancel_btn)
|
btns_layout.addWidget(cancel_btn)
|
||||||
|
|
||||||
layout = QtWidgets.QVBoxLayout(self)
|
layout = QtWidgets.QVBoxLayout(self)
|
||||||
layout.addWidget(filter_input, 0)
|
layout.setSpacing(5)
|
||||||
|
layout.addWidget(filters_widget, 0)
|
||||||
layout.addWidget(folders_widget, 1)
|
layout.addWidget(folders_widget, 1)
|
||||||
layout.addLayout(btns_layout, 0)
|
layout.addLayout(btns_layout, 0)
|
||||||
|
|
||||||
|
|
@ -68,12 +71,13 @@ class FoldersDialog(QtWidgets.QDialog):
|
||||||
)
|
)
|
||||||
|
|
||||||
folders_widget.double_clicked.connect(self._on_ok_clicked)
|
folders_widget.double_clicked.connect(self._on_ok_clicked)
|
||||||
filter_input.textChanged.connect(self._on_filter_change)
|
filters_widget.text_changed.connect(self._on_filter_change)
|
||||||
|
filters_widget.my_tasks_changed.connect(self._on_my_tasks_change)
|
||||||
ok_btn.clicked.connect(self._on_ok_clicked)
|
ok_btn.clicked.connect(self._on_ok_clicked)
|
||||||
cancel_btn.clicked.connect(self._on_cancel_clicked)
|
cancel_btn.clicked.connect(self._on_cancel_clicked)
|
||||||
|
|
||||||
self._controller = controller
|
self._controller = controller
|
||||||
self._filter_input = filter_input
|
self._filters_widget = filters_widget
|
||||||
self._ok_btn = ok_btn
|
self._ok_btn = ok_btn
|
||||||
self._cancel_btn = cancel_btn
|
self._cancel_btn = cancel_btn
|
||||||
|
|
||||||
|
|
@ -88,6 +92,49 @@ class FoldersDialog(QtWidgets.QDialog):
|
||||||
self._first_show = True
|
self._first_show = True
|
||||||
self._default_height = 500
|
self._default_height = 500
|
||||||
|
|
||||||
|
self._project_name = None
|
||||||
|
|
||||||
|
def showEvent(self, event):
|
||||||
|
"""Refresh folders widget on show."""
|
||||||
|
super().showEvent(event)
|
||||||
|
if self._first_show:
|
||||||
|
self._first_show = False
|
||||||
|
self._on_first_show()
|
||||||
|
# Refresh on show
|
||||||
|
self.reset(False)
|
||||||
|
|
||||||
|
def reset(self, force=True):
|
||||||
|
"""Reset widget."""
|
||||||
|
if not force and not self._soft_reset_enabled:
|
||||||
|
return
|
||||||
|
|
||||||
|
self._project_name = self._controller.get_current_project_name()
|
||||||
|
if self._soft_reset_enabled:
|
||||||
|
self._soft_reset_enabled = False
|
||||||
|
|
||||||
|
self._folders_widget.set_project_name(self._project_name)
|
||||||
|
|
||||||
|
def get_selected_folder_path(self):
|
||||||
|
"""Get selected folder path."""
|
||||||
|
return self._selected_folder_path
|
||||||
|
|
||||||
|
def set_selected_folders(self, folder_paths: list[str]) -> None:
|
||||||
|
"""Change preselected folder before showing the dialog.
|
||||||
|
|
||||||
|
This also resets model and clean filter.
|
||||||
|
"""
|
||||||
|
self.reset(False)
|
||||||
|
self._filters_widget.set_text("")
|
||||||
|
self._filters_widget.set_my_tasks_checked(False)
|
||||||
|
|
||||||
|
folder_id = None
|
||||||
|
for folder_path in folder_paths:
|
||||||
|
folder_id = self._controller.get_folder_id_from_path(folder_path)
|
||||||
|
if folder_id:
|
||||||
|
break
|
||||||
|
if folder_id:
|
||||||
|
self._folders_widget.set_selected_folder(folder_id)
|
||||||
|
|
||||||
def _on_first_show(self):
|
def _on_first_show(self):
|
||||||
center = self.rect().center()
|
center = self.rect().center()
|
||||||
size = self.size()
|
size = self.size()
|
||||||
|
|
@ -103,27 +150,6 @@ class FoldersDialog(QtWidgets.QDialog):
|
||||||
# Change reset enabled so model is reset on show event
|
# Change reset enabled so model is reset on show event
|
||||||
self._soft_reset_enabled = True
|
self._soft_reset_enabled = True
|
||||||
|
|
||||||
def showEvent(self, event):
|
|
||||||
"""Refresh folders widget on show."""
|
|
||||||
super().showEvent(event)
|
|
||||||
if self._first_show:
|
|
||||||
self._first_show = False
|
|
||||||
self._on_first_show()
|
|
||||||
# Refresh on show
|
|
||||||
self.reset(False)
|
|
||||||
|
|
||||||
def reset(self, force=True):
|
|
||||||
"""Reset widget."""
|
|
||||||
if not force and not self._soft_reset_enabled:
|
|
||||||
return
|
|
||||||
|
|
||||||
if self._soft_reset_enabled:
|
|
||||||
self._soft_reset_enabled = False
|
|
||||||
|
|
||||||
self._folders_widget.set_project_name(
|
|
||||||
self._controller.get_current_project_name()
|
|
||||||
)
|
|
||||||
|
|
||||||
def _on_filter_change(self, text):
|
def _on_filter_change(self, text):
|
||||||
"""Trigger change of filter of folders."""
|
"""Trigger change of filter of folders."""
|
||||||
self._folders_widget.set_name_filter(text)
|
self._folders_widget.set_name_filter(text)
|
||||||
|
|
@ -137,22 +163,11 @@ class FoldersDialog(QtWidgets.QDialog):
|
||||||
)
|
)
|
||||||
self.done(1)
|
self.done(1)
|
||||||
|
|
||||||
def set_selected_folders(self, folder_paths):
|
def _on_my_tasks_change(self, enabled: bool) -> None:
|
||||||
"""Change preselected folder before showing the dialog.
|
folder_ids = None
|
||||||
|
if enabled:
|
||||||
This also resets model and clean filter.
|
entity_ids = self._controller.get_my_tasks_entity_ids(
|
||||||
"""
|
self._project_name
|
||||||
self.reset(False)
|
)
|
||||||
self._filter_input.setText("")
|
folder_ids = entity_ids["folder_ids"]
|
||||||
|
self._folders_widget.set_folder_ids_filter(folder_ids)
|
||||||
folder_id = None
|
|
||||||
for folder_path in folder_paths:
|
|
||||||
folder_id = self._controller.get_folder_id_from_path(folder_path)
|
|
||||||
if folder_id:
|
|
||||||
break
|
|
||||||
if folder_id:
|
|
||||||
self._folders_widget.set_selected_folder(folder_id)
|
|
||||||
|
|
||||||
def get_selected_folder_path(self):
|
|
||||||
"""Get selected folder path."""
|
|
||||||
return self._selected_folder_path
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue