Collection Manager: Add disable override. Task: T69577.

Add an override checkbox to the preferences to override
the object hiding hotkeys with object disabling hotkeys
and add menu items to the Object->Show/Hide menu for the
disable object operators.

Disabling objects is needed to preserve their visibility
state when excluding and unexcluding collections.
This makes it easier to disable objects, and disabling
objects prevents QCD slot switching from resetting the
objects visibility state.
This commit is contained in:
Ryan Inch 2020-10-25 01:14:53 -04:00
parent 8488f40e0b
commit 7cc2e4b14f
4 changed files with 83 additions and 138 deletions

View File

@ -22,7 +22,7 @@ bl_info = {
"name": "Collection Manager",
"description": "Manage collections and their objects",
"author": "Ryan Inch",
"version": (2, 17, 1),
"version": (2, 18, 0),
"blender": (2, 80, 0),
"location": "View3D - Object Mode (Shortcut - M)",
"warning": '', # used for warning icon and text in addons panel
@ -35,6 +35,7 @@ bl_info = {
if "bpy" in locals():
import importlib
importlib.reload(cm_init)
importlib.reload(internals)
importlib.reload(operator_utils)
importlib.reload(operators)
@ -45,6 +46,7 @@ if "bpy" in locals():
importlib.reload(preferences)
else:
from . import cm_init
from . import internals
from . import operator_utils
from . import operators
@ -55,124 +57,9 @@ else:
from . import preferences
import bpy
from bpy.app.handlers import persistent
from bpy.types import PropertyGroup
from bpy.props import (
CollectionProperty,
EnumProperty,
IntProperty,
BoolProperty,
StringProperty,
PointerProperty,
)
class CollectionManagerProperties(PropertyGroup):
cm_list_collection: CollectionProperty(type=internals.CMListCollection)
cm_list_index: IntProperty()
show_exclude: BoolProperty(default=True, name="[EC] Exclude from View Layer")
show_selectable: BoolProperty(default=True, name="[SS] Disable Selection")
show_hide_viewport: BoolProperty(default=True, name="[VV] Hide in Viewport")
show_disable_viewport: BoolProperty(default=False, name="[DV] Disable in Viewports")
show_render: BoolProperty(default=False, name="[RR] Disable in Renders")
show_holdout: BoolProperty(default=False, name="[HH] Holdout")
show_indirect_only: BoolProperty(default=False, name="[IO] Indirect Only")
align_local_ops: BoolProperty(default=False, name="Align Local Options",
description="Align local options in a column to the right")
in_phantom_mode: BoolProperty(default=False)
update_header: CollectionProperty(type=internals.CMListCollection)
ui_separator: StringProperty(name="", default="")
qcd_slots_blend_data: StringProperty()
addon_keymaps = []
classes = (
internals.CMListCollection,
internals.CMSendReport,
operators.SetActiveCollection,
operators.ExpandAllOperator,
operators.ExpandSublevelOperator,
operators.CMExcludeOperator,
operators.CMUnExcludeAllOperator,
operators.CMRestrictSelectOperator,
operators.CMUnRestrictSelectAllOperator,
operators.CMHideOperator,
operators.CMUnHideAllOperator,
operators.CMDisableViewportOperator,
operators.CMUnDisableViewportAllOperator,
operators.CMDisableRenderOperator,
operators.CMUnDisableRenderAllOperator,
operators.CMHoldoutOperator,
operators.CMUnHoldoutAllOperator,
operators.CMIndirectOnlyOperator,
operators.CMUnIndirectOnlyAllOperator,
operators.CMNewCollectionOperator,
operators.CMRemoveCollectionOperator,
operators.CMRemoveEmptyCollectionsOperator,
operators.CMSelectCollectionObjectsOperator,
operators.CMSetCollectionOperator,
operators.CMPhantomModeOperator,
operators.CMApplyPhantomModeOperator,
preferences.CMPreferences,
ui.CM_UL_items,
ui.CollectionManager,
ui.CMDisplayOptionsPanel,
ui.SpecialsMenu,
CollectionManagerProperties,
)
@persistent
def depsgraph_update_post_handler(dummy):
if internals.move_triggered:
internals.move_triggered = False
return
internals.move_selection.clear()
internals.move_active = None
@persistent
def undo_redo_post_handler(dummy):
internals.move_selection.clear()
internals.move_active = None
def menu_addition(self, context):
layout = self.layout
layout.operator('view3d.collection_manager')
if bpy.context.preferences.addons[__package__].preferences.enable_qcd:
layout.operator('view3d.qcd_move_widget')
layout.separator()
def register():
for cls in classes:
bpy.utils.register_class(cls)
bpy.types.Scene.collection_manager = PointerProperty(type=CollectionManagerProperties)
# create the global menu hotkey
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.collection_manager', 'M', 'PRESS')
addon_keymaps.append((km, kmi))
# Add Collection Manager & QCD Move Widget to the Object->Collections menu
bpy.types.VIEW3D_MT_object_collection.prepend(menu_addition)
bpy.app.handlers.depsgraph_update_post.append(depsgraph_update_post_handler)
bpy.app.handlers.undo_post.append(undo_redo_post_handler)
bpy.app.handlers.redo_post.append(undo_redo_post_handler)
cm_init.register_cm()
if bpy.context.preferences.addons[__package__].preferences.enable_qcd:
qcd_init.register_qcd()
@ -181,22 +68,7 @@ def unregister():
if bpy.context.preferences.addons[__package__].preferences.enable_qcd:
qcd_init.unregister_qcd()
for cls in classes:
bpy.utils.unregister_class(cls)
# Remove Collection Manager & QCD Move Widget from the Object->Collections menu
bpy.types.VIEW3D_MT_object_collection.remove(menu_addition)
bpy.app.handlers.depsgraph_update_post.remove(depsgraph_update_post_handler)
bpy.app.handlers.undo_post.remove(undo_redo_post_handler)
bpy.app.handlers.redo_post.remove(undo_redo_post_handler)
del bpy.types.Scene.collection_manager
# remove keymaps when add-on is deactivated
for km, kmi in addon_keymaps:
km.keymap_items.remove(kmi)
addon_keymaps.clear()
cm_init.unregister_cm()
if __name__ == "__main__":

View File

@ -1387,3 +1387,45 @@ class CMApplyPhantomModeOperator(Operator):
cm.in_phantom_mode = False
return {'FINISHED'}
class CMDisableObjectsOperator(Operator):
'''Disable selected objects in viewports'''
bl_label = "Disable Selected"
bl_idname = "view3d.disable_selected_objects"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
for obj in context.selected_objects:
obj.hide_viewport = True
return {'FINISHED'}
class CMDisableUnSelectedObjectsOperator(Operator):
'''Disable unselected objects in viewports'''
bl_label = "Disable Unselected"
bl_idname = "view3d.disable_unselected_objects"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
for obj in bpy.data.objects:
if obj in context.visible_objects and not obj in context.selected_objects:
obj.hide_viewport = True
return {'FINISHED'}
class CMRestoreDisabledObjectsOperator(Operator):
'''Restore disabled objects in viewports'''
bl_label = "Restore Disabled Objects"
bl_idname = "view3d.restore_disabled_objects"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
for obj in bpy.data.objects:
if obj.hide_viewport:
obj.hide_viewport = False
obj.select_set(True)
return {'FINISHED'}

View File

@ -26,8 +26,16 @@ from bpy.props import (
FloatVectorProperty,
)
from . import cm_init
from . import qcd_init
def update_disable_objects_hotkeys_status(self, context):
if self.enable_disable_objects_override:
cm_init.register_disable_objects_hotkeys()
else:
cm_init.unregister_disable_objects_hotkeys()
def update_qcd_status(self, context):
if self.enable_qcd:
qcd_init.register_qcd()
@ -188,6 +196,17 @@ def set_tooltip_outline(self, values):
class CMPreferences(AddonPreferences):
bl_idname = __package__
# ENABLE DISABLE OBJECTS OVERRIDE
enable_disable_objects_override: BoolProperty(
name="Disable Objects Override",
description=(
"Replace the object hiding hotkeys with object disabling hotkeys and add them to the Object->Show/Hide menu.\n"
"Disabling objects prevents them from being automatically shown again when collections are unexcluded"
),
default=False,
update=update_disable_objects_hotkeys_status,
)
# ENABLE QCD BOOLS
enable_qcd: BoolProperty(
name="QCD",
@ -426,6 +445,7 @@ class CMPreferences(AddonPreferences):
layout = self.layout
box = layout.box()
box.row().prop(self, "enable_disable_objects_override")
box.row().prop(self, "enable_qcd")
if not self.enable_qcd:

View File

@ -18,16 +18,27 @@
# 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
from . import internals
from . import preferences
from . import qcd_move_widget
from . import qcd_operators
from . import ui
addon_qcd_keymaps = []
addon_qcd_view_hotkey_keymaps = []