lsit widget can add and show items in right order

This commit is contained in:
iLLiCiTiT 2021-02-08 19:34:51 +01:00
parent 9372736c48
commit 6e55bda056
3 changed files with 67 additions and 26 deletions

View file

@ -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)

View file

@ -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

View file

@ -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()