diff --git a/gertty/db.py b/gertty/db.py index f8d024d..d894de9 100644 --- a/gertty/db.py +++ b/gertty/db.py @@ -231,6 +231,22 @@ class Change(object): cat_value[approval.category] = cur_value self._approval_cache = cat_value + def getMinMaxPermittedForCategory(self, category): + if not hasattr(self, '_permitted_cache'): + self._updatePermittedCache() + return self._permitted_cache.get(category, (0,0)) + + def _updatePermittedCache(self): + cache = {} + for label in self.labels: + if label.category not in cache: + cache[label.category] = [0, 0] + if label.value > cache[label.category][1]: + cache[label.category][1] = label.value + if label.value < cache[label.category][0]: + cache[label.category][0] = label.value + self._permitted_cache = cache + def createRevision(self, *args, **kw): session = Session.object_session(self) args = [self] + list(args) diff --git a/gertty/palette.py b/gertty/palette.py index 760c9a1..f7c210e 100644 --- a/gertty/palette.py +++ b/gertty/palette.py @@ -23,6 +23,10 @@ DEFAULT_PALETTE={ 'negative-label': ['dark red', ''], 'max-label': ['light green', ''], 'min-label': ['light red', ''], + 'focused-positive-label': ['dark green,standout', ''], + 'focused-negative-label': ['dark red,standout', ''], + 'focused-max-label': ['light green,standout', ''], + 'focused-min-label': ['light red,standout', ''], 'link': ['dark blue', ''], 'focused-link': ['light blue', ''], # Diff diff --git a/gertty/view/change.py b/gertty/view/change.py index 06364e2..bd23122 100644 --- a/gertty/view/change.py +++ b/gertty/view/change.py @@ -569,14 +569,8 @@ class ChangeView(urwid.WidgetWrap): self.commit_message.set_text(change.revisions[-1].message) categories = [] - max_values = {} - min_values = {} approval_headers = [urwid.Text(('table-header', 'Name'))] for label in change.labels: - if label.value > max_values.get(label.category, 0): - max_values[label.category] = label.value - if label.value < min_values.get(label.category, 0): - min_values[label.category] = label.value if label.category in categories: continue approval_headers.append(urwid.Text(('table-header', label.category))) @@ -600,15 +594,16 @@ class ChangeView(urwid.WidgetWrap): approvals_for_name[approval.reviewer.name] = approvals votes.addRow(row) if str(approval.value) != '0': + cat_min, cat_max = change.getMinMaxPermittedForCategory(approval.category) if approval.value > 0: val = '+%i' % approval.value - if approval.value == max_values.get(approval.category): + if approval.value == cat_max: val = ('max-label', val) else: val = ('positive-label', val) else: val = '%i' % approval.value - if approval.value == min_values.get(approval.category): + if approval.value == cat_min: val = ('min-label', val) else: val = ('negative-label', val) diff --git a/gertty/view/change_list.py b/gertty/view/change_list.py index 7b72371..2ba7a04 100644 --- a/gertty/view/change_list.py +++ b/gertty/view/change_list.py @@ -50,6 +50,10 @@ class ChangeRow(urwid.Button): change_focus_map = {None: 'focused', 'unreviewed-change': 'focused-unreviewed-change', 'reviewed-change': 'focused-reviewed-change', + 'positive-label': 'focused-positive-label', + 'negative-label': 'focused-negative-label', + 'min-label': 'focused-min-label', + 'max-label': 'focused-max-label', } def selectable(self): @@ -100,14 +104,22 @@ class ChangeRow(urwid.Button): del self.columns.contents[self.num_columns:] for category in categories: v = change.getMaxForCategory(category) + cat_min, cat_max = change.getMinMaxPermittedForCategory(category) if v == 0: - v = '' - elif v < 0: - v = ('min-label', '%2i' % v) + val = '' elif v > 0: - v = ('max-label', '%2i' % v) - - self.columns.contents.append((urwid.Text(v), self.columns.options('given', 2))) + val = '%2i' % v + if v == cat_max: + val = ('max-label', val) + else: + val = ('positive-label', val) + else: + val = '%i' % v + if v == cat_min: + val = ('min-label', val) + else: + val = ('negative-label', val) + self.columns.contents.append((urwid.Text(val), self.columns.options('given', 2))) class ChangeListHeader(urwid.WidgetWrap): def __init__(self, project=False, owner=False, updated=False):