Skip to content

Latest commit

 

History

History
111 lines (87 loc) · 3.78 KB

interface.rst

File metadata and controls

111 lines (87 loc) · 3.78 KB

User Interface

Alot sets up a widget tree and a mainloop <urwid.main_loop.TwistedEventLoop> in the constructor of alot.ui.UI. The visible area is a urwid.Frame, where the footer is used as a status line and the body part displays the currently active alot.buffers.Buffer.

To be able to bind keystrokes and translate them to Commands <alot.commands.Command>, keypresses are not propagated down the widget tree as is customary in urwid. Instead, the root widget given to urwids mainloop is a custom wrapper (alot.ui.Inputwrap) that interprets key presses. A dedicated ~alot.commands.globals.SendKeypressCommand can be used to trigger key presses to the wrapped root widget and thereby accessing standard urwid behaviour.

In order to keep the interface non-blocking and react to events like terminal size changes, alot makes use of asyncio - which allows asynchronous calls without the use of callbacks. Alot makes use of the python 3.5 async/await syntax

async def greet(ui):  # ui is instance of alot.ui.UI
    name = await ui.prompt('pls enter your name')
    ui.notify('your name is: ' + name)

UI - the main component

alot.ui

UI

Buffers

A buffer defines a view to your data. It knows how to render itself, to interpret keypresses and is visible in the "body" part of the widget frame. Different modes are defined by subclasses of the following base class.

alot.buffers.Buffer

Available modes are:

Mode Buffer Subclass
search ~alot.buffers.SearchBuffer
thread ~alot.buffers.ThreadBuffer
bufferlist ~alot.buffers.BufferlistBuffer
taglist ~alot.buffers.TagListBuffer
namedqueries ~alot.buffers.NamedQueriesBuffer
envelope ~alot.buffers.EnvelopeBuffer

alot.buffers

Widgets

What follows is a list of the non-standard urwid widgets used in alot. Some of them respect user settings <settings>, themes in particular.

utils

alot.widgets.utils

globals

alot.widgets.globals

bufferlist

alot.widgets.bufferlist

alot.widgets.search

thread

alot.widgets.thread

Completion

alot.ui.UI.prompt allows tab completion using a ~alot.completion.Completer object handed as 'completer' parameter. alot.completion defines several subclasses for different occasions like completing email addresses from an ~alot.account.AddressBook, notmuch tagstrings. Some of these actually build on top of each other; the ~alot.completion.QueryCompleter for example uses a ~alot.completion.TagsCompleter internally to allow tagstring completion after "is:" or "tag:" keywords when typing a notmuch querystring.

All these classes overide the method ~alot.completion.Completer.complete, which for a given string and cursor position in that string returns a list of tuples (completed_string, new_cursor_position) that are taken to be the completed values. Note that completed_string does not need to have the original string as prefix. ~alot.completion.Completer.complete may rise alot.errors.CompletionError exceptions.

alot.completion