diff options
Diffstat (limited to 'alot/buffers')
-rw-r--r-- | alot/buffers/search.py | 46 |
1 files changed, 15 insertions, 31 deletions
diff --git a/alot/buffers/search.py b/alot/buffers/search.py index c5b6bbcd..8cd76a87 100644 --- a/alot/buffers/search.py +++ b/alot/buffers/search.py @@ -8,16 +8,16 @@ from .buffer import Buffer from ..settings.const import settings from ..widgets.search import ThreadlineWidget -class PipeWalker(urwid.ListWalker): +class IterWalker(urwid.ListWalker): """ - urwid.ListWalker that reads next items from a pipe and wraps them in + urwid.ListWalker that reads next items from a generator and wraps them in ThreadlineWidget widgets for displaying """ _pipe = None _dbman = None - _pipe_eof = False + _iter_done = False # list of the thread IDs _tids = None @@ -26,9 +26,9 @@ class PipeWalker(urwid.ListWalker): _focus = None - def __init__(self, pipe, dbman): - self._pipe = pipe - self._dbman = dbman + def __init__(self, threads, dbman): + self._threads = threads + self._dbman = dbman self._tids = [] self._wgts = {} @@ -38,7 +38,7 @@ class PipeWalker(urwid.ListWalker): super().__init__() def __len__(self): - while not self._pipe_eof: + while not self._iter_done: self._get_next_item() return len(self._tids) @@ -58,7 +58,7 @@ class PipeWalker(urwid.ListWalker): if pos < 0: raise IndexError - while not self._pipe_eof and pos >= len(self._tids): + while not self._iter_done and pos >= len(self._tids): self._get_next_item() if pos >= len(self._tids): @@ -80,13 +80,13 @@ class PipeWalker(urwid.ListWalker): self._modified() def _get_next_item(self): - if self._pipe_eof: + if self._iter_done: return None try: - self._tids.append(self._pipe.recv()) - except EOFError: - self._pipe_eof = True + self._tids.append(next(self._threads)) + except StopIteration: + self._iter_done = True class SearchBuffer(Buffer): """shows a result list of threads for a query""" @@ -102,7 +102,6 @@ class SearchBuffer(Buffer): self.querystring = initialquery default_order = settings.get('search_threads_sort_order') self.sort_order = sort_order or default_order - self.proc = None # process that fills our pipe self.rebuild() super().__init__() @@ -132,21 +131,7 @@ class SearchBuffer(Buffer): info['result_count_positive'] = 's' if info['result_count'] > 1 else '' return info - def cleanup(self): - self.kill_filler_process() - - def kill_filler_process(self): - """ - terminates the process that fills this buffers - :class:`~alot.walker.PipeWalker`. - """ - if self.proc: - if self.proc.is_alive(): - self.proc.terminate() - def rebuild(self): - self.kill_filler_process() - exclude_tags = settings.get_notmuch_setting('search', 'exclude_tags') if exclude_tags: exclude_tags = frozenset([t for t in exclude_tags.split(';') if t]) @@ -157,9 +142,8 @@ class SearchBuffer(Buffer): self._thread_count_val = None try: - self.pipe, self.proc = self.dbman.get_threads(self.querystring, - self.sort_order, - exclude_tags) + threads = self.dbman.get_threads(self.querystring, self.sort_order, + exclude_tags) except NotmuchError: self.ui.notify('malformed query string: %s' % self.querystring, 'error') @@ -167,7 +151,7 @@ class SearchBuffer(Buffer): self.body = self.listbox return - self.threadlist = PipeWalker(self.pipe, self.dbman) + self.threadlist = IterWalker(threads, self.dbman) self.listbox = urwid.ListBox(self.threadlist) self.body = self.listbox |