[Bf-extensions-cvs] [bd52a5c3] blender-v2.83-release: Collection Manager: Fix QCD edit mode. Task: T69577

Ryan Inch noreply at git.blender.org
Mon Apr 20 07:05:25 CEST 2020


Commit: bd52a5c39a70da85df23b10175280d64982b411e
Author: Ryan Inch
Date:   Mon Apr 20 01:00:17 2020 -0400
Branches: blender-v2.83-release
https://developer.blender.org/rBAbd52a5c39a70da85df23b10175280d64982b411e

Collection Manager: Fix QCD edit mode. Task: T69577

Fix and simplify QCD edit mode implementation.

===================================================================

M	object_collection_manager/__init__.py
M	object_collection_manager/internals.py
M	object_collection_manager/qcd_operators.py

===================================================================

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'}



More information about the Bf-extensions-cvs mailing list