[Bf-extensions-cvs] [29ab8a6b] master: Collection Manager: Add Phantom Mode. Task: T69577

Ryan Inch noreply at git.blender.org
Wed Nov 13 08:57:56 CET 2019


Commit: 29ab8a6b7e5c6735aebfac7fe4c579a6c6f1029c
Author: Ryan Inch
Date:   Wed Nov 13 02:51:53 2019 -0500
Branches: master
https://developer.blender.org/rBAC29ab8a6b7e5c6735aebfac7fe4c579a6c6f1029c

Collection Manager: Add Phantom Mode. Task: T69577

First attempt to mimic the restore on quit functionality
requested by Paul Kotelevets (1D_Inc).

===================================================================

M	collection_manager/__init__.py
M	collection_manager/internals.py
M	collection_manager/operators.py
M	collection_manager/ui.py

===================================================================

diff --git a/collection_manager/__init__.py b/collection_manager/__init__.py
index 3f675145..ea5c9992 100644
--- a/collection_manager/__init__.py
+++ b/collection_manager/__init__.py
@@ -23,7 +23,7 @@ bl_info = {
     "name": "Collection Manager",
     "description": "Manage collections and their objects",
     "author": "Ryan Inch",
-    "version": (1,2,2),
+    "version": (1,3,0),
     "blender": (2, 80, 0),
     "location": "View3D - Object Mode (Shortcut - M)",
     "warning": '',  # used for warning icon and text in addons panel
@@ -69,6 +69,7 @@ classes = (
     operators.CMNewCollectionOperator,
     operators.CMRemoveCollectionOperator,
     operators.CMSetCollectionOperator,
+    operators.CMPhantomModeOperator,
     ui.CM_UL_items,
     ui.CollectionManager,
     ui.CMRestrictionTogglesPanel,
@@ -86,6 +87,8 @@ def register():
     bpy.types.Scene.show_hideviewport = BoolProperty(default=True, name="Hide in Viewport")
     bpy.types.Scene.show_disableviewport = BoolProperty(default=False, name="Disable in Viewports")
     bpy.types.Scene.show_render = BoolProperty(default=False, name="Disable in Renders")
+    
+    bpy.types.Scene.CM_Phantom_Mode = BoolProperty(default=False)
 
 
     # create the global menu hotkey
@@ -107,6 +110,8 @@ def unregister():
     del bpy.types.Scene.show_disableviewport
     del bpy.types.Scene.show_render
     
+    del bpy.types.Scene.CM_Phantom_Mode
+    
     # remove keymaps when add-on is deactivated
     for km, kmi in addon_keymaps:
         km.keymap_items.remove(kmi)
diff --git a/collection_manager/internals.py b/collection_manager/internals.py
index d2b3abf4..59a0aa3c 100644
--- a/collection_manager/internals.py
+++ b/collection_manager/internals.py
@@ -13,6 +13,11 @@ row_index = 0
 def get_max_lvl():
     return max_lvl
 
+def clone_list(l1, l2):
+    l1.clear()
+    for x in l2:
+        l1.append(x)
+
 class CMListCollection(PropertyGroup):
     name: StringProperty()
 
diff --git a/collection_manager/operators.py b/collection_manager/operators.py
index eb9f85f0..d3bfb345 100644
--- a/collection_manager/operators.py
+++ b/collection_manager/operators.py
@@ -825,3 +825,119 @@ class CMNewCollectionOperator(bpy.types.Operator):
         disablerenderall_history.clear()
         
         return {'FINISHED'}
+    
+
+phantom_history = {"view_layer": "",
+                   "initial_state": {},
+                   
+                   "excludeall_history": [],
+                   "restrictselectall_history": [],
+                   "hideall_history": [],
+                   "disableviewall_history": [],
+                   "disablerenderall_history": [],
+                   
+                   "exclude_history": [],
+                   "restrictselect_history": [],
+                   "hide_history": [],
+                   "disableview_history": [],
+                   "disablerender_history": []
+                   }
+
+phantom_view_layer = []
+class CMPhantomModeOperator(bpy.types.Operator):
+    '''Toggle Phantom Mode'''
+    bl_label = "Toggle Phantom Mode"
+    bl_idname = "view3d.toggle_phantom_mode"
+    
+    def execute(self, context):
+        global phantom_history
+        
+        scn = context.scene
+        
+        # enter Phantom Mode
+        if not scn.CM_Phantom_Mode:
+            
+            scn.CM_Phantom_Mode = True
+            
+            # save current visibility state
+            phantom_history["view_layer"] = context.view_layer.name
+            
+            laycol_iter_list = [context.view_layer.layer_collection.children]
+            while len(laycol_iter_list) > 0:
+                new_laycol_iter_list = []
+                for laycol_iter in laycol_iter_list:
+                    for layer_collection in laycol_iter:
+                        phantom_history["initial_state"][layer_collection.name] = {
+                            "exclude": layer_collection.exclude,
+                            "selectable": layer_collection.collection.hide_select,
+                            "hide_viewport": layer_collection.hide_viewport,
+                            "disable_viewport": layer_collection.collection.hide_viewport,
+                            "renderable": layer_collection.collection.hide_render,
+                                }
+                        
+                        if len(layer_collection.children) > 0:
+                            new_laycol_iter_list.append(layer_collection.children)
+                
+                laycol_iter_list = new_laycol_iter_list
+            
+            
+            phantom_history["excludeall_history"] = excludeall_history[:]
+            phantom_history["restrictselectall_history"] = restrictselectall_history[:]
+            phantom_history["hideall_history"] = hideall_history[:]
+            phantom_history["disableviewall_history"] = disableviewall_history[:]
+            phantom_history["disablerenderall_history"] = disablerenderall_history[:]
+            
+            phantom_history["exclude_history"] = exclude_history[:]
+            phantom_history["restrictselect_history"] = restrictselect_history[:]
+            phantom_history["hide_history"] = hide_history[:]
+            phantom_history["disableview_history"] = disableview_history[:]
+            phantom_history["disablerender_history"] = disablerender_history[:]
+        
+        
+        # return to normal mode
+        else:
+            laycol_iter_list = [context.view_layer.layer_collection.children]
+            while len(laycol_iter_list) > 0:
+                new_laycol_iter_list = []
+                for laycol_iter in laycol_iter_list:
+                    for layer_collection in laycol_iter:
+                        phantom_laycol = phantom_history["initial_state"][layer_collection.name]
+                        
+                        layer_collection.exclude = \
+                            phantom_laycol["exclude"]
+                        
+                        layer_collection.collection.hide_select = \
+                            phantom_laycol["selectable"]
+                        
+                        layer_collection.hide_viewport = \
+                            phantom_laycol["hide_viewport"]
+                        
+                        layer_collection.collection.hide_viewport = \
+                            phantom_laycol["disable_viewport"]
+                        
+                        layer_collection.collection.hide_render = \
+                            phantom_laycol["renderable"]
+                                
+                        
+                        if len(layer_collection.children) > 0:
+                            new_laycol_iter_list.append(layer_collection.children)
+                
+                laycol_iter_list = new_laycol_iter_list
+                
+            
+            clone_list(excludeall_history, phantom_history["excludeall_history"])
+            clone_list(restrictselectall_history, phantom_history["restrictselectall_history"])
+            clone_list(hideall_history,phantom_history["hideall_history"])
+            clone_list(disableviewall_history, phantom_history["disableviewall_history"])
+            clone_list(disablerenderall_history, phantom_history["disablerenderall_history"])
+            
+            clone_list(exclude_history, phantom_history["exclude_history"])
+            clone_list(restrictselect_history, phantom_history["restrictselect_history"])
+            clone_list(hide_history, phantom_history["hide_history"])
+            clone_list(disableview_history, phantom_history["disableview_history"])
+            clone_list(disablerender_history, phantom_history["disablerender_history"])
+            
+            scn.CM_Phantom_Mode = False
+            
+        
+        return {'FINISHED'}
diff --git a/collection_manager/ui.py b/collection_manager/ui.py
index 54886dea..4ea57bbe 100644
--- a/collection_manager/ui.py
+++ b/collection_manager/ui.py
@@ -13,6 +13,7 @@ from .operators import (
     disableviewall_history,
     disablerenderall_history,
     rename,
+    phantom_history,
     )
 
 
@@ -105,6 +106,14 @@ class CollectionManager(Operator):
         
         addcollec_row.operator("view3d.add_collection", text="Add SubCollection", icon='COLLECTION_NEW').child = True
         
+        phantom_row = layout.row()
+        toggle_text = "Disable " if scn.CM_Phantom_Mode else "Enable "
+        phantom_row.operator("view3d.toggle_phantom_mode", text=toggle_text+"Phantom Mode")
+        
+        if scn.CM_Phantom_Mode:
+            view.enabled = False
+            addcollec_row.enabled = False
+        
         
     def execute(self, context):
         wm = context.window_manager
@@ -135,6 +144,13 @@ class CollectionManager(Operator):
         except:
             context.scene.CMListIndex = 0
         
+        if context.scene.CM_Phantom_Mode:
+            if set(layer_collections.keys()) != set(phantom_history["initial_state"].keys()):
+                context.scene.CM_Phantom_Mode = False
+            
+            if context.view_layer.name != phantom_history["view_layer"]:
+                context.scene.CM_Phantom_Mode = False
+        
         return wm.invoke_popup(self, width=(400+(lvl*20)))
 
 
@@ -237,6 +253,11 @@ class CM_UL_items(UIList):
         rm_op = split.row()
         rm_op.alignment = 'RIGHT'
         rm_op.operator("view3d.remove_collection", text="", icon='X', emboss=False).collection_name = item.name
+        
+        if scn.CM_Phantom_Mode:
+            name_row.enabled = False
+            row_setcol.enabled = False
+            rm_op.enabled = False
     
     
     def filter_items(self, context, data, propname):



More information about the Bf-extensions-cvs mailing list