diff --git a/pype/settings/entities/dict_mutable_keys_entity.py b/pype/settings/entities/dict_mutable_keys_entity.py index 1471318e07..7f6fd1ec64 100644 --- a/pype/settings/entities/dict_mutable_keys_entity.py +++ b/pype/settings/entities/dict_mutable_keys_entity.py @@ -170,7 +170,6 @@ class DictMutableKeysEntity(ItemEntity): self.on_value_change() def on_change(self): - self.update_current_metadata() for callback in self.on_change_callbacks: callback() self.parent.on_child_change(self) diff --git a/pype/settings/entities/list_entity.py b/pype/settings/entities/list_entity.py index cde50a46bb..ed566fe6a2 100644 --- a/pype/settings/entities/list_entity.py +++ b/pype/settings/entities/list_entity.py @@ -1,5 +1,6 @@ import copy -from .item_entities import ItemEntity +from . import BaseEntity, ItemEntity +# from .item_entities import from .constants import OverrideState from .lib import ( NOT_SET, @@ -14,8 +15,15 @@ class ListEntity(ItemEntity): for item in self.children: yield item + def __bool__(self): + """Returns true because len may return 0.""" + return True + + def __len__(self): + return len(self.children) + def append(self, item): - child_obj = self.add_new_item() + child_obj = self._add_new_item() child_obj.set_override_state(self.override_state) child_obj.set_value(item) self.on_change() @@ -35,18 +43,25 @@ class ListEntity(ItemEntity): def remove(self, item): for idx, child_obj in enumerate(self.children): - if child_obj.value == item: + found = False + if isinstance(item, BaseEntity): + if child_obj is item: + found = True + elif child_obj.value == item: + found = True + + if found: self.pop(idx) return raise ValueError("ListEntity.remove(x): x not in ListEntity") def insert(self, idx, item): - child_obj = self.add_new_item(idx) + child_obj = self._add_new_item(idx) child_obj.set_override_state(self.override_state) child_obj.set_value(item) self.on_change() - def add_new_item(self, idx=None): + def _add_new_item(self, idx=None): child_obj = self.create_schema_object(self.item_schema, self, True) if idx is None: self.children.append(child_obj) @@ -54,9 +69,16 @@ class ListEntity(ItemEntity): self.children.insert(idx, child_obj) return child_obj + def add_new_item(self, idx=None): + child_obj = self._add_new_item(idx) + child_obj.set_override_state(self.override_state) + self.on_change() + return child_obj + def item_initalization(self): self.valid_value_types = (list, ) self.children = [] + self.value_on_not_set = [] self.ignore_child_changes = False @@ -157,7 +179,7 @@ class ListEntity(ItemEntity): value = self.value_on_not_set for item in value: - child_obj = self.add_new_item() + child_obj = self._add_new_item() child_obj.update_default_value(item) if self.override_state is OverrideState.PROJECT: if self.had_project_override: @@ -307,7 +329,7 @@ class ListEntity(ItemEntity): self.children.pop(0) for item in value: - child_obj = self.add_new_item() + child_obj = self._add_new_item() child_obj.update_default_value(item) if self.override_state is OverrideState.PROJECT: if self.had_project_override: @@ -351,7 +373,7 @@ class ListEntity(ItemEntity): self.children.pop(0) for item in value: - child_obj = self.add_new_item() + child_obj = self._add_new_item() child_obj.update_default_value(item) child_obj.set_override_state(self.override_state) @@ -382,10 +404,11 @@ class ListEntity(ItemEntity): self.ignore_child_changes = True for item in value: - child_obj = self.add_new_item() + child_obj = self._add_new_item() child_obj.update_default_value(item) if self._has_studio_override: child_obj.update_studio_values(item) + child_obj.set_override_state(self.override_state) self.ignore_child_changes = False diff --git a/pype/tools/settings/settings/widgets/list_item_widget.py b/pype/tools/settings/settings/widgets/list_item_widget.py index 2c8b7fb2f4..5aab733991 100644 --- a/pype/tools/settings/settings/widgets/list_item_widget.py +++ b/pype/tools/settings/settings/widgets/list_item_widget.py @@ -245,20 +245,40 @@ class ListWidget(InputWidget): return invalid def _on_entity_change(self): - in_input_fields = list() + # TODO do less inefficient + current_entities = [] for input_field in self.input_fields: - in_input_fields.append(input_field.entity) + current_entities.append(input_field.entity) - for child_entity in self.entity: - if child_entity not in in_input_fields: - self.add_row(child_entity) - else: - in_input_fields.remove(child_entity) + for idx, child_entity in enumerate(self.entity): + found = False + for input_field in self.input_fields: + if input_field.entity is child_entity: + found = True + break - if in_input_fields: - for input_field in tuple(self.input_fields): - if input_field.entity in in_input_fields: - self.remove_row(input_field) + if not found: + self.add_row(child_entity, idx) + + child_len = len(self.entity) + for idx, child_entity in enumerate(tuple(self.entity)): + if self.input_fields[idx].entity is child_entity: + continue + + for _idx in range(idx, child_len): + input_field = self.input_fields[_idx] + if input_field.entity is not child_entity: + continue + + self.content_layout.insertWidget(idx, input_field) + break + + input_field_len = len(self.input_fields) + if child_len != input_field_len: + for idx in range(child_len, input_field_len): + self.remove_row(self.input_fields[idx]) + + self.empty_row.setVisible(self.count() == 0) def count(self): return len(self.input_fields) @@ -283,11 +303,7 @@ class ListWidget(InputWidget): field_2.order_changed() def add_new_item(self, row=None): - child_entity = self.entity.add_new_item() - child_entity.set_override_state(self.entity.override_state) - - self.add_row(child_entity) - self.empty_row.setVisible(self.count() == 0) + self.entity.add_new_item(row) def add_row(self, child_entity, row=None): # Create new item @@ -345,6 +361,9 @@ class ListWidget(InputWidget): item_widget.setParent(None) item_widget.deleteLater() + if item_widget.entity in self.entity.children: + self.entity.remove(item_widget.entity) + if previous_field: previous_field.order_changed()