k.add :show_header, "Show full message header", 'H'
k.add :toggle_expanded, "Expand/collapse item", :enter
k.add :expand_all_messages, "Expand/collapse all messages", 'E'
- k.add :edit_message, "Edit message (drafts only)", 'e'
+ k.add :edit_draft, "Edit draft", 'e'
k.add :expand_all_quotes, "Expand/collapse all quotes in a message", 'o'
k.add :jump_to_next_open, "Jump to next open message", 'n'
k.add :jump_to_prev_open, "Jump to previous open message", 'p'
earliest, latest = nil, nil
latest_date = nil
altcolor = false
+
@thread.each do |m, d, p|
next unless m
earliest ||= m
cursor_down if l.state == :closed
when Message::Quote, Message::Signature
return if chunk.lines.length == 1
- l = @chunk_layout[chunk]
- l.state = (l.state != :closed ? :closed : :open)
- cursor_down if l.state == :closed
+ toggle_chunk_expansion chunk
when Message::Attachment
- view_attachment chunk
+ if chunk.inlineable?
+ toggle_chunk_expansion chunk
+ else
+ view_attachment chunk
+ end
end
update
end
case chunk
when Message::Attachment
fn = BufferManager.ask :filename, "Save attachment to file: ", chunk.filename
- save_to_file(fn) { |f| f.print chunk } if fn
+ save_to_file(fn) { |f| f.print chunk.raw_content } if fn
else
m = @message_lines[curpos]
fn = BufferManager.ask :filename, "Save message to file: "
end
end
- def edit_message
+ def edit_draft
m = @message_lines[curpos] or return
if m.is_draft?
mode = ResumeMode.new m
BufferManager.spawn "Edit message", mode
+ BufferManager.kill_buffer self.buffer
mode.edit
else
BufferManager.flash "Not a draft message!"
private
+ def toggle_chunk_expansion chunk
+ l = @chunk_layout[chunk]
+ l.state = (l.state != :closed ? :closed : :open)
+ cursor_down if l.state == :closed
+ end
+
def initial_state_for m
if m.has_label?(:starred) || m.has_label?(:unread)
:open
end
l = @layout[m]
+ ## is this still necessary?
+ next unless @layout[m].state # skip discarded drafts
+
## build the patina
text = chunk_to_lines m, l.state, @text.length, depth, parent, l.color, l.star_color
if l.state != :closed
m.chunks.each do |c|
cl = @chunk_layout[c]
- cl.state ||= :closed
+
+ ## set the default state for chunks
+ cl.state ||=
+ if c.is_a?(Message::Attachment) && c.inlineable?
+ :open
+ else
+ :closed
+ end
+
text = chunk_to_lines c, cl.state, @text.length, depth
(0 ... text.length).each do |i|
@chunk_lines[@text.length + i] = c
message_patina_lines(chunk, state, start, parent, prefix, color, star_color) +
(chunk.is_draft? ? [[[:draft_notification_color, prefix + " >>> This message is a draft. To edit, hit 'e'. <<<"]]] : [])
when Message::Attachment
- [[[:mime_color, "#{prefix}+ MIME attachment #{chunk.content_type}#{chunk.desc ? ' (' + chunk.desc + ')': ''}"]]]
+ return [[[:attachment_color, "#{prefix}x Attachment: #{chunk.filename} (#{chunk.content_type})"]]] unless chunk.inlineable?
+ case state
+ when :closed
+ [[[:attachment_color, "#{prefix}+ Attachment: #{chunk.filename} (#{chunk.lines.length} lines)"]]]
+ when :open
+ [[[:attachment_color, "#{prefix}- Attachment: #{chunk.filename} (#{chunk.lines.length} lines)"]]] + chunk.lines.map { |line| [[:none, "#{prefix}#{line}"]] }
+ end
when Message::Text
t = chunk.lines
if t.last =~ /^\s*$/ && t.length > 1