From ddd2088e570476f54913cda1a0ec6bac0bd1a66a Mon Sep 17 00:00:00 2001 From: "James E. Blair" Date: Tue, 7 Apr 2015 12:19:21 -0700 Subject: [PATCH] Display file header in top line of diff To remind the user of the path of the file shown at the top of the diff, always display the filename there, even after the file header has scrolled past the top of the screen. Change-Id: Icf3419647c2ccec45f878fbdc882e3d624eadebb --- gertty/view/diff.py | 36 +++++++++++++++++++++++++++++++++++- gertty/view/side_diff.py | 13 +++++++++++++ gertty/view/unified_diff.py | 17 +++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/gertty/view/diff.py b/gertty/view/diff.py index c266782..4b792ff 100644 --- a/gertty/view/diff.py +++ b/gertty/view/diff.py @@ -110,6 +110,9 @@ class BaseFileHeader(urwid.Button): def selectable(self): return True +class BaseFileReminder(urwid.WidgetWrap): + pass + class DiffContextButton(urwid.WidgetWrap): def selectable(self): return True @@ -232,7 +235,8 @@ class BaseDiffView(urwid.WidgetWrap): comment_filenames.add(comment.file) repo = self.app.getRepo(self.project_name) self._w.contents.append((self.app.header, ('pack', 1))) - self._w.contents.append((urwid.Divider(), ('pack', 1))) + self.file_reminder = self.makeFileReminder() + self._w.contents.append((self.file_reminder, ('pack', 1))) lines = [] # The initial set of lines to display self.file_diffs = [{}, {}] # Mapping of fn -> DiffFile object (old, new) # this is a list of files: @@ -343,6 +347,9 @@ class BaseDiffView(urwid.WidgetWrap): def makeFileHeader(self, diff, comment_lists): raise NotImplementedError + def makeFileReminder(self): + raise NotImplementedError + def interested(self, event): if not ((isinstance(event, sync.ChangeAddedEvent) and self.change_key in event.related_change_keys) @@ -358,10 +365,37 @@ class BaseDiffView(urwid.WidgetWrap): #TODO pass + def getContextAtTop(self, size): + middle, top, bottom = self.listbox.calculate_visible(size, True) + if top and top[1]: + (widget, pos, rows) = top[1][-1] + elif middle: + pos = middle[2] + # Make sure the first header shows up as soon as it scrolls up + if pos > 1: + pos -= 1 + context = None + while True: + item = self.listbox.body[pos] + if hasattr(item, 'context'): + break + pos -= 1 + if pos > 0: + context = item.context + return context + def keypress(self, size, key): old_focus = self.listbox.focus r = super(BaseDiffView, self).keypress(size, key) new_focus = self.listbox.focus + + context = self.getContextAtTop(size) + if context: + self.file_reminder.set(context.old_fn, + context.new_fn) + else: + self.file_reminder.set('', '') + commands = self.app.config.keymap.getCommands(r) if (isinstance(old_focus, BaseDiffCommentEdit) and (old_focus != new_focus or (keymap.PREV_SCREEN in commands))): diff --git a/gertty/view/side_diff.py b/gertty/view/side_diff.py index 9644595..a5eddab 100644 --- a/gertty/view/side_diff.py +++ b/gertty/view/side_diff.py @@ -105,6 +105,16 @@ class SideFileHeader(BaseFileHeader): 'filename': 'focused-filename'} self._w = urwid.AttrMap(col, None, focus_map=map) +class SideFileReminder(BaseFileReminder): + def __init__(self): + self.old_text = urwid.Text(('filename', '')) + self.new_text = urwid.Text(('filename', '')) + col = urwid.Columns([self.old_text, self.new_text]) + super(SideFileReminder, self).__init__(col) + + def set(self, old, new): + self.old_text.set_text(('filename', old)) + self.new_text.set_text(('filename', new)) class SideDiffView(BaseDiffView): def makeLines(self, diff, lines_to_add, comment_lists): @@ -148,6 +158,9 @@ class SideDiffView(BaseDiffView): old_comment, new_comment)) return lines + def makeFileReminder(self): + return SideFileReminder() + def makeFileHeader(self, diff, comment_lists): context = LineContext( self.old_revision_key, self.new_revision_key, diff --git a/gertty/view/unified_diff.py b/gertty/view/unified_diff.py index 8c6d488..0d39126 100644 --- a/gertty/view/unified_diff.py +++ b/gertty/view/unified_diff.py @@ -105,6 +105,20 @@ class UnifiedFileHeader(BaseFileHeader): 'filename': 'focused-filename'} self._w = urwid.AttrMap(col, None, focus_map=map) +class UnifiedFileReminder(BaseFileReminder): + def __init__(self): + self.old_text = urwid.Text(('filename', '')) + self.new_text = urwid.Text(('filename', '')) + self.col = urwid.Columns([('pack', self.old_text), + ('pack', self.new_text), + urwid.Text(u'')], dividechars=2) + super(UnifiedFileReminder, self).__init__(self.col) + + def set(self, old, new): + self.old_text.set_text(('filename', old)) + self.new_text.set_text(('filename', new)) + self.col._invalidate() + class UnifiedDiffView(BaseDiffView): def makeLines(self, diff, lines_to_add, comment_lists): lines = [] @@ -153,6 +167,9 @@ class UnifiedDiffView(BaseDiffView): new_comment)) return lines + def makeFileReminder(self): + return UnifiedFileReminder() + def makeFileHeader(self, diff, comment_lists): context = LineContext( self.old_revision_key, self.new_revision_key,