328 lines
12 KiB
Python
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)
|