summaryrefslogtreecommitdiff
path: root/alot
diff options
context:
space:
mode:
authorPatrick Totzke <patricktotzke@gmail.com>2013-03-03 17:29:54 +0000
committerPatrick Totzke <patricktotzke@gmail.com>2013-03-03 17:29:54 +0000
commit4ae270072a0a6477466f09e8a5ea712af746d733 (patch)
treeefb07ef84438b72564119ca37d45d8c08be31b76 /alot
parenta4cc9c22e6267f0ff7909148e5b8c03435244e1e (diff)
parent41e129aa92c52eb3a8cd19bba6f6dcdcb10200d6 (diff)
Merge branch '0.3.4-feature-hooks-563' into 0.3.4-feature-urwidtrees
Diffstat (limited to 'alot')
-rw-r--r--alot/ui.py72
1 files changed, 50 insertions, 22 deletions
diff --git a/alot/ui.py b/alot/ui.py
index 726a857b..91c1a97b 100644
--- a/alot/ui.py
+++ b/alot/ui.py
@@ -281,6 +281,12 @@ class UI(object):
def buffer_open(self, buf):
"""register and focus new :class:`~alot.buffers.Buffer`."""
+
+ # call pre_buffer_open hook
+ prehook = settings.get_hook('pre_buffer_open')
+ if prehook is not None:
+ prehook(ui=self, dbm=self.dbman, buf=buf)
+
if self.current_buffer is not None:
offset = settings.get('bufferclose_focus_offset') * -1
currentindex = self.buffers.index(self.current_buffer)
@@ -289,6 +295,11 @@ class UI(object):
self.buffers.append(buf)
self.buffer_focus(buf)
+ # call post_buffer_open hook
+ posthook = settings.get_hook('post_buffer_open')
+ if posthook is not None:
+ posthook(ui=self, dbm=self.dbman, buf=buf)
+
def buffer_close(self, buf, redraw=True):
"""
closes given :class:`~alot.buffers.Buffer`.
@@ -296,7 +307,13 @@ class UI(object):
This it removes it from the bufferlist and calls its cleanup() method.
"""
+ # call pre_buffer_close hook
+ prehook = settings.get_hook('pre_buffer_close')
+ if prehook is not None:
+ prehook(ui=self, dbm=self.dbman, buf=buf)
+
buffers = self.buffers
+ success = False
if buf not in buffers:
string = 'tried to close unknown buffer: %s. \n\ni have:%s'
logging.error(string % (buf, self.buffers))
@@ -308,14 +325,25 @@ class UI(object):
nextbuffer = buffers[(index + offset) % len(buffers)]
self.buffer_focus(nextbuffer, redraw)
buf.cleanup()
+ success = True
else:
string = 'closing buffer %d:%s'
- logging.info(string % (buffers.index(buf), buf))
- buffers.remove(buf)
- buf.cleanup()
+ success = True
+
+ # call post_buffer_closed hook
+ posthook = settings.get_hook('post_buffer_closed')
+ if posthook is not None:
+ posthook(ui=self, dbm=self.dbman, buf=buf, success=success)
def buffer_focus(self, buf, redraw=True):
"""focus given :class:`~alot.buffers.Buffer`."""
+
+ # call pre_buffer_focus hook
+ prehook = settings.get_hook('pre_buffer_focus')
+ if prehook is not None:
+ prehook(ui=self, dbm=self.dbman, buf=buf)
+
+ success = False
if buf not in self.buffers:
logging.error('tried to focus unknown buffer')
else:
@@ -324,7 +352,13 @@ class UI(object):
self.mode = buf.modename
if isinstance(self.current_buffer, BufferlistBuffer):
self.current_buffer.rebuild()
- self.update(redraw)
+ self.update()
+ success = True
+
+ # call post_buffer_focus hook
+ posthook = settings.get_hook('post_buffer_focus')
+ if posthook is not None:
+ posthook(ui=self, dbm=self.dbman, buf=buf, success=success)
def get_deep_focus(self, startfrom=None):
"""return the bottom most focussed widget of the widget tree"""
@@ -548,34 +582,28 @@ class UI(object):
:type cmd: :class:`~alot.commands.Command`
"""
if cmd:
- # call pre- hook
- if cmd.prehook:
- logging.info('calling pre-hook')
- try:
- cmd.prehook(ui=self, dbm=self.dbman)
- except:
- logging.exception('prehook failed')
- return False
-
# define (callback) function that invokes post-hook
def call_posthook(retval_from_apply):
if cmd.posthook:
logging.info('calling post-hook')
- try:
- cmd.posthook(ui=self, dbm=self.dbman)
- except:
- logging.exception('posthook failed')
+ return defer.maybeDeferred(cmd.posthook, ui=self, dbm=self.dbman)
# define error handler for Failures/Exceptions
# raised in cmd.apply()
def errorHandler(failure):
logging.error(failure.getTraceback())
- msg = "Error: %s,\n(check the log for details)"
- self.notify(msg % failure.getErrorMessage(), priority='error')
+ errmsg = failure.getErrorMessage()
+ if errmsg:
+ msg = "%s\n(check the log for details)"
+ self.notify(msg % failure.getErrorMessage(), priority='error')
# call cmd.apply
- logging.info('apply command: %s' % cmd)
- d = defer.maybeDeferred(cmd.apply, self)
- d.addErrback(errorHandler)
+ def call_apply(ignored):
+ return defer.maybeDeferred(cmd.apply, self)
+
+ prehook = cmd.prehook or (lambda **kwargs: None)
+ d = defer.maybeDeferred(prehook, ui=self, dbm=self.dbman)
+ d.addCallback(call_apply)
d.addCallback(call_posthook)
+ d.addErrback(errorHandler)
return d