From ce50794a257996b1ff6007eb03ef75696a085e9a Mon Sep 17 00:00:00 2001 From: pazz Date: Fri, 15 Jul 2011 16:18:16 +0100 Subject: split promptwidget for later reuse --- alot/init.py | 2 ++ alot/ui.py | 27 ++++++++++++++------- alot/widgets.py | 74 ++++++++++++++++++++++++--------------------------------- 3 files changed, 52 insertions(+), 51 deletions(-) (limited to 'alot') diff --git a/alot/init.py b/alot/init.py index 421b6a57..9217bfba 100755 --- a/alot/init.py +++ b/alot/init.py @@ -76,6 +76,8 @@ def main(): command_map['j'] = 'cursor down' command_map['k'] = 'cursor up' command_map[' '] = 'cursor page down' + command_map['enter'] = 'select' + command_map['esc'] = 'cancel' # set up and start interface ui = UI(dbman, diff --git a/alot/ui.py b/alot/ui.py index 56bafb85..7e356800 100644 --- a/alot/ui.py +++ b/alot/ui.py @@ -18,11 +18,12 @@ Copyright (C) 2011 Patrick Totzke """ import urwid import os +from urwid.command_map import command_map from settings import config from settings import get_palette import command -from widgets import PromptWidget +from widgets import CompleteEdit from buffer import BufferListBuffer @@ -79,28 +80,38 @@ class UI: def prompt(self, prefix='>', text=u'', completer=None): self.logger.info('open prompt') - - prefix_widget = PromptWidget(prefix, text, completer) + leftpart = urwid.Text(prefix, align='left') + if completer: + editpart = CompleteEdit(completer, edit_text=text) + else: + editpart = urwid.Edit(edit_text=text) + both = urwid.Columns( + [ + ('fixed', len(prefix) + 1, leftpart), + ('weight', 1, editpart), + ]) + prompt_widget = urwid.AttrMap(both, 'prompt', 'prompt') footer = self.mainframe.get_footer() - self.mainframe.set_footer(prefix_widget) + self.mainframe.set_footer(prompt_widget) self.mainframe.set_focus('footer') self.mainloop.draw_screen() + while True: keys = None while not keys: keys = self.mainloop.screen.get_input() for key in keys: - if key == 'enter': + if command_map[key] == 'select': self.mainframe.set_footer(footer) self.mainframe.set_focus('body') - return prefix_widget.get_input() - if key == 'esc': + return editpart.get_edit_text() + if command_map[key] == 'cancel': self.mainframe.set_footer(footer) self.mainframe.set_focus('body') return None else: size = (20,) # don't know why they want a size here - prefix_widget.keypress(size, key) + editpart.keypress(size, key) self.mainloop.draw_screen() def cmdshell(self, prefix='>', text='', completer=None): diff --git a/alot/widgets.py b/alot/widgets.py index bee616fc..8950517e 100644 --- a/alot/widgets.py +++ b/alot/widgets.py @@ -22,6 +22,7 @@ import tempfile import os import re from datetime import datetime +from urwid.command_map import command_map from settings import config from settings import get_mime_handler @@ -128,55 +129,42 @@ class TagWidget(urwid.Text): return self.tag -class PromptWidget(urwid.AttrMap): - def __init__(self, prefix, text=u'', completer=None): +class CompleteEdit(urwid.Edit): + def __init__(self, completer, edit_text=u''): self.completer = completer - leftpart = urwid.Text(prefix, align='left') - if not isinstance(text,unicode): - text = unicode(text, errors='replace') - self.editpart = urwid.Edit(edit_text=text) - self.start_completion_pos = len(text) + if not isinstance(edit_text,unicode): + edit_text = unicode(edit_text, errors='replace') + self.start_completion_pos = len(edit_text) self.completion_results = None - both = urwid.Columns( - [ - ('fixed', len(prefix) + 1, leftpart), - ('weight', 1, self.editpart), - ]) - urwid.AttrMap.__init__(self, both, 'prompt', 'prompt') - - def set_input(self, txt): - return self.editpart.set_edit_text(txt) - - def get_input(self): - return self.editpart.get_edit_text() + urwid.Edit.__init__(self, edit_text=edit_text) def keypress(self, size, key): - if key in ['tab', 'shift tab']: - if self.completer: - pos = self.start_completion_pos - original = self.editpart.edit_text[:pos] - if not self.completion_results: # not in completion mode - self.completion_results = [''] + \ - self.completer.complete(original) - self.focus_in_clist = 1 - else: - if key == 'tab': - self.focus_in_clist += 1 - else: - self.focus_in_clist -= 1 - if len(self.completion_results) > 1: - suffix = self.completion_results[self.focus_in_clist % - len(self.completion_results)] - self.editpart.set_edit_text(original + suffix) - self.editpart.edit_pos += len(suffix) + cmd = command_map[key] + if cmd in ['next selectable' ,'prev selectable']: + pos = self.start_completion_pos + original = self.edit_text[:pos] + if not self.completion_results: # not in completion mode + self.completion_results = [''] + \ + self.completer.complete(original) + self.focus_in_clist = 1 + else: + if cmd == 'next selectable': + self.focus_in_clist += 1 else: - self.editpart.set_edit_text(original + ' ') - self.editpart.edit_pos += 1 - self.start_completion_pos = self.editpart.edit_pos - self.completion_results = None + self.focus_in_clist -= 1 + if len(self.completion_results) > 1: + suffix = self.completion_results[self.focus_in_clist % + len(self.completion_results)] + self.set_edit_text(original + suffix) + self.edit_pos += len(suffix) + else: + self.set_edit_text(original + ' ') + self.edit_pos += 1 + self.start_completion_pos = self.edit_pos + self.completion_results = None else: - result = self.editpart.keypress(size, key) - self.start_completion_pos = self.editpart.edit_pos + result = urwid.Edit.keypress(self, size, key) + self.start_completion_pos = self.edit_pos self.completion_results = None return result -- cgit v1.2.3