From 19e2083f9f6c4cca169c3d763456340029c54fd8 Mon Sep 17 00:00:00 2001
From: Ryan Inch <mythologylover75@gmail.com>
Date: Fri, 10 Apr 2020 00:35:37 -0400
Subject: [PATCH] Collection Manager: Fix View Layer update. Task: T69577

Make QCD 3D View header widget update immediately
after changing View Layers.

Prevent unnecessary View Layer update
in Collection Manager popup.
---
 object_collection_manager/__init__.py      |  2 +-
 object_collection_manager/internals.py     |  7 +++++++
 object_collection_manager/operators.py     |  6 ++----
 object_collection_manager/qcd_init.py      |  2 ++
 object_collection_manager/qcd_operators.py | 13 ++++---------
 object_collection_manager/ui.py            | 19 ++++++++++++++++---
 6 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/object_collection_manager/__init__.py b/object_collection_manager/__init__.py
index 54a0bba2f..455670fc3 100644
--- a/object_collection_manager/__init__.py
+++ b/object_collection_manager/__init__.py
@@ -22,7 +22,7 @@ bl_info = {
     "name": "Collection Manager",
     "description": "Manage collections and their objects",
     "author": "Ryan Inch",
-    "version": (2,5,2),
+    "version": (2,5,3),
     "blender": (2, 80, 0),
     "location": "View3D - Object Mode (Shortcut - M)",
     "warning": '',  # used for warning icon and text in addons panel
diff --git a/object_collection_manager/internals.py b/object_collection_manager/internals.py
index 594756c95..6b9621198 100644
--- a/object_collection_manager/internals.py
+++ b/object_collection_manager/internals.py
@@ -408,6 +408,13 @@ def get_move_active():
     return bpy.data.objects[move_active] if move_active else None
 
 
+def update_qcd_header():
+    cm = bpy.context.scene.collection_manager
+    cm.update_header.clear()
+    new_update_header = cm.update_header.add()
+    new_update_header.name = "updated"
+
+
 class CMSendReport(Operator):
     bl_label = "Send Report"
     bl_idname = "view3d.cm_send_report"
diff --git a/object_collection_manager/operators.py b/object_collection_manager/operators.py
index 1094e5788..1aca6c3cb 100644
--- a/object_collection_manager/operators.py
+++ b/object_collection_manager/operators.py
@@ -42,6 +42,7 @@ from .internals import (
     get_modifiers,
     get_move_selection,
     get_move_active,
+    update_qcd_header,
     send_report,
 )
 
@@ -255,10 +256,7 @@ class CMSetCollectionOperator(Operator):
                 pass
 
         # update qcd header UI
-        cm = bpy.context.scene.collection_manager
-        cm.update_header.clear()
-        new_update_header = cm.update_header.add()
-        new_update_header.name = "updated"
+        update_qcd_header()
 
         return {'FINISHED'}
 
diff --git a/object_collection_manager/qcd_init.py b/object_collection_manager/qcd_init.py
index 0bef6e446..69bb46210 100644
--- a/object_collection_manager/qcd_init.py
+++ b/object_collection_manager/qcd_init.py
@@ -59,6 +59,7 @@ def register_qcd():
         register_qcd_view_hotkeys()
 
     bpy.types.VIEW3D_HT_header.append(ui.view3d_header_qcd_slots)
+    bpy.types.TOPBAR_HT_upper_bar.append(ui.view_layer_update)
 
 def register_qcd_view_hotkeys():
     wm = bpy.context.window_manager
@@ -101,6 +102,7 @@ def register_qcd_view_hotkeys():
 
 def unregister_qcd():
     bpy.types.VIEW3D_HT_header.remove(ui.view3d_header_qcd_slots)
+    bpy.types.TOPBAR_HT_upper_bar.remove(ui.view_layer_update)
 
     for cls in qcd_classes:
         bpy.utils.unregister_class(cls)
diff --git a/object_collection_manager/qcd_operators.py b/object_collection_manager/qcd_operators.py
index 679d35be2..c39a9cf32 100644
--- a/object_collection_manager/qcd_operators.py
+++ b/object_collection_manager/qcd_operators.py
@@ -38,7 +38,8 @@ from .internals import (
     update_property_group,
     get_modifiers,
     get_move_selection,
-    get_move_active
+    get_move_active,
+    update_qcd_header,
 )
 
 from .operators import rto_history
@@ -115,10 +116,7 @@ class MoveToQCDSlot(Operator):
                 pass
 
         # update header UI
-        cm = bpy.context.scene.collection_manager
-        cm.update_header.clear()
-        new_update_header = cm.update_header.add()
-        new_update_header.name = "updated"
+        update_qcd_header()
 
         return {'FINISHED'}
 
@@ -240,10 +238,7 @@ class ViewQCDSlot(Operator):
             context.view_layer.active_layer_collection = qcd_laycol
 
         # update header UI
-        cm = bpy.context.scene.collection_manager
-        cm.update_header.clear()
-        new_update_header = cm.update_header.add()
-        new_update_header.name = "updated"
+        update_qcd_header()
 
         view_layer = context.view_layer.name
         if view_layer in rto_history["exclude"]:
diff --git a/object_collection_manager/ui.py b/object_collection_manager/ui.py
index 0e2739c2c..9de8f3e44 100644
--- a/object_collection_manager/ui.py
+++ b/object_collection_manager/ui.py
@@ -18,6 +18,8 @@
 
 # Copyright 2011, Ryan Inch
 
+import bpy
+
 from bpy.types import (
     Operator,
     Panel,
@@ -37,7 +39,8 @@ from .internals import (
     update_property_group,
     generate_state,
     get_move_selection,
-    get_move_active
+    get_move_active,
+    update_qcd_header,
 )
 
 from .operators import (
@@ -66,13 +69,17 @@ class CollectionManager(Operator):
         self.window_open = True
 
     def draw(self, context):
+        cls = CollectionManager
         layout = self.layout
         cm = context.scene.collection_manager
         view_layer = context.view_layer
 
-        if view_layer.name != self.last_view_layer:
+        if view_layer.name != cls.last_view_layer:
+            if context.preferences.addons[__package__].preferences.enable_qcd:
+                bpy.app.timers.register(update_qcd_header)
+
             update_collection_tree(context)
-            self.last_view_layer = view_layer.name
+            cls.last_view_layer = view_layer.name
 
         title_row = layout.split(factor=0.5)
         main = title_row.row()
@@ -646,6 +653,12 @@ def view3d_header_qcd_slots(self, context):
         idx += 1
 
 
+def view_layer_update(self, context):
+    if context.view_layer.name != CollectionManager.last_view_layer:
+        bpy.app.timers.register(update_qcd_header)
+        CollectionManager.last_view_layer = context.view_layer.name
+
+
 def get_active_icon(context, qcd_laycol):
     global last_icon_theme_text
     global last_icon_theme_text_sel
-- 
GitLab