mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +01:00
Merge branch 'develop' into enhancement/OP-8205_Hiero-use-AYON-settings
This commit is contained in:
commit
b01865c7f2
8 changed files with 158 additions and 42 deletions
|
|
@ -612,7 +612,7 @@ def get_load_color_for_family(family, settings=None):
|
||||||
else:
|
else:
|
||||||
raise ValueError("Invalid color definition {}".format(str(color)))
|
raise ValueError("Invalid color definition {}".format(str(color)))
|
||||||
|
|
||||||
if type(red, int):
|
if isinstance(red, int):
|
||||||
red = red / 255.0
|
red = red / 255.0
|
||||||
green = green / 255.0
|
green = green / 255.0
|
||||||
blue = blue / 255.0
|
blue = blue / 255.0
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import six
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from ayon_core.lib import requests_get, Logger
|
from ayon_core.lib import requests_get, Logger
|
||||||
from ayon_core.modules import OpenPypeModule, IPluginPaths
|
from ayon_core.modules import AYONAddon, IPluginPaths
|
||||||
|
|
||||||
|
|
||||||
class DeadlineWebserviceError(Exception):
|
class DeadlineWebserviceError(Exception):
|
||||||
|
|
@ -13,28 +13,28 @@ class DeadlineWebserviceError(Exception):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
class DeadlineModule(OpenPypeModule, IPluginPaths):
|
class DeadlineModule(AYONAddon, IPluginPaths):
|
||||||
name = "deadline"
|
name = "deadline"
|
||||||
|
|
||||||
def __init__(self, manager, settings):
|
def initialize(self, studio_settings):
|
||||||
self.deadline_urls = {}
|
|
||||||
super(DeadlineModule, self).__init__(manager, settings)
|
|
||||||
|
|
||||||
def initialize(self, modules_settings):
|
|
||||||
# This module is always enabled
|
# This module is always enabled
|
||||||
deadline_settings = modules_settings[self.name]
|
deadline_urls = {}
|
||||||
self.enabled = deadline_settings["enabled"]
|
enabled = self.name in studio_settings
|
||||||
deadline_url = deadline_settings.get("DEADLINE_REST_URL")
|
if enabled:
|
||||||
if deadline_url:
|
deadline_settings = studio_settings[self.name]
|
||||||
self.deadline_urls = {"default": deadline_url}
|
deadline_urls = {
|
||||||
else:
|
url_item["name"]: url_item["value"]
|
||||||
self.deadline_urls = deadline_settings.get("deadline_urls") # noqa: E501
|
for url_item in deadline_settings["deadline_urls"]
|
||||||
|
}
|
||||||
|
|
||||||
if not self.deadline_urls:
|
if enabled and not deadline_urls:
|
||||||
self.enabled = False
|
enabled = False
|
||||||
self.log.warning(("default Deadline Webservice URL "
|
self.log.warning((
|
||||||
"not specified. Disabling module."))
|
"Deadline Webservice URLs are not specified. Disabling addon."
|
||||||
return
|
))
|
||||||
|
|
||||||
|
self.enabled = enabled
|
||||||
|
self.deadline_urls = deadline_urls
|
||||||
|
|
||||||
def get_plugin_paths(self):
|
def get_plugin_paths(self):
|
||||||
"""Deadline plugin paths."""
|
"""Deadline plugin paths."""
|
||||||
|
|
|
||||||
|
|
@ -47,11 +47,11 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin):
|
||||||
deadline_settings = (
|
deadline_settings = (
|
||||||
render_instance.context.data
|
render_instance.context.data
|
||||||
["system_settings"]
|
["system_settings"]
|
||||||
["modules"]
|
|
||||||
["deadline"]
|
["deadline"]
|
||||||
)
|
)
|
||||||
|
|
||||||
default_server = render_instance.context.data["defaultDeadline"]
|
default_server = render_instance.context.data["defaultDeadline"]
|
||||||
|
# QUESTION How and where is this is set? Should be removed?
|
||||||
instance_server = render_instance.data.get("deadlineServers")
|
instance_server = render_instance.data.get("deadlineServers")
|
||||||
if not instance_server:
|
if not instance_server:
|
||||||
self.log.debug("Using default server.")
|
self.log.debug("Using default server.")
|
||||||
|
|
@ -64,7 +64,10 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin):
|
||||||
asString=True
|
asString=True
|
||||||
)
|
)
|
||||||
|
|
||||||
default_servers = deadline_settings["deadline_urls"]
|
default_servers = {
|
||||||
|
url_item["name"]: url_item["value"]
|
||||||
|
for url_item in deadline_settings["deadline_urls"]
|
||||||
|
}
|
||||||
project_servers = (
|
project_servers = (
|
||||||
render_instance.context.data
|
render_instance.context.data
|
||||||
["project_settings"]
|
["project_settings"]
|
||||||
|
|
|
||||||
|
|
@ -62,22 +62,6 @@ def _convert_general(ayon_settings, output, default_settings):
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def _convert_deadline_system_settings(
|
|
||||||
ayon_settings, output, addon_versions, default_settings
|
|
||||||
):
|
|
||||||
enabled = addon_versions.get("deadline") is not None
|
|
||||||
deadline_settings = default_settings["modules"]["deadline"]
|
|
||||||
deadline_settings["enabled"] = enabled
|
|
||||||
if enabled:
|
|
||||||
ayon_deadline = ayon_settings["deadline"]
|
|
||||||
deadline_settings["deadline_urls"] = {
|
|
||||||
item["name"]: item["value"]
|
|
||||||
for item in ayon_deadline["deadline_urls"]
|
|
||||||
}
|
|
||||||
|
|
||||||
output["modules"]["deadline"] = deadline_settings
|
|
||||||
|
|
||||||
|
|
||||||
def _convert_royalrender_system_settings(
|
def _convert_royalrender_system_settings(
|
||||||
ayon_settings, output, addon_versions, default_settings
|
ayon_settings, output, addon_versions, default_settings
|
||||||
):
|
):
|
||||||
|
|
@ -99,7 +83,6 @@ def _convert_modules_system(
|
||||||
# TODO add all modules
|
# TODO add all modules
|
||||||
# TODO add 'enabled' values
|
# TODO add 'enabled' values
|
||||||
for func in (
|
for func in (
|
||||||
_convert_deadline_system_settings,
|
|
||||||
_convert_royalrender_system_settings,
|
_convert_royalrender_system_settings,
|
||||||
):
|
):
|
||||||
func(ayon_settings, output, addon_versions, default_settings)
|
func(ayon_settings, output, addon_versions, default_settings)
|
||||||
|
|
@ -107,6 +90,7 @@ def _convert_modules_system(
|
||||||
for key in {
|
for key in {
|
||||||
"timers_manager",
|
"timers_manager",
|
||||||
"clockify",
|
"clockify",
|
||||||
|
"deadline",
|
||||||
}:
|
}:
|
||||||
if addon_versions.get(key):
|
if addon_versions.get(key):
|
||||||
output[key] = ayon_settings
|
output[key] = ayon_settings
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ from .folders_widget import (
|
||||||
FoldersWidget,
|
FoldersWidget,
|
||||||
FoldersQtModel,
|
FoldersQtModel,
|
||||||
FOLDERS_MODEL_SENDER_NAME,
|
FOLDERS_MODEL_SENDER_NAME,
|
||||||
|
SimpleFoldersWidget,
|
||||||
)
|
)
|
||||||
|
|
||||||
from .tasks_widget import (
|
from .tasks_widget import (
|
||||||
|
|
@ -31,6 +32,7 @@ __all__ = (
|
||||||
"FoldersWidget",
|
"FoldersWidget",
|
||||||
"FoldersQtModel",
|
"FoldersQtModel",
|
||||||
"FOLDERS_MODEL_SENDER_NAME",
|
"FOLDERS_MODEL_SENDER_NAME",
|
||||||
|
"SimpleFoldersWidget",
|
||||||
|
|
||||||
"TasksWidget",
|
"TasksWidget",
|
||||||
"TasksQtModel",
|
"TasksQtModel",
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,11 @@ import collections
|
||||||
|
|
||||||
from qtpy import QtWidgets, QtGui, QtCore
|
from qtpy import QtWidgets, QtGui, QtCore
|
||||||
|
|
||||||
|
from ayon_core.lib.events import QueuedEventSystem
|
||||||
|
from ayon_core.tools.ayon_utils.models import (
|
||||||
|
HierarchyModel,
|
||||||
|
HierarchyExpectedSelection,
|
||||||
|
)
|
||||||
from ayon_core.tools.utils import (
|
from ayon_core.tools.utils import (
|
||||||
RecursiveSortFilterProxyModel,
|
RecursiveSortFilterProxyModel,
|
||||||
TreeView,
|
TreeView,
|
||||||
|
|
@ -390,6 +395,15 @@ class FoldersWidget(QtWidgets.QWidget):
|
||||||
|
|
||||||
return self._get_selected_item_id()
|
return self._get_selected_item_id()
|
||||||
|
|
||||||
|
def get_selected_folder_path(self):
|
||||||
|
"""Get selected folder id.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Union[str, None]: Folder path which is selected.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return self._get_selected_item_value(FOLDER_PATH_ROLE)
|
||||||
|
|
||||||
def get_selected_folder_label(self):
|
def get_selected_folder_label(self):
|
||||||
"""Selected folder label.
|
"""Selected folder label.
|
||||||
|
|
||||||
|
|
@ -473,9 +487,12 @@ class FoldersWidget(QtWidgets.QWidget):
|
||||||
self.refreshed.emit()
|
self.refreshed.emit()
|
||||||
|
|
||||||
def _get_selected_item_id(self):
|
def _get_selected_item_id(self):
|
||||||
|
return self._get_selected_item_value(FOLDER_ID_ROLE)
|
||||||
|
|
||||||
|
def _get_selected_item_value(self, role):
|
||||||
selection_model = self._folders_view.selectionModel()
|
selection_model = self._folders_view.selectionModel()
|
||||||
for index in selection_model.selectedIndexes():
|
for index in selection_model.selectedIndexes():
|
||||||
item_id = index.data(FOLDER_ID_ROLE)
|
item_id = index.data(role)
|
||||||
if item_id is not None:
|
if item_id is not None:
|
||||||
return item_id
|
return item_id
|
||||||
return None
|
return None
|
||||||
|
|
@ -514,3 +531,110 @@ class FoldersWidget(QtWidgets.QWidget):
|
||||||
if folder_id is not None:
|
if folder_id is not None:
|
||||||
self.set_selected_folder(folder_id)
|
self.set_selected_folder(folder_id)
|
||||||
self._controller.expected_folder_selected(folder_id)
|
self._controller.expected_folder_selected(folder_id)
|
||||||
|
|
||||||
|
|
||||||
|
class SimpleSelectionModel(object):
|
||||||
|
"""Model handling selection changes.
|
||||||
|
|
||||||
|
Triggering events:
|
||||||
|
- "selection.project.changed"
|
||||||
|
- "selection.folder.changed"
|
||||||
|
"""
|
||||||
|
|
||||||
|
event_source = "selection.model"
|
||||||
|
|
||||||
|
def __init__(self, controller):
|
||||||
|
self._controller = controller
|
||||||
|
|
||||||
|
self._project_name = None
|
||||||
|
self._folder_id = None
|
||||||
|
self._task_id = None
|
||||||
|
self._task_name = None
|
||||||
|
|
||||||
|
def get_selected_project_name(self):
|
||||||
|
return self._project_name
|
||||||
|
|
||||||
|
def set_selected_project(self, project_name):
|
||||||
|
self._project_name = project_name
|
||||||
|
self._controller.emit_event(
|
||||||
|
"selection.project.changed",
|
||||||
|
{"project_name": project_name},
|
||||||
|
self.event_source
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_selected_folder_id(self):
|
||||||
|
return self._folder_id
|
||||||
|
|
||||||
|
def set_selected_folder(self, folder_id):
|
||||||
|
if folder_id == self._folder_id:
|
||||||
|
return
|
||||||
|
self._folder_id = folder_id
|
||||||
|
self._controller.emit_event(
|
||||||
|
"selection.folder.changed",
|
||||||
|
{
|
||||||
|
"project_name": self._project_name,
|
||||||
|
"folder_id": folder_id,
|
||||||
|
},
|
||||||
|
self.event_source
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class SimpleFoldersController(object):
|
||||||
|
def __init__(self):
|
||||||
|
self._event_system = self._create_event_system()
|
||||||
|
self._hierarchy_model = HierarchyModel(self)
|
||||||
|
self._selection_model = SimpleSelectionModel(self)
|
||||||
|
self._expected_selection = HierarchyExpectedSelection(
|
||||||
|
self, handle_project=False, handle_folder=True, handle_task=False
|
||||||
|
)
|
||||||
|
|
||||||
|
def emit_event(self, topic, data=None, source=None):
|
||||||
|
"""Use implemented event system to trigger event."""
|
||||||
|
|
||||||
|
if data is None:
|
||||||
|
data = {}
|
||||||
|
self._event_system.emit(topic, data, source)
|
||||||
|
|
||||||
|
def register_event_callback(self, topic, callback):
|
||||||
|
self._event_system.add_callback(topic, callback)
|
||||||
|
|
||||||
|
# Model functions
|
||||||
|
def get_folder_items(self, project_name, sender=None):
|
||||||
|
return self._hierarchy_model.get_folder_items(project_name, sender)
|
||||||
|
|
||||||
|
def set_selected_project(self, project_name):
|
||||||
|
self._selection_model.set_selected_project(project_name)
|
||||||
|
|
||||||
|
def set_selected_folder(self, folder_id):
|
||||||
|
self._selection_model.set_selected_folder(folder_id)
|
||||||
|
|
||||||
|
def get_expected_selection_data(self):
|
||||||
|
self._expected_selection.get_expected_selection_data()
|
||||||
|
|
||||||
|
def expected_folder_selected(self, folder_id):
|
||||||
|
self._expected_selection.expected_folder_selected(folder_id)
|
||||||
|
|
||||||
|
def _create_event_system(self):
|
||||||
|
return QueuedEventSystem()
|
||||||
|
|
||||||
|
|
||||||
|
class SimpleFoldersWidget(FoldersWidget):
|
||||||
|
def __init__(self, controller=None, *args, **kwargs):
|
||||||
|
if controller is None:
|
||||||
|
controller = SimpleFoldersController()
|
||||||
|
super(SimpleFoldersWidget, self).__init__(controller, *args, **kwargs)
|
||||||
|
|
||||||
|
def set_project_name(self, project_name):
|
||||||
|
self._controller.set_selected_project(project_name)
|
||||||
|
super(SimpleFoldersWidget, self).set_project_name(project_name)
|
||||||
|
|
||||||
|
def _on_project_selection_change(self, event):
|
||||||
|
"""Ignore project selection change from controller.
|
||||||
|
|
||||||
|
Only who can trigger project change is this widget with
|
||||||
|
'set_project_name' which already cares about project change.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
event (Event): Triggered event.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
|
||||||
|
|
@ -191,8 +191,11 @@ def create_addon_package(
|
||||||
|
|
||||||
# Copy server content
|
# Copy server content
|
||||||
package_py = addon_output_dir / "package.py"
|
package_py = addon_output_dir / "package.py"
|
||||||
|
addon_name = addon_dir.name
|
||||||
|
if addon_name == "royal_render":
|
||||||
|
addon_name = "royalrender"
|
||||||
package_py_content = PACKAGE_PY_TEMPLATE.format(
|
package_py_content = PACKAGE_PY_TEMPLATE.format(
|
||||||
addon_name=addon_dir.name, addon_version=addon_version
|
addon_name=addon_name, addon_version=addon_version
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(package_py, "w+") as pkg_py:
|
with open(package_py, "w+") as pkg_py:
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
from ayon_server.settings import BaseSettingsModel, SettingsField
|
from ayon_server.settings import BaseSettingsModel, SettingsField
|
||||||
from ayon_server.types import ColorRGB_float
|
from ayon_server.types import ColorRGB_float, ColorRGBA_uint8
|
||||||
|
|
||||||
|
|
||||||
class ColorsSetting(BaseSettingsModel):
|
class ColorsSetting(BaseSettingsModel):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue