From 7e85ed374531474de277d521393a1af54a8ad42a Mon Sep 17 00:00:00 2001
From: "James E. Blair" <jeblair@hp.com>
Date: Sat, 21 Mar 2015 20:17:17 -0700
Subject: [PATCH] Highlight starred changes in list

Leave a space for flags immediately to the left of the subject
in change lists.  If the change is starred, place an asterisk
there and highlight the row.

Also permit toggling whether a change is starred from within the
list.

Change-Id: I221efa72921adf980db07f93ad1264e8ec1db7b1
---
 gertty/palette.py          |  2 ++
 gertty/view/change_list.py | 34 ++++++++++++++++++++++++++++++++--
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/gertty/palette.py b/gertty/palette.py
index f7c210e..cbca463 100644
--- a/gertty/palette.py
+++ b/gertty/palette.py
@@ -79,6 +79,8 @@ DEFAULT_PALETTE={
     'reviewed-change': ['dark gray', ''],
     'focused-unreviewed-change': ['default,standout', ''],
     'focused-reviewed-change': ['dark gray,standout', ''],
+    'starred-change': ['light cyan', ''],
+    'focused-starred-change': ['light cyan,standout', ''],
     }
 
 # A delta from the default palette
diff --git a/gertty/view/change_list.py b/gertty/view/change_list.py
index 5ff2bc5..d7b17ce 100644
--- a/gertty/view/change_list.py
+++ b/gertty/view/change_list.py
@@ -51,6 +51,7 @@ class ChangeRow(urwid.Button):
     change_focus_map = {None: 'focused',
                         'unreviewed-change': 'focused-unreviewed-change',
                         'reviewed-change': 'focused-reviewed-change',
+                        'starred-change': 'focused-starred-change',
                         'positive-label': 'focused-positive-label',
                         'negative-label': 'focused-negative-label',
                         'min-label': 'focused-min-label',
@@ -88,11 +89,17 @@ class ChangeRow(urwid.Button):
             style = 'reviewed-change'
         else:
             style = 'unreviewed-change'
-        self.row_style.set_attr_map({None: style})
         if hasattr(change, '_subject'):
             subject = change._subject
         else:
             subject = change.subject
+        flag = ' '
+        color = None
+        if change.starred:
+            flag = '*'
+            style = 'starred-change'
+        subject = flag + subject
+        self.row_style.set_attr_map({None: style})
         self.subject.set_text(subject)
         self.number.set_text(str(change.number))
         self.project.set_text(change.project.name.split('/')[-1])
@@ -125,7 +132,7 @@ class ChangeRow(urwid.Button):
 
 class ChangeListHeader(urwid.WidgetWrap):
     def __init__(self, project=False, owner=False, updated=False):
-        cols = [(6, urwid.Text(u'Number')), ('weight', 4, urwid.Text(u'Subject'))]
+        cols = [(6, urwid.Text(u'Number')), ('weight', 4, urwid.Text(u' Subject'))]
         if project:
             cols.append(('weight', 1, urwid.Text(u'Project')))
         if owner:
@@ -151,6 +158,8 @@ class ChangeListView(urwid.WidgetWrap):
              "Toggle whether only unreviewed or all changes are displayed"),
             (key(keymap.TOGGLE_REVIEWED),
              "Toggle the reviewed flag for the currently selected change"),
+            (key(keymap.TOGGLE_STARRED),
+             "Toggle the starred flag for the currently selected change"),
             (key(keymap.REFRESH),
              "Sync all projects"),
             (key(keymap.SORT_BY_NUMBER),
@@ -349,6 +358,16 @@ class ChangeListView(urwid.WidgetWrap):
             self.log.debug("Set change %s to %s", change_key, reviewed_str)
         return ret
 
+    def toggleStarred(self, change_key):
+        with self.app.db.getSession() as session:
+            change = session.getChange(change_key)
+            change.starred = not change.starred
+            ret = change.starred
+            change.pending_starred = True
+        self.app.sync.submitTask(
+            sync.ChangeStarredTask(change_key, sync.HIGH_PRIORITY))
+        return ret
+
     def toggleHidden(self, change_key):
         with self.app.db.getSession() as session:
             change = session.getChange(change_key)
@@ -401,6 +420,17 @@ class ChangeListView(urwid.WidgetWrap):
                 # where we're not just popping a row from the list of changes.
                 self.refresh()
             return None
+        if keymap.TOGGLE_STARRED in commands:
+            if not len(self.listbox.body):
+                return None
+            pos = self.listbox.focus_position
+            change_key = self.listbox.body[pos].change_key
+            starred = self.toggleStarred(change_key)
+            row = self.change_rows[change_key]
+            with self.app.db.getSession() as session:
+                change = session.getChange(change_key)
+                row.update(change, self.categories)
+            return None
         if keymap.REFRESH in commands:
             self.app.sync.submitTask(
                 sync.SyncSubscribedProjectsTask(sync.HIGH_PRIORITY))