Merge branch 'feature/1605-settings-task-types-enum-entity' into feature/895-add-option-to-define-paht-to-workfile-template

This commit is contained in:
Jakub Jezek 2021-05-28 17:04:26 +02:00
commit 8019196a5f
No known key found for this signature in database
GPG key ID: D8548FBF690B100A
29 changed files with 717 additions and 287 deletions

View file

@ -55,6 +55,7 @@
"ftrack"
]
},
"overscan_crop": "",
"width": 0,
"height": 0,
"bg_color": [

View file

@ -103,6 +103,7 @@ from .enum_entity import (
EnumEntity,
AppsEnumEntity,
ToolsEnumEntity,
TaskTypeEnumEntity,
ProvidersEnum
)
@ -154,6 +155,7 @@ __all__ = (
"EnumEntity",
"AppsEnumEntity",
"ToolsEnumEntity",
"TaskTypeEnumEntity",
"ProvidersEnum",
"ListEntity",

View file

@ -111,6 +111,8 @@ class BaseItemEntity(BaseEntity):
self.file_item = None
# Reference to `RootEntity`
self.root_item = None
# Change of value requires restart of OpenPype
self._require_restart_on_change = False
# Entity is in hierarchy of dynamically created entity
self.is_in_dynamic_item = False
@ -171,6 +173,14 @@ class BaseItemEntity(BaseEntity):
roles = [roles]
self.roles = roles
@property
def require_restart_on_change(self):
return self._require_restart_on_change
@property
def require_restart(self):
return False
@property
def has_studio_override(self):
"""Says if entity or it's children has studio overrides."""
@ -261,6 +271,14 @@ class BaseItemEntity(BaseEntity):
self, "Dynamic entity has set `is_group` to true."
)
if (
self.require_restart_on_change
and (self.is_dynamic_item or self.is_in_dynamic_item)
):
raise EntitySchemaError(
self, "Dynamic entity can't require restart."
)
@abstractmethod
def set_override_state(self, state):
"""Set override state and trigger it on children.
@ -788,6 +806,15 @@ class ItemEntity(BaseItemEntity):
# Root item reference
self.root_item = self.parent.root_item
# Item require restart on value change
require_restart_on_change = self.schema_data.get("require_restart")
if (
require_restart_on_change is None
and not (self.is_dynamic_item or self.is_in_dynamic_item)
):
require_restart_on_change = self.parent.require_restart_on_change
self._require_restart_on_change = require_restart_on_change
# File item reference
if self.parent.is_file:
self.file_item = self.parent

View file

@ -439,10 +439,10 @@ class DictMutableKeysEntity(EndpointEntity):
new_initial_value = []
for key, value in _settings_value:
if key in initial_value:
new_initial_value.append(key, initial_value.pop(key))
new_initial_value.append([key, initial_value.pop(key)])
for key, value in initial_value.items():
new_initial_value.append(key, value)
new_initial_value.append([key, value])
initial_value = new_initial_value
else:
initial_value = _settings_value

View file

@ -219,6 +219,40 @@ class ToolsEnumEntity(BaseEnumEntity):
self._current_value = new_value
class TaskTypeEnumEntity(BaseEnumEntity):
schema_types = ["task-types-enum"]
def _item_initalization(self):
self.multiselection = True
self.value_on_not_set = []
self.enum_items = []
self.valid_keys = set()
self.valid_value_types = (list, )
self.placeholder = None
def _get_enum_values(self):
from ..lib import get_default_anatomy_settings
anatomy_settings = get_default_anatomy_settings()
valid_keys = set()
enum_items = []
for task_type, _task_attr in anatomy_settings["tasks"].items():
enum_items.append({task_type: task_type})
valid_keys.add(task_type)
return enum_items, valid_keys
def set_override_state(self, *args, **kwargs):
super(TaskTypeEnumEntity, self).set_override_state(*args, **kwargs)
self.enum_items, self.valid_keys = self._get_enum_values()
new_value = []
for key in self._current_value:
if key in self.valid_keys:
new_value.append(key)
self._current_value = new_value
class ProvidersEnum(BaseEnumEntity):
schema_types = ["providers-enum"]

View file

@ -68,8 +68,18 @@ class EndpointEntity(ItemEntity):
def on_change(self):
for callback in self.on_change_callbacks:
callback()
if self.require_restart_on_change:
if self.require_restart:
self.root_item.add_item_require_restart(self)
else:
self.root_item.remove_item_require_restart(self)
self.parent.on_child_change(self)
@property
def require_restart(self):
return self.has_unsaved_changes
def update_default_value(self, value):
value = self._check_update_value(value, "default")
self._default_value = value
@ -115,6 +125,10 @@ class InputEntity(EndpointEntity):
"""Entity's value without metadata."""
return self._current_value
@property
def require_restart(self):
return self._value_is_modified
def _settings_value(self):
return copy.deepcopy(self.value)

View file

@ -55,6 +55,8 @@ class RootEntity(BaseItemEntity):
def __init__(self, schema_data, reset):
super(RootEntity, self).__init__(schema_data)
self._require_restart_callbacks = []
self._item_ids_require_restart = set()
self._item_initalization()
if reset:
self.reset()
@ -64,6 +66,31 @@ class RootEntity(BaseItemEntity):
"""Current OverrideState."""
return self._override_state
@property
def require_restart(self):
return bool(self._item_ids_require_restart)
def add_require_restart_change_callback(self, callback):
self._require_restart_callbacks.append(callback)
def _on_require_restart_change(self):
for callback in self._require_restart_callbacks:
callback()
def add_item_require_restart(self, item):
was_empty = len(self._item_ids_require_restart) == 0
self._item_ids_require_restart.add(item.id)
if was_empty:
self._on_require_restart_change()
def remove_item_require_restart(self, item):
if item.id not in self._item_ids_require_restart:
return
self._item_ids_require_restart.remove(item.id)
if not self._item_ids_require_restart:
self._on_require_restart_change()
@abstractmethod
def reset(self):
"""Reset values and entities to initial state.

View file

@ -173,6 +173,15 @@
{
"type": "separator"
},
{
"type": "label",
"label": "Crop input overscan. See the documentation for more information."
},
{
"type": "text",
"key": "overscan_crop",
"label": "Overscan crop"
},
{
"type": "label",
"label": "Width and Height must be both set to higher value than 0 else source resolution is used."

View file

@ -3,6 +3,7 @@
"key": "ftrack",
"label": "Ftrack",
"collapsible": true,
"require_restart": true,
"checkbox_key": "enabled",
"children": [
{

View file

@ -34,7 +34,8 @@
"key": "environment",
"label": "Environment",
"type": "raw-json",
"env_group_key": "global"
"env_group_key": "global",
"require_restart": true
},
{
"type": "splitter"
@ -44,7 +45,8 @@
"key": "openpype_path",
"label": "Versions Repository",
"multiplatform": true,
"multipath": true
"multipath": true,
"require_restart": true
}
]
}

View file

@ -10,6 +10,7 @@
"key": "avalon",
"label": "Avalon",
"collapsible": true,
"require_restart": true,
"children": [
{
"type": "number",
@ -35,6 +36,7 @@
"key": "timers_manager",
"label": "Timers Manager",
"collapsible": true,
"require_restart": true,
"checkbox_key": "enabled",
"children": [
{
@ -66,6 +68,7 @@
"key": "clockify",
"label": "Clockify",
"collapsible": true,
"require_restart": true,
"checkbox_key": "enabled",
"children": [
{
@ -84,6 +87,7 @@
"key": "sync_server",
"label": "Site Sync",
"collapsible": true,
"require_restart": true,
"checkbox_key": "enabled",
"children": [
{
@ -114,6 +118,7 @@
"type": "dict",
"key": "deadline",
"label": "Deadline",
"require_restart": true,
"collapsible": true,
"checkbox_key": "enabled",
"children": [
@ -133,6 +138,7 @@
"type": "dict",
"key": "muster",
"label": "Muster",
"require_restart": true,
"collapsible": true,
"checkbox_key": "enabled",
"children": [