From aedec159c72674edd1462d0c2823647a3ae08829 Mon Sep 17 00:00:00 2001 From: "James E. Blair" Date: Sat, 13 Sep 2014 17:15:27 -0700 Subject: [PATCH] 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 --- gertty/db.py | 8 ++------ gertty/view/change_list.py | 23 ++++++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/gertty/db.py b/gertty/db.py index 3501e0d..e463624 100644 --- a/gertty/db.py +++ b/gertty/db.py @@ -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'): diff --git a/gertty/view/change_list.py b/gertty/view/change_list.py index 1a3225c..e410bc1 100644 --- a/gertty/view/change_list.py +++ b/gertty/view/change_list.py @@ -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)