Add navigation to interactive search

Change-Id: I04de45c7b4c73d1c927d442784614adea7a16381
This commit is contained in:
James E. Blair 2015-10-21 00:25:56 -07:00
parent 0d0f0f6dcd
commit eae2e60084
4 changed files with 36 additions and 10 deletions

View File

@ -204,10 +204,12 @@ class SearchableText(urwid.Text):
return
(text, attrs) = urwid.util.decompose_tagmarkup(self._markup)
last = 0
found = False
while True:
start = text.find(search, last)
if start < 0:
break
found = True
end = start + len(search)
i = 0
newattrs = []
@ -238,6 +240,7 @@ class SearchableText(urwid.Text):
self._text = text
self._attrib = attrs
self._invalidate()
return found
class HyperText(urwid.Text):
_selectable = True

View File

@ -177,6 +177,8 @@ class BaseDiffView(urwid.WidgetWrap):
def _init(self):
del self._w.contents[:]
self.search = None
self.results = []
self.current_result = None
with self.app.db.getSession() as session:
new_revision = session.getRevision(self.new_revision_key)
old_comments = []
@ -447,12 +449,17 @@ class BaseDiffView(urwid.WidgetWrap):
self.interactiveSearch(self.search)
return None
else:
self.app.status.update(title=self.title)
if not self.search:
self.interactiveSearch(None)
self.search = None
if key in ['enter', 'esc']:
commands = self.app.config.keymap.getCommands(key)
if keymap.INTERACTIVE_SEARCH in commands:
self.nextSearchResult()
return None
else:
self.app.status.update(title=self.title)
if not self.search:
self.interactiveSearch(None)
self.search = None
if key in ['enter', 'esc']:
return None
old_focus = self.listbox.focus
r = super(BaseDiffView, self).keypress(size, key)
@ -474,7 +481,7 @@ class BaseDiffView(urwid.WidgetWrap):
return None
if keymap.INTERACTIVE_SEARCH in commands:
self.search = ''
self.interactiveSearch(self.search)
self.app.status.update(title=("Search: "))
return None
return r
@ -549,6 +556,19 @@ class BaseDiffView(urwid.WidgetWrap):
def interactiveSearch(self, search):
if search is not None:
self.app.status.update(title=("Search: " + search))
for line in self.listbox.body:
self.results = []
self.current_result = 0
for i, line in enumerate(self.listbox.body):
if hasattr(line, 'search'):
line.search(search, 'search-result')
if line.search(search, 'search-result'):
self.results.append(i)
def nextSearchResult(self):
if not self.results:
return
dest = self.results[self.current_result]
self.listbox.set_focus(dest)
self.listbox._invalidate()
self.current_result += 1
if self.current_result >= len(self.results):
self.current_result = 0

View File

@ -109,8 +109,11 @@ class SideDiffLine(BaseDiffLine):
self._w = urwid.AttrMap(col, None, focus_map=map)
def search(self, search, attribute):
ret = False
for w in self.text_widgets:
w.search(search, attribute)
if w.search(search, attribute):
ret = True
return ret
class SideFileHeader(BaseFileHeader):
def __init__(self, app, context, old, new, callback=None):

View File

@ -90,7 +90,7 @@ class UnifiedDiffLine(BaseDiffLine):
self._w = urwid.AttrMap(col, None, focus_map=map)
def search(self, search, attribute):
self.text_widget.search(search, attribute)
return self.text_widget.search(search, attribute)
class UnifiedFileHeader(BaseFileHeader):
def __init__(self, app, context, oldnew, old, new, callback=None):