Skip to content
Snippets Groups Projects
Commit 8d4ee1fb authored by Ryan Inch's avatar Ryan Inch
Browse files

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.
parent df876a0e
No related branches found
No related tags found
No related merge requests found
......@@ -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'}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment