Collection Manager: Fix QCD edit mode. Task: T69577
Fix and simplify QCD edit mode implementation.
This commit is contained in:
parent
f12430cae6
commit
e96c852096
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue