Files
blender-addons/object_collection_manager/qcd_init.py
Ryan Inch af8d747d00 Collection Manager: Fix T100326. Task: T69577
Add guards to the functions triggered by checkbox updates
in the preferences.  This prevents them from being called
multiple times, such as when the mouse is hovered over
the checkbox and the backspace key is repeatedly pressed.
2022-08-12 04:49:35 -04:00

328 lines
12 KiB
Python

# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright 2011, Ryan Inch
if "bpy" in locals():
import importlib
importlib.reload(internals)
importlib.reload(qcd_move_widget)
importlib.reload(qcd_operators)
importlib.reload(ui)
importlib.reload(preferences)
else:
from . import internals
from . import qcd_move_widget
from . import qcd_operators
from . import ui
from . import preferences
import os
import bpy
import bpy.utils.previews
from bpy.app.handlers import persistent
addon_qcd_keymaps = []
addon_qcd_view_hotkey_keymaps = []
addon_qcd_view_edit_mode_hotkey_keymaps = []
qcd_registered = False
qcd_classes = (
qcd_move_widget.QCDMoveWidget,
qcd_operators.EnableAllQCDSlotsMeta,
qcd_operators.EnableAllQCDSlots,
qcd_operators.EnableAllQCDSlotsIsolated,
qcd_operators.IsolateSelectedObjectsCollections,
qcd_operators.DisableSelectedObjectsCollections,
qcd_operators.DisableAllNonQCDSlots,
qcd_operators.DisableAllCollections,
qcd_operators.SelectAllQCDObjects,
qcd_operators.DiscardQCDHistory,
qcd_operators.MoveToQCDSlot,
qcd_operators.ViewQCDSlot,
qcd_operators.ViewMoveQCDSlot,
qcd_operators.UnassignedQCDSlot,
qcd_operators.CreateAllQCDSlots,
qcd_operators.RenumerateQCDSlots,
ui.EnableAllQCDSlotsMenu,
)
@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)
@persistent
def load_pre_handler(dummy):
internals.qcd_collection_state.clear()
for key in list(internals.qcd_history.keys()):
del internals.qcd_history[key]
def register_qcd():
global qcd_registered
if qcd_registered:
# guard to handle default value updates (mouse hover + backspace)
return
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
if wm.keyconfigs.addon: # not present when started with --background
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.save_pre.append(save_internal_data)
bpy.app.handlers.load_post.append(load_internal_data)
bpy.app.handlers.load_pre.append(load_pre_handler)
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()
if prefs.enable_qcd_3dview_header_widget:
register_qcd_3dview_header_widget()
qcd_registered = True
def register_qcd_view_hotkeys():
if addon_qcd_view_hotkey_keymaps:
# guard to handle default value updates (mouse hover + backspace)
return
wm = bpy.context.window_manager
if wm.keyconfigs.addon: # not present when started with --background
# 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 ['Object Mode', 'Pose', 'Weight Paint']:
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_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_hotkey_keymaps.append((km, kmi))
km = wm.keyconfigs.addon.keymaps.new(name=mode)
kmi = km.keymap_items.new('view3d.enable_all_qcd_slots', 'PLUS', 'PRESS', shift=True)
addon_qcd_view_hotkey_keymaps.append((km, kmi))
km = wm.keyconfigs.addon.keymaps.new(name=mode)
kmi = km.keymap_items.new('view3d.isolate_selected_objects_collections', 'EQUAL', 'PRESS')
addon_qcd_view_hotkey_keymaps.append((km, kmi))
km = wm.keyconfigs.addon.keymaps.new(name=mode)
kmi = km.keymap_items.new('view3d.disable_selected_objects_collections', 'MINUS', 'PRESS')
addon_qcd_view_hotkey_keymaps.append((km, kmi))
km = wm.keyconfigs.addon.keymaps.new(name=mode)
kmi = km.keymap_items.new('view3d.disable_all_non_qcd_slots', 'PLUS', 'PRESS', shift=True, alt=True)
addon_qcd_view_hotkey_keymaps.append((km, kmi))
km = wm.keyconfigs.addon.keymaps.new(name=mode)
kmi = km.keymap_items.new('view3d.disable_all_collections', 'EQUAL', 'PRESS', alt=True, ctrl=True)
addon_qcd_view_hotkey_keymaps.append((km, kmi))
km = wm.keyconfigs.addon.keymaps.new(name=mode)
kmi = km.keymap_items.new('view3d.select_all_qcd_objects', 'PLUS', 'PRESS', shift=True, ctrl=True)
addon_qcd_view_hotkey_keymaps.append((km, kmi))
km = wm.keyconfigs.addon.keymaps.new(name=mode)
kmi = km.keymap_items.new('view3d.discard_qcd_history', 'EQUAL', 'PRESS', alt=True)
addon_qcd_view_hotkey_keymaps.append((km, kmi))
def register_qcd_view_edit_mode_hotkeys():
if addon_qcd_view_edit_mode_hotkey_keymaps:
# guard to handle default value updates (mouse hover + backspace)
return
wm = bpy.context.window_manager
if wm.keyconfigs.addon: # not present when started with --background
# 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))
km = wm.keyconfigs.addon.keymaps.new(name=mode)
kmi = km.keymap_items.new('view3d.enable_all_qcd_slots', 'PLUS', 'PRESS', shift=True)
addon_qcd_view_edit_mode_hotkey_keymaps.append((km, kmi))
km = wm.keyconfigs.addon.keymaps.new(name=mode)
kmi = km.keymap_items.new('view3d.isolate_selected_objects_collections', 'EQUAL', 'PRESS')
addon_qcd_view_edit_mode_hotkey_keymaps.append((km, kmi))
km = wm.keyconfigs.addon.keymaps.new(name=mode)
kmi = km.keymap_items.new('view3d.disable_all_non_qcd_slots', 'PLUS', 'PRESS', shift=True, alt=True)
addon_qcd_view_edit_mode_hotkey_keymaps.append((km, kmi))
km = wm.keyconfigs.addon.keymaps.new(name=mode)
kmi = km.keymap_items.new('view3d.disable_all_collections', 'EQUAL', 'PRESS', alt=True, ctrl=True)
addon_qcd_view_edit_mode_hotkey_keymaps.append((km, kmi))
km = wm.keyconfigs.addon.keymaps.new(name=mode)
kmi = km.keymap_items.new('view3d.discard_qcd_history', 'EQUAL', 'PRESS', alt=True)
addon_qcd_view_edit_mode_hotkey_keymaps.append((km, kmi))
km = wm.keyconfigs.addon.keymaps.new(name="Mesh")
kmi = km.keymap_items.new('wm.call_menu', 'ACCENT_GRAVE', 'PRESS')
kmi.properties.name = "VIEW3D_MT_edit_mesh_select_mode"
addon_qcd_view_edit_mode_hotkey_keymaps.append((km, kmi))
def register_qcd_3dview_header_widget():
# unregister first to guard against default value updates (mouse hover + backspace)
# if the widget isn't registered it will just do nothing
unregister_qcd_3dview_header_widget()
# add the widget to the header, and an update function to the top bar to get view layer changes
bpy.types.VIEW3D_HT_header.append(ui.view3d_header_qcd_slots)
bpy.types.TOPBAR_HT_upper_bar.append(ui.view_layer_update)
def unregister_qcd():
global qcd_registered
if not qcd_registered:
# guard to handle default value updates (mouse hover + backspace)
return
unregister_qcd_3dview_header_widget()
for cls in qcd_classes:
bpy.utils.unregister_class(cls)
bpy.app.handlers.save_pre.remove(save_internal_data)
bpy.app.handlers.load_post.remove(load_internal_data)
bpy.app.handlers.load_pre.remove(load_pre_handler)
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()
unregister_qcd_view_edit_mode_hotkeys()
qcd_registered = False
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()
def unregister_qcd_3dview_header_widget():
bpy.types.VIEW3D_HT_header.remove(ui.view3d_header_qcd_slots)
bpy.types.TOPBAR_HT_upper_bar.remove(ui.view_layer_update)