[Bf-extensions-cvs] [8d4ee1fb] master: Collection Manager: Preserve edit mode. Task: T69577

Ryan Inch noreply at git.blender.org
Mon Apr 13 08:30:54 CEST 2020


Commit: 8d4ee1fb6b02f838352f74ad726e73b34b15ac94
Author: Ryan Inch
Date:   Mon Apr 13 02:28:10 2020 -0400
Branches: master
https://developer.blender.org/rBA8d4ee1fb6b02f838352f74ad726e73b34b15ac94

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.

===================================================================

M	object_collection_manager/__init__.py
M	object_collection_manager/internals.py
M	object_collection_manager/preferences.py
M	object_collection_manager/qcd_init.py
M	object_collection_manager/qcd_operators.py

===================================================================

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

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list