From 6711e20dc3ba51b15fe6bffdc1f8ff9a42df8f58 Mon Sep 17 00:00:00 2001
From: "James E. Blair" <jeblair@hp.com>
Date: Wed, 7 Jan 2015 15:16:46 -0800
Subject: [PATCH] Always refresh the screen on pop

When going back a screen, always refresh the screen since something
may have changed while it was not displayed.  Also, refactor the
refresh methods to indicate whether something is of interest so
that if there is more than one refresh triggering event queued, we
still only refresh the screen once (if it is interested).

This should correct the problem where if you review a change and
go back to the change or project listings, the displayed numbers
are incorrect.

Change-Id: I97875831c4bd47f5e38992c38302b47809c785d5
---
 gertty/app.py               | 10 +++++++---
 gertty/view/change.py       | 17 ++++++++++-------
 gertty/view/change_list.py  | 24 +++++++++++++-----------
 gertty/view/diff.py         | 19 +++++++++++--------
 gertty/view/project_list.py | 18 ++++++++++--------
 5 files changed, 51 insertions(+), 37 deletions(-)

diff --git a/gertty/app.py b/gertty/app.py
index d5f66bd..29abf32 100644
--- a/gertty/app.py
+++ b/gertty/app.py
@@ -212,7 +212,7 @@ class App(object):
         if hasattr(widget, 'title'):
             self.status.update(title=widget.title)
         self.loop.widget = widget
-        self.refresh()
+        self.refresh(force=True)
 
     def findChangeList(self):
         for widget in reversed(self.screens):
@@ -226,17 +226,21 @@ class App(object):
             widget = self.screens.pop()
             self.loop.widget = widget
 
-    def refresh(self, data=None):
+    def refresh(self, data=None, force=False):
         self.status.refresh()
         widget = self.loop.widget
         while isinstance(widget, urwid.Overlay):
             widget = widget.contents[0][0]
+        interested = force
         try:
             while True:
                 event = self.sync.result_queue.get(0)
-                widget.refresh(event)
+                if widget.interested(event):
+                    interested = True
         except Queue.Empty:
             pass
+        if interested:
+            widget.refresh()
 
     def popup(self, widget,
               relative_width=50, relative_height=25,
diff --git a/gertty/view/change.py b/gertty/view/change.py
index b107452..39359dd 100644
--- a/gertty/view/change.py
+++ b/gertty/view/change.py
@@ -502,15 +502,18 @@ class ChangeView(urwid.WidgetWrap):
             if not succeeded:
                 raise gertty.view.DisplayError("Git commits not present in local repository")
 
-    def refresh(self, event=None):
-        if event and not ((isinstance(event, sync.ChangeAddedEvent) and
-                           self.change_key in event.related_change_keys)
-                          or
-                          (isinstance(event, sync.ChangeUpdatedEvent) and
-                           self.change_key in event.related_change_keys)):
+    def interested(self, event):
+        if not ((isinstance(event, sync.ChangeAddedEvent) and
+                 self.change_key in event.related_change_keys)
+                or
+                (isinstance(event, sync.ChangeUpdatedEvent) and
+                 self.change_key in event.related_change_keys)):
             self.log.debug("Ignoring refresh change due to event %s" % (event,))
-            return
+            return False
         self.log.debug("Refreshing change due to event %s" % (event,))
+        return True
+
+    def refresh(self):
         change_info = []
         with self.app.db.getSession() as session:
             change = session.getChange(self.change_key)
diff --git a/gertty/view/change_list.py b/gertty/view/change_list.py
index 7870ed6..7f5d74c 100644
--- a/gertty/view/change_list.py
+++ b/gertty/view/change_list.py
@@ -142,20 +142,22 @@ class ChangeListView(urwid.WidgetWrap):
         self._w.contents.append((self.listbox, ('weight', 1)))
         self._w.set_focus(3)
 
-    def refresh(self, event=None):
-        if event and not ((self.project_key is not None and
-                           isinstance(event, sync.ChangeAddedEvent) and
-                           self.project_key == event.project_key)
-                          or
-                          (self.project_key is None and
-                           isinstance(event, sync.ChangeAddedEvent))
-                          or
-                          (isinstance(event, sync.ChangeUpdatedEvent) and
-                           event.change_key in self.change_rows.keys())):
+    def interested(self, event):
+        if not ((self.project_key is not None and
+                 isinstance(event, sync.ChangeAddedEvent) and
+                 self.project_key == event.project_key)
+                or
+                (self.project_key is None and
+                 isinstance(event, sync.ChangeAddedEvent))
+                or
+                (isinstance(event, sync.ChangeUpdatedEvent) and
+                 event.change_key in self.change_rows.keys())):
             self.log.debug("Ignoring refresh change list due to event %s" % (event,))
-            return
+            return False
         self.log.debug("Refreshing change list due to event %s" % (event,))
+        return True
 
+    def refresh(self):
         unseen_keys = set(self.change_rows.keys())
         with self.app.db.getSession() as session:
             lst = session.getChanges(self.query, self.unreviewed,
diff --git a/gertty/view/diff.py b/gertty/view/diff.py
index 9630a7d..f4ee7b7 100644
--- a/gertty/view/diff.py
+++ b/gertty/view/diff.py
@@ -341,17 +341,20 @@ class BaseDiffView(urwid.WidgetWrap):
     def makeFileHeader(self, diff, comment_lists):
         raise NotImplementedError
 
-    def refresh(self, event=None):
-        if event and not ((isinstance(event, sync.ChangeAddedEvent) and
-                           self.change_key in event.related_change_keys)
-                          or
-                          (isinstance(event, sync.ChangeUpdatedEvent) and
-                           self.change_key in event.related_change_keys)):
+    def interested(self, event):
+        if not ((isinstance(event, sync.ChangeAddedEvent) and
+                 self.change_key in event.related_change_keys)
+                or
+                (isinstance(event, sync.ChangeUpdatedEvent) and
+                 self.change_key in event.related_change_keys)):
             #self.log.debug("Ignoring refresh diff due to event %s" % (event,))
-            return
+            return False
         #self.log.debug("Refreshing diff due to event %s" % (event,))
+        return True
+
+    def refresh(self, event=None):
         #TODO
-        return
+        pass
 
     def keypress(self, size, key):
         old_focus = self.listbox.focus
diff --git a/gertty/view/project_list.py b/gertty/view/project_list.py
index 5fa1eab..8be0601 100644
--- a/gertty/view/project_list.py
+++ b/gertty/view/project_list.py
@@ -97,17 +97,19 @@ class ProjectListView(urwid.WidgetWrap):
         self._w.contents.append((self.listbox, ('weight', 1)))
         self._w.set_focus(3)
 
-    def refresh(self, event=None):
-        if event and not (isinstance(event, sync.ProjectAddedEvent)
-                          or
-                          isinstance(event, sync.ChangeAddedEvent)
-                          or
-                          (isinstance(event, sync.ChangeUpdatedEvent) and
-                           (event.status_changed or event.review_flag_changed))):
+    def interested(self, event):
+        if not (isinstance(event, sync.ProjectAddedEvent)
+                or
+                isinstance(event, sync.ChangeAddedEvent)
+                or
+                (isinstance(event, sync.ChangeUpdatedEvent) and
+                 (event.status_changed or event.review_flag_changed))):
             self.log.debug("Ignoring refresh project list due to event %s" % (event,))
-            return
+            return False
         self.log.debug("Refreshing project list due to event %s" % (event,))
+        return True
 
+    def refresh(self):
         if self.subscribed:
             self.title = u'Subscribed projects'
             if self.unreviewed: