[gimp/gimp-2-10] tools: in performance-log-viewer.py, retain call-graph path



commit df265073e4cd3ad15cddb4d2554aee0722883937
Author: Ell <ell_se yahoo com>
Date:   Sat Sep 29 00:14:38 2018 -0400

    tools: in performance-log-viewer.py, retain call-graph path
    
    In the performance-log viewer's profile view, retain the current
    call-graph path across state changes.
    
    (cherry picked from commit fca05065e1937b4d32e95375698a0e400e22ec48)

 tools/performance-log-viewer.py | 86 +++++++++++++++++++++++------------------
 1 file changed, 49 insertions(+), 37 deletions(-)
---
diff --git a/tools/performance-log-viewer.py b/tools/performance-log-viewer.py
index a670a725d7..dba9d4aa81 100755
--- a/tools/performance-log-viewer.py
+++ b/tools/performance-log-viewer.py
@@ -321,9 +321,9 @@ class History (GObject.GObject):
         self.undo_stack = []
         self.redo_stack = []
 
+        self.blocked         = 0
         self.n_groups        = 0
         self.pending_record  = False
-        self.suppress_record = 0
 
     @GObject.Property (type = bool, default = False)
     def can_undo (self):
@@ -336,6 +336,15 @@ class History (GObject.GObject):
     def add_source (self, get, set):
         self.sources.append (self.Source (get, set))
 
+    def block (self):
+        self.blocked += 1
+
+    def unblock (self):
+        self.blocked -= 1
+
+    def is_blocked (self):
+        return self.blocked > 0
+
     def start_group (self):
         self.n_groups += 1
 
@@ -346,7 +355,7 @@ class History (GObject.GObject):
             self.record ()
 
     def record (self):
-        if self.suppress_record:
+        if self.is_blocked ():
             return
 
         if self.n_groups == 0:
@@ -373,7 +382,7 @@ class History (GObject.GObject):
             self.pending_record = True
 
     def move (self, src, dest):
-        self.suppress_record += 1
+        self.block ()
 
         state = src.pop ()
 
@@ -391,7 +400,7 @@ class History (GObject.GObject):
         self.notify ("can-undo")
         self.notify ("can-redo")
 
-        self.suppress_record -= 1
+        self.unblock ()
 
     def undo (self):
         self.move (self.undo_stack, self.redo_stack)
@@ -2167,6 +2176,8 @@ class ProfileViewer (Gtk.ScrolledWindow):
                                         GObject.TYPE_UINT64, str, float, float)
 
         __gsignals__ = {
+            "needs-update":       (GObject.SIGNAL_RUN_FIRST,
+                                   None, (bool,)),
             "subprofile-added":   (GObject.SIGNAL_RUN_FIRST,
                                    None, (Gtk.Widget,)),
             "subprofile-removed": (GObject.SIGNAL_RUN_FIRST,
@@ -2322,20 +2333,11 @@ class ProfileViewer (Gtk.ScrolledWindow):
         def update (self):
             self.remove_subprofile ()
 
-            sel_id = None
-
-            sel_rows = self.tree.get_selection ().get_selected_rows ()[1]
-
-            if sel_rows:
-                sel_id = self.store[sel_rows[0]][self.store.ID]
-
             if not self.id:
                 self.update_frames ()
 
             self.update_store ()
 
-            self.select (sel_id)
-
             self.update_ui ()
 
         def update_frames (self):
@@ -2516,7 +2518,7 @@ class ProfileViewer (Gtk.ScrolledWindow):
 
             self.thread_filter_store.set_filter (thread_filter)
 
-            self.update ()
+            self.emit ("needs-update", False)
 
         def thread_filter_button_toggled (self, button):
             if not button.get_active ():
@@ -2529,7 +2531,7 @@ class ProfileViewer (Gtk.ScrolledWindow):
 
                     history.record ()
 
-                    self.update ()
+                    self.emit ("needs-update", True)
 
                     history.end_group ()
 
@@ -2539,7 +2541,7 @@ class ProfileViewer (Gtk.ScrolledWindow):
         def direction_source_set (self, direction):
             self.direction = direction
 
-            self.update ()
+            self.emit ("needs-update", False)
 
         def direction_button_clicked (self, button):
             if self.direction == self.Direction.CALLEES:
@@ -2551,7 +2553,7 @@ class ProfileViewer (Gtk.ScrolledWindow):
 
             history.record ()
 
-            self.update ()
+            self.emit ("needs-update", True)
 
             history.end_group ()
 
@@ -2632,7 +2634,7 @@ class ProfileViewer (Gtk.ScrolledWindow):
 
         self.adjustment_changed_handler = None
         self.needs_update               = True
-        self.pending_path               = None
+        self.path                       = ()
 
         profile = self.Profile ()
         self.root_profile = profile
@@ -2641,8 +2643,9 @@ class ProfileViewer (Gtk.ScrolledWindow):
 
         selection.connect ("change-complete", self.selection_change_complete)
 
-        profile.connect ("subprofile-added",   self.subprofile_added)
-        profile.connect ("subprofile-removed", self.subprofile_removed)
+        profile.connect ("needs-update",       self.profile_needs_update)
+        profile.connect ("subprofile-added",   self.profile_subprofile_added)
+        profile.connect ("subprofile-removed", self.profile_subprofile_removed)
 
         history.add_source (self.source_get, self.source_set)
 
@@ -2656,19 +2659,25 @@ class ProfileViewer (Gtk.ScrolledWindow):
         return False
 
     def update (self):
-        if not (self.needs_update or self.pending_path is not None) or \
-           not self.available:
+        if not self.available:
             return
 
+        history.block ()
+
         if self.needs_update:
             self.root_profile.update ()
 
             self.needs_update = False
 
-        if self.pending_path is not None:
-            self.root_profile.set_path (self.pending_path)
+        self.root_profile.set_path (self.path)
+
+        history.unblock ()
 
-            self.pending_path = None
+    def queue_update (self, now = False):
+        self.needs_update = True
+
+        if now or self.get_mapped ():
+            self.update ()
 
     def do_map (self):
         self.update ()
@@ -2676,14 +2685,17 @@ class ProfileViewer (Gtk.ScrolledWindow):
         Gtk.ScrolledWindow.do_map (self)
 
     def selection_change_complete (self, selection):
-        self.needs_update = True
-
-        if self.get_mapped ():
-            self.update ()
+        self.queue_update ()
 
         self.notify ("available")
 
-    def subprofile_added (self, profile, subprofile):
+    def profile_needs_update (self, profile, now):
+        self.queue_update (now)
+
+    def profile_subprofile_added (self, profile, subprofile):
+        if not history.is_blocked ():
+            self.path = profile.get_path ()
+
         history.record ()
 
         if not self.adjustment_changed_handler:
@@ -2703,20 +2715,20 @@ class ProfileViewer (Gtk.ScrolledWindow):
                 adjustment_changed
             )
 
-    def subprofile_removed (self, profile, subprofile):
+    def profile_subprofile_removed (self, profile, subprofile):
+        if not history.is_blocked ():
+            self.path = profile.get_path ()
+
         history.record ()
 
     def source_get (self):
-        if self.pending_path:
-            return self.pending_path
-        else:
-            return self.root_profile.get_path ()
+        return self.path
 
     def source_set (self, path):
+        self.path = path
+
         if self.get_mapped ():
             self.root_profile.set_path (path)
-        else:
-            self.pending_path = path
 
 class LogViewer (Gtk.Window):
     def __init__ (self, *args, **kwargs):


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]