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
This commit is contained in:
James E. Blair 2015-01-07 15:16:46 -08:00
parent 9c9f0fe60e
commit 6711e20dc3
5 changed files with 51 additions and 37 deletions

View File

@ -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,

View File

@ -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)

View File

@ -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,

View File

@ -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

View File

@ -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: