Add navigation to interactive search
Change-Id: I04de45c7b4c73d1c927d442784614adea7a16381
This commit is contained in:
parent
0d0f0f6dcd
commit
eae2e60084
@ -204,10 +204,12 @@ class SearchableText(urwid.Text):
|
|||||||
return
|
return
|
||||||
(text, attrs) = urwid.util.decompose_tagmarkup(self._markup)
|
(text, attrs) = urwid.util.decompose_tagmarkup(self._markup)
|
||||||
last = 0
|
last = 0
|
||||||
|
found = False
|
||||||
while True:
|
while True:
|
||||||
start = text.find(search, last)
|
start = text.find(search, last)
|
||||||
if start < 0:
|
if start < 0:
|
||||||
break
|
break
|
||||||
|
found = True
|
||||||
end = start + len(search)
|
end = start + len(search)
|
||||||
i = 0
|
i = 0
|
||||||
newattrs = []
|
newattrs = []
|
||||||
@ -238,6 +240,7 @@ class SearchableText(urwid.Text):
|
|||||||
self._text = text
|
self._text = text
|
||||||
self._attrib = attrs
|
self._attrib = attrs
|
||||||
self._invalidate()
|
self._invalidate()
|
||||||
|
return found
|
||||||
|
|
||||||
class HyperText(urwid.Text):
|
class HyperText(urwid.Text):
|
||||||
_selectable = True
|
_selectable = True
|
||||||
|
@ -177,6 +177,8 @@ class BaseDiffView(urwid.WidgetWrap):
|
|||||||
def _init(self):
|
def _init(self):
|
||||||
del self._w.contents[:]
|
del self._w.contents[:]
|
||||||
self.search = None
|
self.search = None
|
||||||
|
self.results = []
|
||||||
|
self.current_result = None
|
||||||
with self.app.db.getSession() as session:
|
with self.app.db.getSession() as session:
|
||||||
new_revision = session.getRevision(self.new_revision_key)
|
new_revision = session.getRevision(self.new_revision_key)
|
||||||
old_comments = []
|
old_comments = []
|
||||||
@ -447,12 +449,17 @@ class BaseDiffView(urwid.WidgetWrap):
|
|||||||
self.interactiveSearch(self.search)
|
self.interactiveSearch(self.search)
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
self.app.status.update(title=self.title)
|
commands = self.app.config.keymap.getCommands(key)
|
||||||
if not self.search:
|
if keymap.INTERACTIVE_SEARCH in commands:
|
||||||
self.interactiveSearch(None)
|
self.nextSearchResult()
|
||||||
self.search = None
|
|
||||||
if key in ['enter', 'esc']:
|
|
||||||
return None
|
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
|
old_focus = self.listbox.focus
|
||||||
r = super(BaseDiffView, self).keypress(size, key)
|
r = super(BaseDiffView, self).keypress(size, key)
|
||||||
@ -474,7 +481,7 @@ class BaseDiffView(urwid.WidgetWrap):
|
|||||||
return None
|
return None
|
||||||
if keymap.INTERACTIVE_SEARCH in commands:
|
if keymap.INTERACTIVE_SEARCH in commands:
|
||||||
self.search = ''
|
self.search = ''
|
||||||
self.interactiveSearch(self.search)
|
self.app.status.update(title=("Search: "))
|
||||||
return None
|
return None
|
||||||
return r
|
return r
|
||||||
|
|
||||||
@ -549,6 +556,19 @@ class BaseDiffView(urwid.WidgetWrap):
|
|||||||
def interactiveSearch(self, search):
|
def interactiveSearch(self, search):
|
||||||
if search is not None:
|
if search is not None:
|
||||||
self.app.status.update(title=("Search: " + search))
|
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'):
|
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
|
||||||
|
@ -109,8 +109,11 @@ class SideDiffLine(BaseDiffLine):
|
|||||||
self._w = urwid.AttrMap(col, None, focus_map=map)
|
self._w = urwid.AttrMap(col, None, focus_map=map)
|
||||||
|
|
||||||
def search(self, search, attribute):
|
def search(self, search, attribute):
|
||||||
|
ret = False
|
||||||
for w in self.text_widgets:
|
for w in self.text_widgets:
|
||||||
w.search(search, attribute)
|
if w.search(search, attribute):
|
||||||
|
ret = True
|
||||||
|
return ret
|
||||||
|
|
||||||
class SideFileHeader(BaseFileHeader):
|
class SideFileHeader(BaseFileHeader):
|
||||||
def __init__(self, app, context, old, new, callback=None):
|
def __init__(self, app, context, old, new, callback=None):
|
||||||
|
@ -90,7 +90,7 @@ class UnifiedDiffLine(BaseDiffLine):
|
|||||||
self._w = urwid.AttrMap(col, None, focus_map=map)
|
self._w = urwid.AttrMap(col, None, focus_map=map)
|
||||||
|
|
||||||
def search(self, search, attribute):
|
def search(self, search, attribute):
|
||||||
self.text_widget.search(search, attribute)
|
return self.text_widget.search(search, attribute)
|
||||||
|
|
||||||
class UnifiedFileHeader(BaseFileHeader):
|
class UnifiedFileHeader(BaseFileHeader):
|
||||||
def __init__(self, app, context, oldnew, old, new, callback=None):
|
def __init__(self, app, context, oldnew, old, new, callback=None):
|
||||||
|
Loading…
Reference in New Issue
Block a user