mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-26 05:42:15 +01:00
Merge pull request #1014 from pypeclub/feature/1010-unify-the-use-of-single-and-multi-root-templates
Unify the use of single and multi root templates
This commit is contained in:
commit
fbd3a09eb3
4 changed files with 59 additions and 239 deletions
|
|
@ -1,5 +1,7 @@
|
|||
{
|
||||
"windows": "C:/projects",
|
||||
"darwin": "/Volumes/path",
|
||||
"linux": "/mnt/share/projects"
|
||||
"work": {
|
||||
"windows": "C:/projects",
|
||||
"darwin": "/Volumes/path",
|
||||
"linux": "/mnt/share/projects"
|
||||
}
|
||||
}
|
||||
|
|
@ -4,23 +4,23 @@
|
|||
"frame_padding": 4,
|
||||
"frame": "{frame:0>{@frame_padding}}",
|
||||
"work": {
|
||||
"folder": "{root}/{project[name]}/{hierarchy}/{asset}/work/{task}",
|
||||
"folder": "{root[work]}/{project[name]}/{hierarchy}/{asset}/work/{task}",
|
||||
"file": "{project[code]}_{asset}_{task}_{@version}<_{comment}>.{ext}",
|
||||
"path": "{@folder}/{@file}"
|
||||
},
|
||||
"render": {
|
||||
"folder": "{root}/{project[name]}/{hierarchy}/{asset}/publish/render/{subset}/{@version}",
|
||||
"folder": "{root[work]}/{project[name]}/{hierarchy}/{asset}/publish/render/{subset}/{@version}",
|
||||
"file": "{project[code]}_{asset}_{subset}_{@version}<_{output}><.{@frame}>.{ext}",
|
||||
"path": "{@folder}/{@file}"
|
||||
},
|
||||
"publish": {
|
||||
"folder": "{root}/{project[name]}/{hierarchy}/{asset}/publish/{family}/{subset}/{@version}",
|
||||
"folder": "{root[work]}/{project[name]}/{hierarchy}/{asset}/publish/{family}/{subset}/{@version}",
|
||||
"file": "{project[code]}_{asset}_{subset}_{@version}<_{output}><.{@frame}>.{ext}",
|
||||
"path": "{@folder}/{@file}",
|
||||
"thumbnail": "{thumbnail_root}/{project[name]}/{_id}_{thumbnail_type}.{ext}"
|
||||
},
|
||||
"master": {
|
||||
"folder": "{root}/{project[name]}/{hierarchy}/{asset}/publish/{family}/{subset}/master",
|
||||
"folder": "{root[work]}/{project[name]}/{hierarchy}/{asset}/publish/{family}/{subset}/master",
|
||||
"file": "{project[code]}_{asset}_{subset}_master<_{output}><.{frame}>.{ext}",
|
||||
"path": "{@folder}/{@file}"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -333,7 +333,14 @@ def get_default_anatomy_settings(clear_metadata=True):
|
|||
"""Project anatomy data with applied studio's default project overrides."""
|
||||
default_values = get_default_settings()[PROJECT_ANATOMY_KEY]
|
||||
studio_values = get_studio_project_anatomy_overrides()
|
||||
result = apply_overrides(default_values, studio_values)
|
||||
|
||||
# TODO uncomment and remove hotfix result when overrides of anatomy
|
||||
# are stored correctly.
|
||||
# result = apply_overrides(default_values, studio_values)
|
||||
result = copy.deepcopy(default_values)
|
||||
if studio_values:
|
||||
for key, value in studio_values.items():
|
||||
result[key] = value
|
||||
if clear_metadata:
|
||||
clear_metadata_from_settings(result)
|
||||
return result
|
||||
|
|
@ -352,7 +359,13 @@ def get_anatomy_settings(project_name, clear_metadata=True):
|
|||
project_name
|
||||
)
|
||||
|
||||
result = apply_overrides(studio_overrides, project_overrides)
|
||||
# TODO uncomment and remove hotfix result when overrides of anatomy
|
||||
# are stored correctly.
|
||||
# result = apply_overrides(studio_overrides, project_overrides)
|
||||
result = copy.deepcopy(studio_overrides)
|
||||
if project_overrides:
|
||||
for key, value in project_overrides.items():
|
||||
result[key] = value
|
||||
if clear_metadata:
|
||||
clear_metadata_from_settings(result)
|
||||
return result
|
||||
|
|
|
|||
|
|
@ -250,35 +250,12 @@ class RootsWidget(QtWidgets.QWidget, SettingObject):
|
|||
|
||||
self.key = input_data["key"]
|
||||
|
||||
self._multiroot_state = None
|
||||
self.default_is_multiroot = False
|
||||
self.studio_is_multiroot = False
|
||||
self.was_multiroot = NOT_SET
|
||||
|
||||
def create_ui(self, _label_widget=None):
|
||||
checkbox_widget = QtWidgets.QWidget(self)
|
||||
multiroot_label = QtWidgets.QLabel(
|
||||
"Use multiple roots", checkbox_widget
|
||||
)
|
||||
multiroot_checkbox = QtWidgets.QCheckBox(checkbox_widget)
|
||||
|
||||
checkbox_layout = QtWidgets.QHBoxLayout(checkbox_widget)
|
||||
checkbox_layout.addWidget(multiroot_label, 0)
|
||||
checkbox_layout.addWidget(multiroot_checkbox, 1)
|
||||
|
||||
body_widget = ExpandingWidget("Roots", self)
|
||||
content_widget = QtWidgets.QWidget(body_widget)
|
||||
|
||||
path_widget_data = {
|
||||
"key": self.key,
|
||||
"multipath": False,
|
||||
"multiplatform": True
|
||||
}
|
||||
singleroot_widget = PathWidget(
|
||||
path_widget_data, self,
|
||||
as_widget=True, parent_widget=content_widget
|
||||
)
|
||||
singleroot_widget.create_ui()
|
||||
multiroot_data = {
|
||||
"key": self.key,
|
||||
"expandable": False,
|
||||
|
|
@ -287,17 +264,15 @@ class RootsWidget(QtWidgets.QWidget, SettingObject):
|
|||
"multiplatform": True
|
||||
}
|
||||
}
|
||||
multiroot_widget = ModifiableDict(
|
||||
roots_widget = ModifiableDict(
|
||||
multiroot_data, self,
|
||||
as_widget=True, parent_widget=content_widget
|
||||
)
|
||||
multiroot_widget.create_ui()
|
||||
roots_widget.create_ui()
|
||||
|
||||
content_layout = QtWidgets.QVBoxLayout(content_widget)
|
||||
content_layout.setContentsMargins(0, 0, 0, 0)
|
||||
content_layout.addWidget(checkbox_widget)
|
||||
content_layout.addWidget(singleroot_widget)
|
||||
content_layout.addWidget(multiroot_widget)
|
||||
content_layout.addWidget(roots_widget)
|
||||
|
||||
body_widget.set_content_widget(content_widget)
|
||||
self.label_widget = body_widget.label_widget
|
||||
|
|
@ -307,24 +282,11 @@ class RootsWidget(QtWidgets.QWidget, SettingObject):
|
|||
main_layout.addWidget(body_widget)
|
||||
|
||||
self.body_widget = body_widget
|
||||
self.multiroot_label = multiroot_label
|
||||
self.multiroot_checkbox = multiroot_checkbox
|
||||
self.singleroot_widget = singleroot_widget
|
||||
self.multiroot_widget = multiroot_widget
|
||||
|
||||
multiroot_checkbox.stateChanged.connect(self._on_multiroot_checkbox)
|
||||
singleroot_widget.value_changed.connect(self._on_value_change)
|
||||
multiroot_widget.value_changed.connect(self._on_value_change)
|
||||
|
||||
self._on_multiroot_checkbox()
|
||||
|
||||
@property
|
||||
def is_multiroot(self):
|
||||
return self.multiroot_checkbox.isChecked()
|
||||
self.roots_widget = roots_widget
|
||||
roots_widget.value_changed.connect(self._on_value_change)
|
||||
|
||||
def update_default_values(self, parent_values):
|
||||
self._state = None
|
||||
self._multiroot_state = None
|
||||
self._is_modified = False
|
||||
|
||||
if isinstance(parent_values, dict):
|
||||
|
|
@ -332,35 +294,25 @@ class RootsWidget(QtWidgets.QWidget, SettingObject):
|
|||
else:
|
||||
value = NOT_SET
|
||||
|
||||
is_multiroot = False
|
||||
self._has_studio_override = False
|
||||
self._had_studio_override = False
|
||||
|
||||
is_multiroot = True
|
||||
# Backward compatibility: Allow to switch to multiroot
|
||||
if isinstance(value, dict):
|
||||
is_multiroot = False
|
||||
for _value in value.values():
|
||||
if isinstance(_value, dict):
|
||||
is_multiroot = True
|
||||
break
|
||||
|
||||
self.default_is_multiroot = is_multiroot
|
||||
self.was_multiroot = is_multiroot
|
||||
self.set_multiroot(is_multiroot)
|
||||
if not is_multiroot:
|
||||
value = {"": value}
|
||||
|
||||
self._has_studio_override = False
|
||||
self._had_studio_override = False
|
||||
if is_multiroot:
|
||||
for _value in value.values():
|
||||
singleroot_value = _value
|
||||
break
|
||||
|
||||
multiroot_value = value
|
||||
else:
|
||||
singleroot_value = value
|
||||
multiroot_value = {"": value}
|
||||
|
||||
self.singleroot_widget.update_default_values(singleroot_value)
|
||||
self.multiroot_widget.update_default_values(multiroot_value)
|
||||
self.roots_widget.update_default_values(value)
|
||||
|
||||
def update_studio_values(self, parent_values):
|
||||
self._state = None
|
||||
self._multiroot_state = None
|
||||
self._is_modified = False
|
||||
|
||||
if isinstance(parent_values, dict):
|
||||
|
|
@ -368,81 +320,29 @@ class RootsWidget(QtWidgets.QWidget, SettingObject):
|
|||
else:
|
||||
value = NOT_SET
|
||||
|
||||
if value is NOT_SET:
|
||||
is_multiroot = self.default_is_multiroot
|
||||
self.studio_is_multiroot = NOT_SET
|
||||
self._has_studio_override = False
|
||||
self._had_studio_override = False
|
||||
else:
|
||||
is_multiroot = False
|
||||
if isinstance(value, dict):
|
||||
for _value in value.values():
|
||||
if isinstance(_value, dict):
|
||||
is_multiroot = True
|
||||
break
|
||||
self.studio_is_multiroot = is_multiroot
|
||||
self._has_studio_override = True
|
||||
self._had_studio_override = True
|
||||
self._has_studio_override = value is not NOT_SET
|
||||
self._had_studio_override = value is not NOT_SET
|
||||
|
||||
self.was_multiroot = is_multiroot
|
||||
self.set_multiroot(is_multiroot)
|
||||
|
||||
if is_multiroot:
|
||||
self.multiroot_widget.update_studio_values(value)
|
||||
else:
|
||||
self.singleroot_widget.update_studio_values(value)
|
||||
self.roots_widget.update_studio_values(value)
|
||||
|
||||
def apply_overrides(self, parent_values):
|
||||
# Make sure this is set to False
|
||||
self._state = None
|
||||
self._multiroot_state = None
|
||||
self._is_modified = False
|
||||
|
||||
value = NOT_SET
|
||||
if parent_values is not NOT_SET:
|
||||
value = parent_values.get(self.key, value)
|
||||
|
||||
if value is NOT_SET:
|
||||
is_multiroot = self.studio_is_multiroot
|
||||
if is_multiroot is NOT_SET:
|
||||
is_multiroot = self.default_is_multiroot
|
||||
else:
|
||||
is_multiroot = False
|
||||
if isinstance(value, dict):
|
||||
for _value in value.values():
|
||||
if isinstance(_value, dict):
|
||||
is_multiroot = True
|
||||
break
|
||||
|
||||
self.was_multiroot = is_multiroot
|
||||
self.set_multiroot(is_multiroot)
|
||||
|
||||
if is_multiroot:
|
||||
self._is_overriden = value is not NOT_SET
|
||||
self._was_overriden = bool(self._is_overriden)
|
||||
self.multiroot_widget.apply_overrides(value)
|
||||
else:
|
||||
self._is_overriden = value is not NOT_SET
|
||||
self._was_overriden = bool(self._is_overriden)
|
||||
self.singleroot_widget.apply_overrides(value)
|
||||
self._is_overriden = value is not NOT_SET
|
||||
self._was_overriden = bool(self._is_overriden)
|
||||
self.roots_widget.apply_overrides(value)
|
||||
|
||||
def hierarchical_style_update(self):
|
||||
self.singleroot_widget.hierarchical_style_update()
|
||||
self.multiroot_widget.hierarchical_style_update()
|
||||
self.roots_widget.hierarchical_style_update()
|
||||
self.update_style()
|
||||
|
||||
def update_style(self):
|
||||
multiroot_state = self.style_state(
|
||||
self.has_studio_override,
|
||||
False,
|
||||
False,
|
||||
self.was_multiroot != self.is_multiroot
|
||||
)
|
||||
if multiroot_state != self._multiroot_state:
|
||||
self.multiroot_label.setProperty("state", multiroot_state)
|
||||
self.multiroot_label.style().polish(self.multiroot_label)
|
||||
self._multiroot_state = multiroot_state
|
||||
|
||||
state = self.style_state(
|
||||
self.has_studio_override,
|
||||
self.child_invalid,
|
||||
|
|
@ -467,162 +367,67 @@ class RootsWidget(QtWidgets.QWidget, SettingObject):
|
|||
|
||||
self._state = state
|
||||
|
||||
def _on_multiroot_checkbox(self):
|
||||
self.set_multiroot()
|
||||
|
||||
def _on_value_change(self, item=None):
|
||||
if self.ignore_value_changes:
|
||||
return
|
||||
|
||||
if item is not None and (
|
||||
(self.is_multiroot and item != self.multiroot_widget)
|
||||
or (not self.is_multiroot and item != self.singleroot_widget)
|
||||
):
|
||||
return
|
||||
|
||||
if self.is_group and self.is_overidable:
|
||||
self._is_overriden = True
|
||||
|
||||
self._is_modified = (
|
||||
self.was_multiroot != self.is_multiroot
|
||||
or self.child_modified
|
||||
)
|
||||
self._is_modified = bool(self.child_modified)
|
||||
|
||||
self.update_style()
|
||||
|
||||
self.value_changed.emit(self)
|
||||
|
||||
def _from_single_to_multi(self):
|
||||
single_value = self.singleroot_widget.item_value()
|
||||
mutli_value = self.multiroot_widget.item_value()
|
||||
first_key = None
|
||||
for key in mutli_value.keys():
|
||||
first_key = key
|
||||
break
|
||||
|
||||
if first_key is None:
|
||||
first_key = ""
|
||||
|
||||
mutli_value[first_key] = single_value
|
||||
|
||||
self.multiroot_widget.set_value(mutli_value)
|
||||
|
||||
def _from_multi_to_single(self):
|
||||
mutli_value = self.multiroot_widget.all_item_values()
|
||||
for value in mutli_value.values():
|
||||
single_value = value
|
||||
break
|
||||
|
||||
self.singleroot_widget.set_value(single_value)
|
||||
|
||||
def set_multiroot(self, is_multiroot=None):
|
||||
if is_multiroot is None:
|
||||
is_multiroot = self.is_multiroot
|
||||
if is_multiroot:
|
||||
self._from_single_to_multi()
|
||||
else:
|
||||
self._from_multi_to_single()
|
||||
|
||||
if is_multiroot != self.is_multiroot:
|
||||
self.multiroot_checkbox.setChecked(is_multiroot)
|
||||
|
||||
self.singleroot_widget.setVisible(not is_multiroot)
|
||||
self.multiroot_widget.setVisible(is_multiroot)
|
||||
|
||||
self._on_value_change()
|
||||
|
||||
@property
|
||||
def child_has_studio_override(self):
|
||||
if self.is_multiroot:
|
||||
return self.multiroot_widget.has_studio_override
|
||||
else:
|
||||
return self.singleroot_widget.has_studio_override
|
||||
return self.roots_widget.has_studio_override
|
||||
|
||||
@property
|
||||
def child_modified(self):
|
||||
if self.is_multiroot:
|
||||
return self.multiroot_widget.child_modified
|
||||
else:
|
||||
return self.singleroot_widget.child_modified
|
||||
return self.roots_widget.child_modified
|
||||
|
||||
@property
|
||||
def child_overriden(self):
|
||||
if self.is_multiroot:
|
||||
return (
|
||||
self.multiroot_widget.is_overriden
|
||||
or self.multiroot_widget.child_overriden
|
||||
)
|
||||
else:
|
||||
return (
|
||||
self.singleroot_widget.is_overriden
|
||||
or self.singleroot_widget.child_overriden
|
||||
)
|
||||
return (
|
||||
self.roots_widget.is_overriden
|
||||
or self.roots_widget.child_overriden
|
||||
)
|
||||
|
||||
@property
|
||||
def child_invalid(self):
|
||||
if self.is_multiroot:
|
||||
return self.multiroot_widget.child_invalid
|
||||
else:
|
||||
return self.singleroot_widget.child_invalid
|
||||
return self.roots_widget.child_invalid
|
||||
|
||||
def remove_overrides(self):
|
||||
self._is_overriden = False
|
||||
self._is_modified = False
|
||||
|
||||
if self.studio_is_multiroot is NOT_SET:
|
||||
self.set_multiroot(self.default_is_multiroot)
|
||||
else:
|
||||
self.set_multiroot(self.studio_is_multiroot)
|
||||
|
||||
if self.is_multiroot:
|
||||
self.multiroot_widget.remove_overrides()
|
||||
else:
|
||||
self.singleroot_widget.remove_overrides()
|
||||
self.roots_widget.remove_overrides()
|
||||
|
||||
def reset_to_pype_default(self):
|
||||
self.set_multiroot(self.default_is_multiroot)
|
||||
if self.is_multiroot:
|
||||
self.multiroot_widget.reset_to_pype_default()
|
||||
else:
|
||||
self.singleroot_widget.reset_to_pype_default()
|
||||
self.roots_widget.reset_to_pype_default()
|
||||
self._has_studio_override = False
|
||||
|
||||
def set_studio_default(self):
|
||||
if self.is_multiroot:
|
||||
self.multiroot_widget.reset_to_pype_default()
|
||||
else:
|
||||
self.singleroot_widget.reset_to_pype_default()
|
||||
self.roots_widget.reset_to_pype_default()
|
||||
self._has_studio_override = True
|
||||
|
||||
def discard_changes(self):
|
||||
self._is_overriden = self._was_overriden
|
||||
self._is_modified = False
|
||||
if self._is_overriden:
|
||||
self.set_multiroot(self.was_multiroot)
|
||||
else:
|
||||
if self.studio_is_multiroot is NOT_SET:
|
||||
self.set_multiroot(self.default_is_multiroot)
|
||||
else:
|
||||
self.set_multiroot(self.studio_is_multiroot)
|
||||
|
||||
if self.is_multiroot:
|
||||
self.multiroot_widget.discard_changes()
|
||||
else:
|
||||
self.singleroot_widget.discard_changes()
|
||||
self.roots_widget.discard_changes()
|
||||
|
||||
self._is_modified = self.child_modified
|
||||
self._has_studio_override = self._had_studio_override
|
||||
|
||||
def set_as_overriden(self):
|
||||
self._is_overriden = True
|
||||
self.singleroot_widget.set_as_overriden()
|
||||
self.multiroot_widget.set_as_overriden()
|
||||
self.roots_widget.set_as_overriden()
|
||||
|
||||
def item_value(self):
|
||||
if self.is_multiroot:
|
||||
return self.multiroot_widget.item_value()
|
||||
else:
|
||||
return self.singleroot_widget.item_value()
|
||||
return self.roots_widget.item_value()
|
||||
|
||||
def config_value(self):
|
||||
return {self.key: self.item_value()}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue