diff options
author | Ryan Inch <mythologylover75@gmail.com> | 2020-04-13 09:28:10 +0300 |
---|---|---|
committer | Ryan Inch <mythologylover75@gmail.com> | 2020-04-13 09:28:10 +0300 |
commit | 8d4ee1fb6b02f838352f74ad726e73b34b15ac94 (patch) | |
tree | 791e8148e563df18d8a051f8800614edc4e4938a | |
parent | df876a0e69f7f812eb3818aec3050f7ec1815986 (diff) |
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.
-rw-r--r-- | object_collection_manager/__init__.py | 21 | ||||
-rw-r--r-- | object_collection_manager/internals.py | 18 | ||||
-rw-r--r-- | object_collection_manager/preferences.py | 17 | ||||
-rw-r--r-- | object_collection_manager/qcd_init.py | 66 | ||||
-rw-r--r-- | object_collection_manager/qcd_operators.py | 35 |
5 files changed, 152 insertions, 5 deletions
diff --git a/object_collection_manager/__init__.py b/object_collection_manager/__init__.py index dbafe8ce..a10bab4c 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,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): diff --git a/object_collection_manager/internals.py b/object_collection_manager/internals.py index f55ddc5f..05432ab6 100644 --- a/object_collection_manager/internals.py +++ b/object_collection_manager/internals.py @@ -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 diff --git a/object_collection_manager/preferences.py b/object_collection_manager/preferences.py index 59708805..5e6393e5 100644 --- a/object_collection_manager/preferences.py +++ b/object_collection_manager/preferences.py @@ -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") diff --git a/object_collection_manager/qcd_init.py b/object_collection_manager/qcd_init.py index 69bb4621..73e67faa 100644 --- a/object_collection_manager/qcd_init.py +++ b/object_collection_manager/qcd_init.py @@ -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() diff --git a/object_collection_manager/qcd_operators.py b/object_collection_manager/qcd_operators.py index 2a52121d..56272171 100644 --- a/object_collection_manager/qcd_operators.py +++ b/object_collection_manager/qcd_operators.py @@ -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'} |