From bd52a5c39a70da85df23b10175280d64982b411e Mon Sep 17 00:00:00 2001 From: Ryan Inch Date: Mon, 20 Apr 2020 01:00:17 -0400 Subject: Collection Manager: Fix QCD edit mode. Task: T69577 Fix and simplify QCD edit mode implementation. --- object_collection_manager/__init__.py | 21 ++------ object_collection_manager/internals.py | 18 ------- object_collection_manager/qcd_operators.py | 77 ++++++++++++++++-------------- 3 files changed, 45 insertions(+), 71 deletions(-) diff --git a/object_collection_manager/__init__.py b/object_collection_manager/__init__.py index 943e5b0f..f4d5900d 100644 --- a/object_collection_manager/__init__.py +++ b/object_collection_manager/__init__.py @@ -22,7 +22,7 @@ bl_info = { "name": "Collection Manager", "description": "Manage collections and their objects", "author": "Ryan Inch", - "version": (2,7,11), + "version": (2, 7, 12), "blender": (2, 80, 0), "location": "View3D - Object Mode (Shortcut - M)", "warning": '', # used for warning icon and text in addons panel @@ -114,25 +114,12 @@ classes = ( @persistent def depsgraph_update_post_handler(dummy): - move_triggered = False if internals.move_triggered: internals.move_triggered = False - move_triggered = True + return - qcd_view_op_triggered = False - if internals.qcd_view_op_triggered or internals.in_qcd_view_op: - internals.qcd_view_op_triggered = False - qcd_view_op_triggered = True - - - if not move_triggered: - internals.move_selection.clear() - internals.move_active = None - - if not qcd_view_op_triggered: - for obj in list(internals.edit_mode_selection): - if obj in bpy.context.view_layer.objects: - internals.edit_mode_selection.remove(obj) + internals.move_selection.clear() + internals.move_active = None @persistent def undo_redo_post_handler(dummy): diff --git a/object_collection_manager/internals.py b/object_collection_manager/internals.py index 3244866d..1ad8038a 100644 --- a/object_collection_manager/internals.py +++ b/object_collection_manager/internals.py @@ -36,10 +36,6 @@ move_triggered = False move_selection = [] move_active = None -qcd_view_op_triggered = False -in_qcd_view_op = False -edit_mode_selection = [] - layer_collections = {} collection_tree = [] collection_state = {} @@ -566,20 +562,6 @@ def get_move_active(): return bpy.data.objects[move_active] if move_active else None -def get_edit_mode_selection(): - global edit_mode_selection - - if not edit_mode_selection: - edit_mode_selection = [obj.name for obj in bpy.context.selected_objects - if obj.mode == 'EDIT' or obj.mode == 'EDIT_GPENCIL'] - - else: - for obj in bpy.context.selected_objects: - if obj.mode == 'EDIT' or obj.mode == 'EDIT_GPENCIL': - edit_mode_selection.append(obj.name) - - return [bpy.data.objects[name] for name in edit_mode_selection] - def update_qcd_header(): cm = bpy.context.scene.collection_manager diff --git a/object_collection_manager/qcd_operators.py b/object_collection_manager/qcd_operators.py index 81eaf6ba..9b47df8d 100644 --- a/object_collection_manager/qcd_operators.py +++ b/object_collection_manager/qcd_operators.py @@ -40,7 +40,6 @@ from .internals import ( get_modifiers, get_move_selection, get_move_active, - get_edit_mode_selection, update_qcd_header, ) @@ -188,17 +187,29 @@ class ViewQCDSlot(Operator): qcd_laycol = None slot_name = qcd_slots.get_name(self.slot) - edit_mode_selection = get_edit_mode_selection() - internals.qcd_view_op_triggered = True - internals.in_qcd_view_op = True - if slot_name: qcd_laycol = layer_collections[slot_name]["ptr"] else: return {'CANCELLED'} + + # get objects not in object mode + locked_active_obj = context.view_layer.objects.active + locked_objs = [] + locked_objs_mode = "" + for obj in context.view_layer.objects: + if obj.mode != 'OBJECT': + locked_objs.append(obj) + locked_objs_mode = obj.mode + + if self.toggle: + # check if slot can be toggled off. + for obj in qcd_laycol.collection.objects: + if obj.mode != 'OBJECT': + return {'CANCELLED'} + # get current child exclusion state child_exclusion = [] @@ -214,25 +225,48 @@ class ViewQCDSlot(Operator): for laycol in child_exclusion: laycol[0].exclude = laycol[1] + # restore locked objects back to their original mode + # needed because of exclude child updates + if locked_objs: + context.view_layer.objects.active = locked_active_obj + bpy.ops.object.mode_set(mode=locked_objs_mode) + # set layer as active layer collection context.view_layer.active_layer_collection = qcd_laycol else: + # exclude all collections for laycol in layer_collections.values(): if laycol["name"] != qcd_laycol.name: - laycol["ptr"].exclude = True + # prevent exclusion if locked objects in this collection + if set(locked_objs).isdisjoint(laycol["ptr"].collection.objects): + laycol["ptr"].exclude = True + else: + laycol["ptr"].exclude = False + # un-exclude target collection qcd_laycol.exclude = False # exclude all children def exclude_all_children(layer_collection): - layer_collection.exclude = True + # prevent exclusion if locked objects in this collection + if set(locked_objs).isdisjoint(layer_collection.collection.objects): + layer_collection.exclude = True + else: + layer_collection.exclude = False apply_to_children(qcd_laycol, exclude_all_children) + # restore locked objects back to their original mode + # needed because of exclude child updates + if locked_objs: + context.view_layer.objects.active = locked_active_obj + bpy.ops.object.mode_set(mode=locked_objs_mode) + # set layer as active layer collection context.view_layer.active_layer_collection = qcd_laycol + # update header UI update_qcd_header() @@ -243,35 +277,6 @@ class ViewQCDSlot(Operator): del rto_history["exclude_all"][view_layer] - if edit_mode_selection and not set(edit_mode_selection).isdisjoint(context.view_layer.objects): - if context.view_layer.objects: - if context.view_layer.objects != edit_mode_selection: - try: - bpy.ops.object.select_all(action='DESELECT') - except RuntimeError: # context is incorrect - # triggered when toggling slots - pass - - for obj in edit_mode_selection: - if obj.name in context.view_layer.objects: - obj.select_set(True) - - if not context.active_object or not context.active_object in edit_mode_selection: - for obj in edit_mode_selection: - if obj.name in context.view_layer.objects: - context.view_layer.objects.active = obj - break - - if context.active_object: - if context.active_object.type == 'GPENCIL': - bpy.ops.object.mode_set(mode='EDIT_GPENCIL') - - else: - bpy.ops.object.mode_set(mode='EDIT') - - - internals.in_qcd_view_op = False - return {'FINISHED'} -- cgit v1.2.3