Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Inch <mythologylover75@gmail.com>2020-04-13 09:28:10 +0300
committerRyan Inch <mythologylover75@gmail.com>2020-04-13 09:28:10 +0300
commit8d4ee1fb6b02f838352f74ad726e73b34b15ac94 (patch)
tree791e8148e563df18d8a051f8800614edc4e4938a
parentdf876a0e69f7f812eb3818aec3050f7ec1815986 (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__.py21
-rw-r--r--object_collection_manager/internals.py18
-rw-r--r--object_collection_manager/preferences.py17
-rw-r--r--object_collection_manager/qcd_init.py66
-rw-r--r--object_collection_manager/qcd_operators.py35
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'}