Collection Manager: Preserve edit mode. Task: T69577
Preserve edit mode when switching QCD slots. Add hotkeys and preference toggle for this. Hotkeys added for all objects with edit mode except fonts.
This commit is contained in:
parent
df876a0e69
commit
8d4ee1fb6b
|
@ -22,7 +22,7 @@ bl_info = {
|
|||
"name": "Collection Manager",
|
||||
"description": "Manage collections and their objects",
|
||||
"author": "Ryan Inch",
|
||||
"version": (2,5,6),
|
||||
"version": (2,6,0),
|
||||
"blender": (2, 80, 0),
|
||||
"location": "View3D - Object Mode (Shortcut - M)",
|
||||
"warning": '', # used for warning icon and text in addons panel
|
||||
|
@ -111,12 +111,25 @@ classes = (
|
|||
|
||||
@persistent
|
||||
def depsgraph_update_post_handler(dummy):
|
||||
move_triggered = False
|
||||
if internals.move_triggered:
|
||||
internals.move_triggered = False
|
||||
return
|
||||
move_triggered = True
|
||||
|
||||
internals.move_selection.clear()
|
||||
internals.move_active = None
|
||||
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)
|
||||
|
||||
@persistent
|
||||
def undo_redo_post_handler(dummy):
|
||||
|
|
|
@ -36,6 +36,10 @@ 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 = {}
|
||||
|
@ -510,6 +514,20 @@ 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
|
||||
|
|
|
@ -35,6 +35,9 @@ def update_qcd_status(self, context):
|
|||
if self.enable_qcd_view_hotkeys:
|
||||
qcd_init.register_qcd_view_hotkeys()
|
||||
|
||||
if self.enable_qcd_view_edit_mode_hotkeys:
|
||||
qcd_init.register_qcd_view_edit_mode_hotkeys()
|
||||
|
||||
else:
|
||||
qcd_init.unregister_qcd()
|
||||
|
||||
|
@ -44,6 +47,12 @@ def update_qcd_view_hotkeys_status(self, context):
|
|||
else:
|
||||
qcd_init.unregister_qcd_view_hotkeys()
|
||||
|
||||
def update_qcd_view_edit_mode_hotkeys_status(self, context):
|
||||
if self.enable_qcd_view_edit_mode_hotkeys:
|
||||
qcd_init.register_qcd_view_edit_mode_hotkeys()
|
||||
else:
|
||||
qcd_init.unregister_qcd_view_edit_mode_hotkeys()
|
||||
|
||||
def get_tool_text(self):
|
||||
if self.tool_text_override:
|
||||
return self["tool_text_color"]
|
||||
|
@ -194,6 +203,13 @@ class CMPreferences(AddonPreferences):
|
|||
update=update_qcd_view_hotkeys_status,
|
||||
)
|
||||
|
||||
enable_qcd_view_edit_mode_hotkeys: BoolProperty(
|
||||
name="QCD Edit Mode Hotkeys",
|
||||
description="Enable/Disable the numerical hotkeys to view QCD slots in Edit Mode",
|
||||
default=True,
|
||||
update=update_qcd_view_edit_mode_hotkeys_status,
|
||||
)
|
||||
|
||||
|
||||
# OVERRIDE BOOLS
|
||||
tool_text_override: BoolProperty(
|
||||
|
@ -416,6 +432,7 @@ class CMPreferences(AddonPreferences):
|
|||
return
|
||||
|
||||
box.row().prop(self, "enable_qcd_view_hotkeys")
|
||||
box.row().prop(self, "enable_qcd_view_edit_mode_hotkeys")
|
||||
|
||||
box.row().label(text="QCD Move Widget")
|
||||
|
||||
|
|
|
@ -11,6 +11,8 @@ from . import ui
|
|||
|
||||
addon_qcd_keymaps = []
|
||||
addon_qcd_view_hotkey_keymaps = []
|
||||
addon_qcd_view_edit_mode_hotkey_keymaps = []
|
||||
|
||||
|
||||
qcd_classes = (
|
||||
qcd_move_widget.QCDMoveWidget,
|
||||
|
@ -20,12 +22,14 @@ qcd_classes = (
|
|||
qcd_operators.RenumerateQCDSlots,
|
||||
)
|
||||
|
||||
|
||||
@persistent
|
||||
def save_internal_data(dummy):
|
||||
cm = bpy.context.scene.collection_manager
|
||||
|
||||
cm.qcd_slots_blend_data = internals.qcd_slots.get_data_for_blend()
|
||||
|
||||
|
||||
@persistent
|
||||
def load_internal_data(dummy):
|
||||
cm = bpy.context.scene.collection_manager
|
||||
|
@ -36,6 +40,7 @@ def load_internal_data(dummy):
|
|||
|
||||
internals.qcd_slots.load_blend_data(data)
|
||||
|
||||
|
||||
def register_qcd():
|
||||
for cls in qcd_classes:
|
||||
bpy.utils.register_class(cls)
|
||||
|
@ -55,12 +60,18 @@ def register_qcd():
|
|||
bpy.app.handlers.save_pre.append(save_internal_data)
|
||||
bpy.app.handlers.load_post.append(load_internal_data)
|
||||
|
||||
if bpy.context.preferences.addons[__package__].preferences.enable_qcd_view_hotkeys:
|
||||
prefs = bpy.context.preferences.addons[__package__].preferences
|
||||
|
||||
if prefs.enable_qcd_view_hotkeys:
|
||||
register_qcd_view_hotkeys()
|
||||
|
||||
if prefs.enable_qcd_view_edit_mode_hotkeys:
|
||||
register_qcd_view_edit_mode_hotkeys()
|
||||
|
||||
bpy.types.VIEW3D_HT_header.append(ui.view3d_header_qcd_slots)
|
||||
bpy.types.TOPBAR_HT_upper_bar.append(ui.view_layer_update)
|
||||
|
||||
|
||||
def register_qcd_view_hotkeys():
|
||||
wm = bpy.context.window_manager
|
||||
# create qcd hotkeys
|
||||
|
@ -100,6 +111,48 @@ def register_qcd_view_hotkeys():
|
|||
kmi.properties.toggle = True
|
||||
addon_qcd_view_hotkey_keymaps.append((km, kmi))
|
||||
|
||||
|
||||
def register_qcd_view_edit_mode_hotkeys():
|
||||
wm = bpy.context.window_manager
|
||||
# create qcd hotkeys
|
||||
qcd_hotkeys = [
|
||||
["ONE", False, "1"],
|
||||
["TWO", False, "2"],
|
||||
["THREE", False, "3"],
|
||||
["FOUR", False, "4"],
|
||||
["FIVE", False, "5"],
|
||||
["SIX", False, "6"],
|
||||
["SEVEN", False, "7"],
|
||||
["EIGHT", False, "8"],
|
||||
["NINE", False, "9"],
|
||||
["ZERO", False, "10"],
|
||||
["ONE", True, "11"],
|
||||
["TWO", True, "12"],
|
||||
["THREE", True, "13"],
|
||||
["FOUR", True, "14"],
|
||||
["FIVE", True, "15"],
|
||||
["SIX", True, "16"],
|
||||
["SEVEN", True, "17"],
|
||||
["EIGHT", True, "18"],
|
||||
["NINE", True, "19"],
|
||||
["ZERO", True, "20"],
|
||||
]
|
||||
|
||||
for mode in ["Mesh", "Curve", "Armature", "Metaball", "Lattice", "Grease Pencil Stroke Edit Mode"]:
|
||||
for key in qcd_hotkeys:
|
||||
km = wm.keyconfigs.addon.keymaps.new(name=mode)
|
||||
kmi = km.keymap_items.new('view3d.view_qcd_slot', key[0], 'PRESS', alt=key[1])
|
||||
kmi.properties.slot = key[2]
|
||||
kmi.properties.toggle = False
|
||||
addon_qcd_view_edit_mode_hotkey_keymaps.append((km, kmi))
|
||||
|
||||
km = wm.keyconfigs.addon.keymaps.new(name=mode)
|
||||
kmi = km.keymap_items.new('view3d.view_qcd_slot', key[0], 'PRESS',shift=True, alt=key[1])
|
||||
kmi.properties.slot = key[2]
|
||||
kmi.properties.toggle = True
|
||||
addon_qcd_view_edit_mode_hotkey_keymaps.append((km, kmi))
|
||||
|
||||
|
||||
def unregister_qcd():
|
||||
bpy.types.VIEW3D_HT_header.remove(ui.view3d_header_qcd_slots)
|
||||
bpy.types.TOPBAR_HT_upper_bar.remove(ui.view_layer_update)
|
||||
|
@ -121,10 +174,21 @@ def unregister_qcd():
|
|||
km.keymap_items.remove(kmi)
|
||||
addon_qcd_keymaps.clear()
|
||||
|
||||
|
||||
unregister_qcd_view_hotkeys()
|
||||
|
||||
unregister_qcd_view_edit_mode_hotkeys()
|
||||
|
||||
|
||||
def unregister_qcd_view_hotkeys():
|
||||
# remove keymaps when qcd view hotkeys are deactivated
|
||||
for km, kmi in addon_qcd_view_hotkey_keymaps:
|
||||
km.keymap_items.remove(kmi)
|
||||
addon_qcd_view_hotkey_keymaps.clear()
|
||||
|
||||
|
||||
def unregister_qcd_view_edit_mode_hotkeys():
|
||||
# remove keymaps when qcd view hotkeys are deactivated
|
||||
for km, kmi in addon_qcd_view_edit_mode_hotkey_keymaps:
|
||||
km.keymap_items.remove(kmi)
|
||||
addon_qcd_view_edit_mode_hotkey_keymaps.clear()
|
||||
|
|
|
@ -40,6 +40,7 @@ from .internals import (
|
|||
get_modifiers,
|
||||
get_move_selection,
|
||||
get_move_active,
|
||||
get_edit_mode_selection,
|
||||
update_qcd_header,
|
||||
)
|
||||
|
||||
|
@ -183,6 +184,10 @@ 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"]
|
||||
|
||||
|
@ -245,6 +250,36 @@ class ViewQCDSlot(Operator):
|
|||
if view_layer in rto_history["exclude_all"]:
|
||||
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