diff options
-rw-r--r-- | object_collection_manager/__init__.py | 113 | ||||
-rw-r--r-- | object_collection_manager/preferences.py | 41 | ||||
-rw-r--r-- | object_collection_manager/qcd_init.py | 140 | ||||
-rw-r--r-- | object_collection_manager/ui.py | 14 |
4 files changed, 199 insertions, 109 deletions
diff --git a/object_collection_manager/__init__.py b/object_collection_manager/__init__.py index a55d60fa..b7e44f88 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,3,2), + "version": (2,4,1), "blender": (2, 80, 0), "location": "View3D - Object Mode (Shortcut - M)", "warning": '', # used for warning icon and text in addons panel @@ -36,23 +36,22 @@ if "bpy" in locals(): importlib.reload(internals) importlib.reload(operators) - importlib.reload(preferences) importlib.reload(qcd_move_widget) importlib.reload(qcd_operators) importlib.reload(ui) + importlib.reload(qcd_init) + importlib.reload(preferences) else: from . import internals from . import operators - from . import preferences from . import qcd_move_widget from . import qcd_operators from . import ui + from . import qcd_init + from . import preferences -import os import bpy -import bpy.utils.previews -from bpy.app.handlers import persistent from bpy.types import PropertyGroup from bpy.props import ( CollectionProperty, @@ -103,134 +102,42 @@ classes = ( operators.CMSetCollectionOperator, operators.CMPhantomModeOperator, preferences.CMPreferences, - qcd_move_widget.QCDMoveWidget, - qcd_operators.MoveToQCDSlot, - qcd_operators.ViewQCDSlot, - qcd_operators.ViewMoveQCDSlot, - qcd_operators.RenumerateQCDSlots, ui.CM_UL_items, ui.CollectionManager, ui.CMRestrictionTogglesPanel, CollectionManagerProperties, ) -@persistent -def depsgraph_update_post_handler(dummy): - if qcd_operators.move_triggered: - qcd_operators.move_triggered = False - return - - qcd_operators.move_selection.clear() - qcd_operators.move_active = None - qcd_operators.get_move_selection() - qcd_operators.get_move_active() - -@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 - data = cm.qcd_slots_blend_data - - if not data: - return - - internals.qcd_slots.load_blend_data(data) def register(): for cls in classes: bpy.utils.register_class(cls) - - pcoll = bpy.utils.previews.new() - icons_dir = os.path.join(os.path.dirname(__file__), "icons") - pcoll.load("active_icon_base", os.path.join(icons_dir, "minus.png"), 'IMAGE', True) - pcoll.load("active_icon_text", os.path.join(icons_dir, "minus.png"), 'IMAGE', True) - pcoll.load("active_icon_text_sel", os.path.join(icons_dir, "minus.png"), 'IMAGE', True) - ui.preview_collections["icons"] = pcoll - - bpy.types.Scene.collection_manager = PointerProperty(type=CollectionManagerProperties) - bpy.types.VIEW3D_HT_header.append(ui.view3d_header_qcd_slots) - # create the global menu hotkey wm = bpy.context.window_manager km = wm.keyconfigs.addon.keymaps.new(name='Object Mode') kmi = km.keymap_items.new('view3d.collection_manager', 'M', 'PRESS') addon_keymaps.append((km, kmi)) - # 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 key in qcd_hotkeys: - km = wm.keyconfigs.addon.keymaps.new(name='Object 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_keymaps.append((km, kmi)) - - km = wm.keyconfigs.addon.keymaps.new(name='Object 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_keymaps.append((km, kmi)) - - km = wm.keyconfigs.addon.keymaps.new(name='Object Mode') - kmi = km.keymap_items.new('view3d.qcd_move_widget', 'V', 'PRESS') - addon_keymaps.append((km, kmi)) - - bpy.app.handlers.depsgraph_update_post.append(depsgraph_update_post_handler) - 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: + qcd_init.register_qcd() def unregister(): - bpy.app.handlers.depsgraph_update_post.remove(depsgraph_update_post_handler) - bpy.app.handlers.save_pre.remove(save_internal_data) - bpy.app.handlers.load_post.remove(load_internal_data) - for cls in classes: bpy.utils.unregister_class(cls) - for pcoll in ui.preview_collections.values(): - bpy.utils.previews.remove(pcoll) - ui.preview_collections.clear() - ui.last_icon_theme_text = None - ui.last_icon_theme_text_sel = None - del bpy.types.Scene.collection_manager - bpy.types.VIEW3D_HT_header.remove(ui.view3d_header_qcd_slots) - # remove keymaps when add-on is deactivated for km, kmi in addon_keymaps: km.keymap_items.remove(kmi) addon_keymaps.clear() + qcd_init.unregister_qcd() + + if __name__ == "__main__": register() diff --git a/object_collection_manager/preferences.py b/object_collection_manager/preferences.py index 154ee3ee..d40b4303 100644 --- a/object_collection_manager/preferences.py +++ b/object_collection_manager/preferences.py @@ -26,6 +26,24 @@ from bpy.props import ( FloatVectorProperty, ) +from . import qcd_init + +def update_qcd_status(self, context): + if self.enable_qcd: + qcd_init.register_qcd() + + if self.enable_qcd_view_hotkeys: + qcd_init.register_qcd_view_hotkeys() + + else: + qcd_init.unregister_qcd() + +def update_qcd_view_hotkeys_status(self, context): + if self.enable_qcd_view_hotkeys: + qcd_init.register_qcd_view_hotkeys() + else: + qcd_init.unregister_qcd_view_hotkeys() + def get_tool_text(self): if self.tool_text_override: return self["tool_text_color"] @@ -161,6 +179,22 @@ def set_tooltip_outline(self, values): class CMPreferences(AddonPreferences): bl_idname = __package__ + # ENABLE QCD BOOLS + enable_qcd: BoolProperty( + name="QCD", + description="Enable/Disable QCD System", + default=True, + update=update_qcd_status, + ) + + enable_qcd_view_hotkeys: BoolProperty( + name="QCD Hotkeys", + description="Enable/Disable the view (number) hotkeys for QCD", + default=True, + update=update_qcd_view_hotkeys_status, + ) + + # OVERRIDE BOOLS tool_text_override: BoolProperty( name="Text", @@ -376,6 +410,13 @@ class CMPreferences(AddonPreferences): layout = self.layout box = layout.box() + box.row().prop(self, "enable_qcd") + + if not self.enable_qcd: + return + + box.row().prop(self, "enable_qcd_view_hotkeys") + box.row().label(text="QCD Move Widget") tool_box = box.box() diff --git a/object_collection_manager/qcd_init.py b/object_collection_manager/qcd_init.py new file mode 100644 index 00000000..4857719a --- /dev/null +++ b/object_collection_manager/qcd_init.py @@ -0,0 +1,140 @@ +import os +import bpy +import bpy.utils.previews +from bpy.app.handlers import persistent + +from . import preferences +from . import qcd_move_widget +from . import qcd_operators +from . import ui + +addon_qcd_keymaps = [] +addon_qcd_view_hotkey_keymaps = [] + +qcd_classes = ( + qcd_move_widget.QCDMoveWidget, + qcd_operators.MoveToQCDSlot, + qcd_operators.ViewQCDSlot, + qcd_operators.ViewMoveQCDSlot, + qcd_operators.RenumerateQCDSlots, + ) + +@persistent +def depsgraph_update_post_handler(dummy): + if qcd_operators.move_triggered: + qcd_operators.move_triggered = False + return + + qcd_operators.move_selection.clear() + qcd_operators.move_active = None + qcd_operators.get_move_selection() + qcd_operators.get_move_active() + +@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 + data = cm.qcd_slots_blend_data + + if not data: + return + + internals.qcd_slots.load_blend_data(data) + +def register_qcd(): + for cls in qcd_classes: + bpy.utils.register_class(cls) + + pcoll = bpy.utils.previews.new() + icons_dir = os.path.join(os.path.dirname(__file__), "icons") + pcoll.load("active_icon_base", os.path.join(icons_dir, "minus.png"), 'IMAGE', True) + pcoll.load("active_icon_text", os.path.join(icons_dir, "minus.png"), 'IMAGE', True) + pcoll.load("active_icon_text_sel", os.path.join(icons_dir, "minus.png"), 'IMAGE', True) + ui.preview_collections["icons"] = pcoll + + wm = bpy.context.window_manager + km = wm.keyconfigs.addon.keymaps.new(name='Object Mode') + kmi = km.keymap_items.new('view3d.qcd_move_widget', 'V', 'PRESS') + addon_qcd_keymaps.append((km, kmi)) + + bpy.app.handlers.depsgraph_update_post.append(depsgraph_update_post_handler) + 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: + register_qcd_view_hotkeys() + + bpy.types.VIEW3D_HT_header.append(ui.view3d_header_qcd_slots) + +def register_qcd_view_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 key in qcd_hotkeys: + km = wm.keyconfigs.addon.keymaps.new(name='Object 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_hotkey_keymaps.append((km, kmi)) + + km = wm.keyconfigs.addon.keymaps.new(name='Object 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_hotkey_keymaps.append((km, kmi)) + +def unregister_qcd(): + bpy.types.VIEW3D_HT_header.remove(ui.view3d_header_qcd_slots) + + for cls in qcd_classes: + bpy.utils.unregister_class(cls) + + bpy.app.handlers.depsgraph_update_post.remove(depsgraph_update_post_handler) + bpy.app.handlers.save_pre.remove(save_internal_data) + bpy.app.handlers.load_post.remove(load_internal_data) + + for pcoll in ui.preview_collections.values(): + bpy.utils.previews.remove(pcoll) + ui.preview_collections.clear() + ui.last_icon_theme_text = None + ui.last_icon_theme_text_sel = None + + # remove keymaps when qcd is deactivated + for km, kmi in addon_qcd_keymaps: + km.keymap_items.remove(kmi) + addon_qcd_keymaps.clear() + + unregister_qcd_view_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() diff --git a/object_collection_manager/ui.py b/object_collection_manager/ui.py index 7325a3e1..55dcbfb4 100644 --- a/object_collection_manager/ui.py +++ b/object_collection_manager/ui.py @@ -107,9 +107,10 @@ class CollectionManager(Operator): sec1.operator("view3d.expand_all_items", text=text) - renum = toggle_row.row() - renum.alignment = 'LEFT' - renum.operator("view3d.renumerate_qcd_slots") + if context.preferences.addons[__package__].preferences.enable_qcd: + renum = toggle_row.row() + renum.alignment = 'LEFT' + renum.operator("view3d.renumerate_qcd_slots") for laycol in collection_tree: if laycol["has_children"]: @@ -305,9 +306,10 @@ class CM_UL_items(UIList): row.label(icon='GROUP') - QCD = row.row() - QCD.scale_x = 0.4 - QCD.prop(item, "qcd_slot", text="") + if context.preferences.addons[__package__].preferences.enable_qcd: + QCD = row.row() + QCD.scale_x = 0.4 + QCD.prop(item, "qcd_slot", text="") name_row = row.row() |