mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +01:00
142 lines
4.5 KiB
Python
142 lines
4.5 KiB
Python
import os
|
|
from openpype.settings import get_local_settings
|
|
|
|
# Constant key under which local settings are stored
|
|
LOCAL_EXPERIMENTAL_KEY = "experimental_tools"
|
|
|
|
|
|
class ExperimentalTool:
|
|
"""Definition of experimental tool.
|
|
|
|
Definition is used in local settings and in experimental tools dialog.
|
|
|
|
Args:
|
|
identifier (str): String identifier of tool (unique).
|
|
label (str): Label shown in UI.
|
|
callback (function): Callback for UI button.
|
|
tooltip (str): Tooltip showed on button.
|
|
hosts_filter (list): List of host names for which is tool available.
|
|
Some tools may not be available in all hosts.
|
|
"""
|
|
def __init__(
|
|
self, identifier, label, callback, tooltip, hosts_filter=None
|
|
):
|
|
self.identifier = identifier
|
|
self.label = label
|
|
self.callback = callback
|
|
self.tooltip = tooltip
|
|
self.hosts_filter = hosts_filter
|
|
self._enabled = True
|
|
|
|
def is_available_for_host(self, host_name):
|
|
if self.hosts_filter:
|
|
return host_name in self.hosts_filter
|
|
return True
|
|
|
|
@property
|
|
def enabled(self):
|
|
"""Is tool enabled and button is clickable."""
|
|
return self._enabled
|
|
|
|
def set_enabled(self, enabled=True):
|
|
"""Change if tool is enabled."""
|
|
self._enabled = enabled
|
|
|
|
def execute(self):
|
|
"""Trigger registerd callback."""
|
|
self.callback()
|
|
|
|
|
|
class ExperimentalTools:
|
|
"""Wrapper around experimental tools.
|
|
|
|
To add/remove experimental tool just add/remove tool to
|
|
`experimental_tools` variable in __init__ function.
|
|
|
|
Args:
|
|
parent (QtWidgets.QWidget): Parent widget for tools.
|
|
host_name (str): Name of host in which context we're now. Environment
|
|
value 'AVALON_APP' is used when not passed.
|
|
filter_hosts (bool): Should filter tools. By default is set to 'True'
|
|
when 'host_name' is passed. Is always set to 'False' if 'host_name'
|
|
is not defined.
|
|
"""
|
|
def __init__(self, parent=None, host_name=None, filter_hosts=None):
|
|
# Definition of experimental tools
|
|
experimental_tools = []
|
|
|
|
# --- Example tool (callback will just print on click) ---
|
|
# def example_callback(*args):
|
|
# print("Triggered tool")
|
|
#
|
|
# experimental_tools = [
|
|
# ExperimentalTool(
|
|
# "example",
|
|
# "Exmaple experimental tool",
|
|
# example_callback,
|
|
# "Example tool tooltip."
|
|
# )
|
|
# ]
|
|
|
|
# Try to get host name from env variable `AVALON_APP`
|
|
if not host_name:
|
|
host_name = os.environ.get("AVALON_APP")
|
|
|
|
# Decide if filtering by host name should happen
|
|
if filter_hosts is None:
|
|
filter_hosts = host_name is not None
|
|
|
|
if filter_hosts and not host_name:
|
|
filter_hosts = False
|
|
|
|
# Filter tools by host name
|
|
if filter_hosts:
|
|
experimental_tools = [
|
|
tool
|
|
for tool in experimental_tools
|
|
if tool.is_available_for_host(host_name)
|
|
]
|
|
|
|
# Store tools by identifier
|
|
tools_by_identifier = {}
|
|
for tool in experimental_tools:
|
|
if tool.identifier in tools_by_identifier:
|
|
raise KeyError((
|
|
"Duplicated experimental tool identifier \"{}\""
|
|
).format(tool.identifier))
|
|
tools_by_identifier[tool.identifier] = tool
|
|
|
|
self._tools_by_identifier = tools_by_identifier
|
|
self._tools = experimental_tools
|
|
self._parent_widget = parent
|
|
|
|
@property
|
|
def tools(self):
|
|
"""Tools in list.
|
|
|
|
Returns:
|
|
list: Tools filtered by host name if filtering was enabled
|
|
on initialization.
|
|
"""
|
|
return self._tools
|
|
|
|
@property
|
|
def tools_by_identifier(self):
|
|
"""Tools by their identifier.
|
|
|
|
Returns:
|
|
dict: Tools by identifier filtered by host name if filtering
|
|
was enabled on initialization.
|
|
"""
|
|
return self._tools_by_identifier
|
|
|
|
def refresh_availability(self):
|
|
"""Reload local settings and check if any tool changed ability."""
|
|
local_settings = get_local_settings()
|
|
experimental_settings = (
|
|
local_settings.get(LOCAL_EXPERIMENTAL_KEY)
|
|
) or {}
|
|
|
|
for identifier, eperimental_tool in self.tools_by_identifier.items():
|
|
enabled = experimental_settings.get(identifier, False)
|
|
eperimental_tool.set_enabled(enabled)
|