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,