Merge branch 'blender-v2.92-release'
[blender-addons.git] / object_collection_manager / cm_init.py
blob9d0afea37e1a0e9a784598de732a35cefd547210
1 # ##### BEGIN GPL LICENSE BLOCK #####
3 # This program is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License
5 # as published by the Free Software Foundation; either version 2
6 # of the License, or (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software Foundation,
15 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 # ##### END GPL LICENSE BLOCK #####
19 # Copyright 2011, Ryan Inch
21 if "bpy" in locals():
22 import importlib
24 importlib.reload(internals)
25 importlib.reload(operator_utils)
26 importlib.reload(operators)
27 importlib.reload(ui)
28 importlib.reload(preferences)
30 else:
31 from . import internals
32 from . import operator_utils
33 from . import operators
34 from . import ui
35 from . import preferences
37 import bpy
38 from bpy.app.handlers import persistent
39 from bpy.types import PropertyGroup
40 from bpy.props import (
41 CollectionProperty,
42 EnumProperty,
43 IntProperty,
44 BoolProperty,
45 StringProperty,
46 PointerProperty,
50 class CollectionManagerProperties(PropertyGroup):
51 cm_list_collection: CollectionProperty(type=internals.CMListCollection)
52 cm_list_index: IntProperty()
54 show_exclude: BoolProperty(default=True, name="[EC] Exclude from View Layer")
55 show_selectable: BoolProperty(default=True, name="[SS] Disable Selection")
56 show_hide_viewport: BoolProperty(default=True, name="[VV] Hide in Viewport")
57 show_disable_viewport: BoolProperty(default=False, name="[DV] Disable in Viewports")
58 show_render: BoolProperty(default=False, name="[RR] Disable in Renders")
59 show_holdout: BoolProperty(default=False, name="[HH] Holdout")
60 show_indirect_only: BoolProperty(default=False, name="[IO] Indirect Only")
62 align_local_ops: BoolProperty(default=False, name="Align Local Options",
63 description="Align local options in a column to the right")
65 in_phantom_mode: BoolProperty(default=False)
67 update_header: CollectionProperty(type=internals.CMListCollection)
69 ui_separator: StringProperty(name="", default="")
71 qcd_slots_blend_data: StringProperty()
74 addon_keymaps = []
75 addon_disable_objects_hotkey_keymaps = []
77 classes = (
78 internals.CMListCollection,
79 internals.CMSendReport,
80 operators.SetActiveCollection,
81 operators.ExpandAllOperator,
82 operators.ExpandSublevelOperator,
83 operators.CMExcludeOperator,
84 operators.CMUnExcludeAllOperator,
85 operators.CMRestrictSelectOperator,
86 operators.CMUnRestrictSelectAllOperator,
87 operators.CMHideOperator,
88 operators.CMUnHideAllOperator,
89 operators.CMDisableViewportOperator,
90 operators.CMUnDisableViewportAllOperator,
91 operators.CMDisableRenderOperator,
92 operators.CMUnDisableRenderAllOperator,
93 operators.CMHoldoutOperator,
94 operators.CMUnHoldoutAllOperator,
95 operators.CMIndirectOnlyOperator,
96 operators.CMUnIndirectOnlyAllOperator,
97 operators.CMNewCollectionOperator,
98 operators.CMRemoveCollectionOperator,
99 operators.CMRemoveEmptyCollectionsOperator,
100 operators.CMSelectCollectionObjectsOperator,
101 operators.CMSetCollectionOperator,
102 operators.CMPhantomModeOperator,
103 operators.CMApplyPhantomModeOperator,
104 operators.CMDisableObjectsOperator,
105 operators.CMDisableUnSelectedObjectsOperator,
106 operators.CMRestoreDisabledObjectsOperator,
107 preferences.CMPreferences,
108 ui.CM_UL_items,
109 ui.CollectionManager,
110 ui.CMDisplayOptionsPanel,
111 ui.SpecialsMenu,
112 CollectionManagerProperties,
116 @persistent
117 def depsgraph_update_post_handler(dummy):
118 if internals.move_triggered:
119 internals.move_triggered = False
120 return
122 internals.move_selection.clear()
123 internals.move_active = None
125 @persistent
126 def undo_redo_post_handler(dummy):
127 internals.move_selection.clear()
128 internals.move_active = None
131 def menu_addition(self, context):
132 layout = self.layout
134 layout.operator('view3d.collection_manager')
136 if bpy.context.preferences.addons[__package__].preferences.enable_qcd:
137 layout.operator('view3d.qcd_move_widget')
139 layout.separator()
141 def disable_objects_menu_addition(self, context):
142 preferences = bpy.context.preferences.addons[__package__].preferences
143 if preferences.enable_disable_objects_override:
144 layout = self.layout
145 layout.separator()
146 layout.operator('view3d.disable_selected_objects')
147 layout.operator('view3d.disable_unselected_objects')
148 layout.operator('view3d.restore_disabled_objects')
151 def register_disable_objects_hotkeys():
152 wm = bpy.context.window_manager
153 if wm.keyconfigs.addon: # not present when started with --background
154 km = wm.keyconfigs.addon.keymaps.new(name='Object Mode')
155 kmi = km.keymap_items.new('view3d.disable_selected_objects', 'H', 'PRESS')
156 addon_disable_objects_hotkey_keymaps.append((km, kmi))
158 km = wm.keyconfigs.addon.keymaps.new(name='Object Mode')
159 kmi = km.keymap_items.new('view3d.disable_unselected_objects', 'H', 'PRESS', shift=True)
160 addon_disable_objects_hotkey_keymaps.append((km, kmi))
162 km = wm.keyconfigs.addon.keymaps.new(name='Object Mode')
163 kmi = km.keymap_items.new('view3d.restore_disabled_objects', 'H', 'PRESS', alt=True)
164 addon_disable_objects_hotkey_keymaps.append((km, kmi))
166 def unregister_disable_objects_hotkeys():
167 # remove keymaps when disable objects hotkeys are deactivated
168 for km, kmi in addon_disable_objects_hotkey_keymaps:
169 km.keymap_items.remove(kmi)
170 addon_disable_objects_hotkey_keymaps.clear()
173 def register_cm():
174 for cls in classes:
175 bpy.utils.register_class(cls)
177 bpy.types.Scene.collection_manager = PointerProperty(type=CollectionManagerProperties)
179 # create the global menu hotkey
180 wm = bpy.context.window_manager
181 if wm.keyconfigs.addon: # not present when started with --background
182 km = wm.keyconfigs.addon.keymaps.new(name='Object Mode')
183 kmi = km.keymap_items.new('view3d.collection_manager', 'M', 'PRESS')
184 addon_keymaps.append((km, kmi))
186 # Add Collection Manager & QCD Move Widget to the Object->Collections menu
187 bpy.types.VIEW3D_MT_object_collection.prepend(menu_addition)
189 # Add Disable Object Operators to the Object->Show/Hide menu
190 bpy.types.VIEW3D_MT_object_showhide.append(disable_objects_menu_addition)
192 bpy.app.handlers.depsgraph_update_post.append(depsgraph_update_post_handler)
193 bpy.app.handlers.undo_post.append(undo_redo_post_handler)
194 bpy.app.handlers.redo_post.append(undo_redo_post_handler)
196 preferences = bpy.context.preferences.addons[__package__].preferences
197 if preferences.enable_disable_objects_override:
198 register_disable_objects_hotkeys()
200 def unregister_cm():
201 preferences = bpy.context.preferences.addons[__package__].preferences
202 if preferences.enable_disable_objects_override:
203 unregister_disable_objects_hotkeys()
205 for cls in classes:
206 bpy.utils.unregister_class(cls)
208 # Remove Collection Manager & QCD Move Widget from the Object->Collections menu
209 bpy.types.VIEW3D_MT_object_collection.remove(menu_addition)
211 # Remove Disable Object Operators to the Object->Show/Hide menu
212 bpy.types.VIEW3D_MT_object_showhide.remove(disable_objects_menu_addition)
214 bpy.app.handlers.depsgraph_update_post.remove(depsgraph_update_post_handler)
215 bpy.app.handlers.undo_post.remove(undo_redo_post_handler)
216 bpy.app.handlers.redo_post.remove(undo_redo_post_handler)
218 del bpy.types.Scene.collection_manager
220 # remove keymaps when add-on is deactivated
221 for km, kmi in addon_keymaps:
222 km.keymap_items.remove(kmi)
223 addon_keymaps.clear()