tools: in performance-log-viewer.py, defer UI updates util needed

In the performance-log viewer, defer updates to the various UI
elements when the selection changes until they're actually shown.
This improves responsiveness when changing the selection.

(cherry picked from commit a7afbe13ec)
This commit is contained in:
Ell
2018-09-22 23:23:28 -04:00
parent 0207c9baa1
commit ea17d18d1b

View File

@ -1369,7 +1369,7 @@ class InformationViewer (Gtk.ScrolledWindow):
for element in info:
add_element (element)
class VariablesViewer (Gtk.Box):
class VariablesViewer (Gtk.ScrolledWindow):
class Store (Gtk.ListStore):
NAME = 0
COLOR = 1
@ -1397,21 +1397,17 @@ class VariablesViewer (Gtk.Box):
def __init__ (self, *args, **kwargs):
Gtk.Box.__init__ (self,
*args,
orientation = Gtk.Orientation.VERTICAL,
hscrollbar_policy = Gtk.PolicyType.AUTOMATIC,
vscrollbar_policy = Gtk.PolicyType.AUTOMATIC,
**kwargs)
scroll = Gtk.ScrolledWindow (
hscrollbar_policy = Gtk.PolicyType.AUTOMATIC,
vscrollbar_policy = Gtk.PolicyType.AUTOMATIC
)
self.pack_start (scroll, True, True, 0)
scroll.show ()
self.needs_update = True
store = self.Store ()
self.store = store
tree = Gtk.TreeView (model = store)
scroll.add (tree)
self.add (tree)
tree.show ()
self.single_sample_cols = []
@ -1457,9 +1453,12 @@ class VariablesViewer (Gtk.Box):
selection.connect ("change-complete", self.selection_change_complete)
self.selection_change_complete (selection)
def update (self):
if not self.needs_update:
return
self.needs_update = False
def selection_change_complete (self, selection):
sel = selection.get_effective_selection ()
n_sel = len (sel)
@ -1506,6 +1505,17 @@ class VariablesViewer (Gtk.Box):
for col in self.single_sample_cols: col.set_visible (n_sel == 1)
for col in self.multi_sample_cols: col.set_visible (n_sel > 1)
def do_map (self):
self.update ()
Gtk.ScrolledWindow.do_map (self)
def selection_change_complete (self, selection):
self.needs_update = True
if self.get_mapped ():
self.update ()
class BacktraceViewer (Gtk.Box):
class ThreadStore (Gtk.ListStore):
INDEX = 0
@ -1534,6 +1544,8 @@ class BacktraceViewer (Gtk.Box):
orientation = Gtk.Orientation.HORIZONTAL,
**kwargs)
self.needs_update = True
vbox = Gtk.Box (orientation = Gtk.Orientation.VERTICAL)
self.pack_start (vbox, False, False, 0)
vbox.show ()
@ -1687,8 +1699,6 @@ class BacktraceViewer (Gtk.Box):
selection.connect ("change-complete", self.selection_change_complete)
self.selection_change_complete (selection)
@GObject.Property (type = bool, default = False)
def available (self):
sel = selection.get_effective_selection ()
@ -1700,7 +1710,12 @@ class BacktraceViewer (Gtk.Box):
return False
def selection_change_complete (self, selection):
def update (self):
if not self.needs_update or not self.available:
return
self.needs_update = False
tid = None
sel_rows = self.thread_tree.get_selection ().get_selected_rows ()[1]
@ -1708,20 +1723,30 @@ class BacktraceViewer (Gtk.Box):
if sel_rows:
tid = self.thread_store[sel_rows[0]][self.ThreadStore.ID]
if self.available:
i, = selection.get_effective_selection ()
i, = selection.get_effective_selection ()
self.thread_store.clear ()
self.thread_store.clear ()
for t in range (len (samples[i].backtrace)):
thread = samples[i].backtrace[t]
for t in range (len (samples[i].backtrace)):
thread = samples[i].backtrace[t]
iter = self.thread_store.append (
(t, thread.id, thread.name, str (thread.state))
)
iter = self.thread_store.append (
(t, thread.id, thread.name, str (thread.state))
)
if thread.id == tid:
self.thread_tree.get_selection ().select_iter (iter)
if thread.id == tid:
self.thread_tree.get_selection ().select_iter (iter)
def do_map (self):
self.update ()
Gtk.Box.do_map (self)
def selection_change_complete (self, selection):
self.needs_update = True
if self.get_mapped ():
self.update ()
self.notify ("available")
@ -1968,7 +1993,8 @@ class ProfileViewer (Gtk.ScrolledWindow):
col.set_cell_data_func (cell,
format_percentage_col, store.INCLUSIVE)
self.update ()
if id:
self.update ()
def update (self):
self.remove_subprofile ()
@ -2217,13 +2243,14 @@ class ProfileViewer (Gtk.ScrolledWindow):
)
self.adjustment_changed_handler = None
self.needs_update = True
profile = self.Profile ()
self.root_profile = profile
self.add (profile)
profile.show ()
selection.connect ("change-complete", lambda *args: self.update ())
selection.connect ("change-complete", self.selection_change_complete)
profile.connect ("subprofile-added", self.subprofile_added)
@ -2237,8 +2264,23 @@ class ProfileViewer (Gtk.ScrolledWindow):
return False
def update (self):
if self.available:
self.root_profile.update ()
if not self.needs_update or not self.available:
return
self.needs_update = False
self.root_profile.update ()
def do_map (self):
self.update ()
Gtk.ScrolledWindow.do_map (self)
def selection_change_complete (self, selection):
self.needs_update = True
if self.get_mapped ():
self.update ()
self.notify ("available")