Handle variable labels in change list

Different changes (even within a project) may have different review
labels associated with them.  When building the change listing screen,
iterate over all of the changes to get the superset of labels in
order to build the label columns on the right (the previous method
simply used the labels from the first change).

Change-Id: I77805eb3c0439cef86277c45b4261ad81aef3bbc
This commit is contained in:
James E. Blair 2014-09-13 17:15:27 -07:00
parent 387f3a7130
commit aedec159c7
2 changed files with 16 additions and 15 deletions

View File

@ -203,12 +203,8 @@ class Change(object):
self.pending_status_message = pending_status_message
def getCategories(self):
categories = []
for label in self.labels:
if label.category in categories:
continue
categories.append(label.category)
return categories
categories = set([label.category for label in self.labels])
return sorted(categories)
def getMaxForCategory(self, category):
if not hasattr(self, '_approval_cache'):

View File

@ -30,7 +30,7 @@ class ChangeRow(urwid.Button):
def selectable(self):
return True
def __init__(self, change, project=False, owner=False, callback=None):
def __init__(self, change, categories, project=False, owner=False, callback=None):
super(ChangeRow, self).__init__('', on_press=callback, user_data=change.key)
self.change_key = change.key
self.subject = urwid.Text(u'', wrap='clip')
@ -46,9 +46,9 @@ class ChangeRow(urwid.Button):
self.columns = urwid.Columns(cols, dividechars=1)
self.row_style = urwid.AttrMap(self.columns, '')
self._w = urwid.AttrMap(self.row_style, None, focus_map=self.change_focus_map)
self.update(change)
self.update(change, categories)
def update(self, change):
def update(self, change, categories):
if change.reviewed or change.hidden:
style = 'reviewed-change'
else:
@ -67,7 +67,7 @@ class ChangeRow(urwid.Button):
owner_name = change.owner.email
self.owner.set_text(owner_name)
del self.columns.contents[self.num_columns:]
for category in change.getCategories():
for category in categories:
v = change.getMaxForCategory(category)
if v == 0:
v = ''
@ -85,9 +85,9 @@ class ChangeListHeader(urwid.WidgetWrap):
self.num_columns = len(cols)
super(ChangeListHeader, self).__init__(urwid.Columns(cols, dividechars=1))
def update(self, change):
def update(self, categories):
del self._w.contents[self.num_columns:]
for category in change.getCategories():
for category in categories:
self._w.contents.append((urwid.Text(' %s' % category[0]), self._w.options('given', 2)))
class ChangeListView(urwid.WidgetWrap):
@ -116,6 +116,7 @@ class ChangeListView(urwid.WidgetWrap):
if '_project_key' in query:
self.display_project = False
self.header = ChangeListHeader(self.display_project, self.display_owner)
self.categories = []
self.refresh()
self._w.contents.append((app.header, ('pack', 1)))
self._w.contents.append((urwid.Divider(), ('pack', 1)))
@ -132,20 +133,24 @@ class ChangeListView(urwid.WidgetWrap):
else:
self.title = u'All changes in %s' % self.query_desc
self.app.status.update(title=self.title)
categories = set()
for change in lst:
categories |= set(change.getCategories())
self.categories = sorted(categories)
i = 0
for change in lst:
row = self.change_rows.get(change.key)
if not row:
row = ChangeRow(change, self.display_project,
row = ChangeRow(change, self.categories, self.display_project,
self.display_owner, callback=self.onSelect)
self.listbox.body.insert(i, row)
self.change_rows[change.key] = row
else:
row.update(change)
row.update(change, self.categories)
unseen_keys.remove(change.key)
i += 1
if lst:
self.header.update(lst[0])
self.header.update(self.categories)
for key in unseen_keys:
row = self.change_rows[key]
self.listbox.body.remove(row)