Collection Manager: Fix QCD edit mode. Task: T69577

Fix and simplify QCD edit mode implementation.
This commit is contained in:
Ryan Inch 2020-04-20 01:00:17 -04:00
parent f12430cae6
commit e96c852096
3 changed files with 45 additions and 71 deletions

View File

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

View File

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

View File

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