diff options
-rw-r--r-- | alot/buffer.py | 21 | ||||
-rw-r--r-- | alot/db.py | 25 | ||||
-rw-r--r-- | alot/widgets.py | 9 | ||||
-rw-r--r-- | settings.py | 2 |
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): @@ -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', ''), |