Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Inch <mythologylover75@gmail.com>2020-04-20 08:00:17 +0300
committerRyan Inch <mythologylover75@gmail.com>2020-04-20 08:00:17 +0300
commitbd52a5c39a70da85df23b10175280d64982b411e (patch)
tree0f4ab9a3dcab8ccbcf6498e2d1b9b3c0b9dd7903
parent0a361e787dbd49193740ddeb1d2c6202fae13305 (diff)
Collection Manager: Fix QCD edit mode. Task: T69577
Fix and simplify QCD edit mode implementation.
-rw-r--r--object_collection_manager/__init__.py21
-rw-r--r--object_collection_manager/internals.py18
-rw-r--r--object_collection_manager/qcd_operators.py77
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'}