summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--alot/buffer.py21
-rw-r--r--alot/db.py25
-rw-r--r--alot/widgets.py9
-rw-r--r--settings.py2
4 files changed, 35 insertions, 22 deletions
diff --git a/alot/buffer.py b/alot/buffer.py
index a4e256ff..6b3fc011 100644
--- a/alot/buffer.py
+++ b/alot/buffer.py
@@ -171,7 +171,9 @@ class SingleThreadBuffer(Buffer):
def __init__(self, ui, thread):
self.message_count = thread.get_total_messages()
self.thread = thread
- self.messages = [(0, m) for m in thread.get_toplevel_messages()]
+ self.messages = list()
+ for (m,r) in thread.get_messages().items():
+ self._build_pile(self.messages, m, r)
self.rebuild()
Buffer.__init__(self, ui, self.body, 'thread')
self.bindings = {}
@@ -179,18 +181,27 @@ class SingleThreadBuffer(Buffer):
def __str__(self):
return '%s, (%d)' % (self.thread.subject, self.message_count)
+ def _build_pile(self, acc, msg, replies, depth=0):
+ acc.append((depth, msg))
+ for (m,r) in replies.items():
+ self._build_pile(acc, m, r, depth+1)
+
def rebuild(self):
msgs = list()
for (num, (depth, m)) in enumerate(self.messages, 1):
- mwidget = widgets.MessageWidget(m, even=(num % 2 == 0),
- folded=False)
+ mwidget = widgets.MessageWidget(m, folded=True)
+ if (num % 2 == 0):
+ attr = 'messagesummary_even'
+ else:
+ attr = 'messagesummary_odd'
m.remove_tags(['unread'])
# a spacer of width 0 breaks urwid.Columns
if depth == 0:
- msgs.append(urwid.Columns([mwidget]))
+ line = urwid.AttrMap(urwid.Columns([mwidget]), attr, 'messagesummary_focus')
else:
spacer = urwid.Text(' ' * depth)
- msgs.append(urwid.Columns([('fixed', depth, spacer), mwidget]))
+ line = urwid.AttrMap(urwid.Columns([('fixed', depth, spacer), mwidget]), attr, 'messagesummary_focus')
+ msgs.append(line)
self.body = urwid.ListBox(msgs)
def get_selected_message(self):
diff --git a/alot/db.py b/alot/db.py
index 3310d0e7..a063d9a1 100644
--- a/alot/db.py
+++ b/alot/db.py
@@ -147,8 +147,22 @@ class Thread:
def get_subject(self):
return self.subject
- def get_toplevel_messages(self):
- return [self.dbman.get_message(mid) for mid in self.topmessages]
+ def _build_messages(self, acc, msg):
+ M = Message(self.dbman,msg)
+ acc[M] = {}
+ r = msg.get_replies()
+ if r is not None:
+ for m in r:
+ self._build_messages(acc[M], m)
+
+ def get_messages(self):
+ query = self.dbman.query('thread:' + self.tid)
+ thread = query.search_threads().next()
+
+ messages = {}
+ for m in thread.get_toplevel_messages():
+ self._build_messages(messages, m)
+ return messages
def get_newest_date(self):
return self.newest
@@ -165,14 +179,7 @@ class Message:
self.dbman = dbman
self.mid = msg.get_message_id()
self.strrep = str(msg)
-
self.email = None # will be read upon first use
- r = msg.get_replies() # not iterable if None
- if r:
- self.replies = [m.get_message_id() for m in msg.get_replies()]
- else:
- self.replies = []
-
self.filename = msg.get_filename()
self.tags = set([str(tag) for tag in msg.get_tags()])
diff --git a/alot/widgets.py b/alot/widgets.py
index 25fa5a0a..2a7eee69 100644
--- a/alot/widgets.py
+++ b/alot/widgets.py
@@ -176,17 +176,12 @@ class PromptWidget(AttrMap):
class MessageWidget(WidgetWrap):
- def __init__(self, message, even=False, folded=True):
+ def __init__(self, message, folded=True):
self.message = message
- if even:
- sumattr = 'messagesummary_even'
- else:
- sumattr = 'messagesummary_odd'
-
self.sumw = MessageSummaryWidget(self.message)
self.headerw = MessageHeaderWidget(self.message.get_email())
self.bodyw = MessageBodyWidget(self.message.get_email())
- self.displayed_list = [AttrMap(self.sumw, sumattr)]
+ self.displayed_list = [self.sumw]
if not folded:
self.displayed_list.append(self.bodyw)
self.body = Pile(self.displayed_list)
diff --git a/settings.py b/settings.py
index 03bdec91..ec0264a5 100644
--- a/settings.py
+++ b/settings.py
@@ -29,7 +29,7 @@ palette = [
('messagesummary_even', 'white', 'light blue', 'standout', 'white', '#068'),
('messagesummary_odd', 'white', 'dark blue', 'standout', 'white', '#006'),
- ('messagesummary_focus', 'white', 'black', 'standout,bold', '', ''),
+ ('messagesummary_focus', 'white', 'dark green', 'standout,bold', '#ff8', 'g58'),
('message_header', 'white', 'dark gray', '', 'white', 'dark gray'),
('message_body', 'light gray', 'black', '', 'light gray', ''),