summaryrefslogtreecommitdiff
path: root/alot
diff options
context:
space:
mode:
authorpazz <patricktotzke@gmail.com>2011-07-15 16:18:16 +0100
committerpazz <patricktotzke@gmail.com>2011-07-15 16:18:16 +0100
commitce50794a257996b1ff6007eb03ef75696a085e9a (patch)
tree78c179268d8466ea5c60f88ac75cdf338ed3287e /alot
parent4b6fbded970444e2b130d4a44e9d0853a7c5ec74 (diff)
split promptwidget for later reuse
Diffstat (limited to 'alot')
-rwxr-xr-xalot/init.py2
-rw-r--r--alot/ui.py27
-rw-r--r--alot/widgets.py74
3 files changed, 52 insertions, 51 deletions
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 <patricktotzke@gmail.com>
"""
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