diff options
Diffstat (limited to 'object_collection_manager/internals.py')
-rw-r--r-- | object_collection_manager/internals.py | 195 |
1 files changed, 186 insertions, 9 deletions
diff --git a/object_collection_manager/internals.py b/object_collection_manager/internals.py index e7f63884..5ebc6025 100644 --- a/object_collection_manager/internals.py +++ b/object_collection_manager/internals.py @@ -25,46 +25,183 @@ from bpy.types import ( Operator, ) -from bpy.props import StringProperty +from bpy.props import ( + StringProperty, + IntProperty, +) layer_collections = {} - collection_tree = [] - expanded = [] - -max_lvl = 0 row_index = 0 +max_lvl = 0 def get_max_lvl(): return max_lvl + +class QCDSlots(): + _slots = {} + overrides = {} + allow_update = True + + def __iter__(self): + return self._slots.items().__iter__() + + def __repr__(self): + return self._slots.__repr__() + + def __contains__(self, key): + try: + int(key) + return key in self._slots + + except ValueError: + return key in self._slots.values() + + return False + + def get_data_for_blend(self): + return f"{self._slots.__repr__()}\n{self.overrides.__repr__()}" + + def load_blend_data(self, data): + decoupled_data = data.split("\n") + blend_slots = eval(decoupled_data[0]) + blend_overrides = eval(decoupled_data[1]) + + self._slots = blend_slots + self.overrides = blend_overrides + + def length(self): + return len(self._slots) + + def get_idx(self, name, r_value=None): + for k, v in self._slots.items(): + if v == name: + return k + + return r_value + + def get_name(self, idx, r_value=None): + if idx in self._slots: + return self._slots[idx] + + return r_value + + def add_slot(self, idx, name): + self._slots[idx] = name + + def update_slot(self, idx, name): + self._slots[idx] = name + + def del_slot(self, slot): + try: + int(slot) + del self._slots[slot] + + except ValueError: + idx = self.get_idx(slot) + del self._slots[idx] + + def clear(self): + self._slots.clear() + +qcd_slots = QCDSlots() + + def update_col_name(self, context): + global layer_collections + global qcd_slots + if self.name != self.last_name: if self.name == '': self.name = self.last_name return if self.last_name != '': + # update collection name layer_collections[self.last_name]["ptr"].collection.name = self.name + # update qcd_slot + idx = qcd_slots.get_idx(self.last_name) + if idx: + qcd_slots.update_slot(idx, self.name) + update_property_group(context) self.last_name = self.name +def update_qcd_slot(self, context): + global qcd_slots + + if not qcd_slots.allow_update: + return + + update_needed = False + + try: + int(self.qcd_slot) + except: + + if self.qcd_slot == "": + qcd_slots.del_slot(self.name) + qcd_slots.overrides[self.name] = True + + if self.name in qcd_slots: + qcd_slots.allow_update = False + self.qcd_slot = qcd_slots.get_idx(self.name) + qcd_slots.allow_update = True + + if self.name in qcd_slots.overrides: + qcd_slots.allow_update = False + self.qcd_slot = "" + qcd_slots.allow_update = True + + return + + if self.name in qcd_slots: + qcd_slots.del_slot(self.name) + update_needed = True + + if self.qcd_slot in qcd_slots: + qcd_slots.overrides[qcd_slots.get_name(self.qcd_slot)] = True + qcd_slots.del_slot(self.qcd_slot) + update_needed = True + + if int(self.qcd_slot) > 20: + self.qcd_slot = "20" + + if int(self.qcd_slot) < 1: + self.qcd_slot = "1" + + qcd_slots.add_slot(self.qcd_slot, self.name) + + if self.name in qcd_slots.overrides: + del qcd_slots.overrides[self.name] + + + if update_needed: + update_property_group(context) + + class CMListCollection(PropertyGroup): name: StringProperty(update=update_col_name) last_name: StringProperty() + qcd_slot: StringProperty(name="QCD Slot", update=update_qcd_slot) -def update_collection_tree(context): +def update_collection_tree(context, renumerate=False): global max_lvl global row_index + global collection_tree + global layer_collections + global qcd_slots + collection_tree.clear() layer_collections.clear() + max_lvl = 0 row_index = 0 - layer_collection = context.view_layer.layer_collection init_laycol_list = layer_collection.children @@ -85,6 +222,37 @@ def update_collection_tree(context): for laycol in master_laycol["children"]: collection_tree.append(laycol) + # update qcd + for x in range(20): + qcd_slot = qcd_slots.get_name(str(x+1)) + if qcd_slot and not layer_collections.get(qcd_slot, None): + qcd_slots.del_slot(qcd_slot) + + # update autonumeration + if qcd_slots.length() < 20: + lvl = 0 + num = 1 + while lvl <= max_lvl: + if num > 20: + break + + for laycol in layer_collections.values(): + if num > 20: + break + + if int(laycol["lvl"]) == lvl: + if laycol["name"] in qcd_slots.overrides: + if not renumerate: + num += 1 + continue + + if str(num) not in qcd_slots and laycol["name"] not in qcd_slots: + qcd_slots.add_slot(str(num), laycol["name"]) + + num += 1 + + lvl += 1 + def get_all_collections(context, collections, parent, tree, level=0, visible=False): global row_index @@ -122,20 +290,29 @@ def get_all_collections(context, collections, parent, tree, level=0, visible=Fal get_all_collections(context, item.children, laycol, laycol["children"], level+1) -def update_property_group(context): - update_collection_tree(context) +def update_property_group(context, renumerate=False): + global collection_tree + global qcd_slots + + qcd_slots.allow_update = False + + update_collection_tree(context, renumerate) context.scene.collection_manager.cm_list_collection.clear() create_property_group(context, collection_tree) + qcd_slots.allow_update = True + def create_property_group(context, tree): global in_filter + global qcd_slots cm = context.scene.collection_manager for laycol in tree: new_cm_listitem = cm.cm_list_collection.add() new_cm_listitem.name = laycol["name"] + new_cm_listitem.qcd_slot = qcd_slots.get_idx(laycol["name"], "") if laycol["has_children"]: create_property_group(context, laycol["children"]) |