]> git.cworth.org Git - sup/commitdiff
Merge branch 'alignment-tweaks' into next
authorWilliam Morgan <wmorgan-sup@masanjin.net>
Thu, 3 Sep 2009 17:09:45 +0000 (13:09 -0400)
committerWilliam Morgan <wmorgan-sup@masanjin.net>
Thu, 3 Sep 2009 17:09:45 +0000 (13:09 -0400)
1  2 
lib/sup/modes/thread-index-mode.rb
lib/sup/modes/thread-view-mode.rb

index d1b7fdba7899fc07f324a6f5a4c21a709bb6fc84,bc5625c6f66438817a4cce17a974795c85f9a39f..5038d29f308fb5a609c783add43e401d011b34a9
@@@ -40,7 -40,6 +40,7 @@@ EO
      k.add :save, "Save changes now", '$'
      k.add :jump_to_next_new, "Jump to next new thread", :tab
      k.add :reply, "Reply to latest message in a thread", 'r'
 +    k.add :reply_all, "Reply to all participants of the latest message in a thread", 'G'
      k.add :forward, "Forward latest message in a thread", 'f'
      k.add :toggle_tagged, "Tag/untag selected thread", 't'
      k.add :toggle_tagged_all, "Tag/untag all threads", 'T'
        mode = ThreadViewMode.new t, @hidden_labels, self
        BufferManager.spawn t.subj, mode
        BufferManager.draw_screen
-       mode.jump_to_first_open true
+       mode.jump_to_first_open
        BufferManager.draw_screen # lame TODO: make this unnecessary
        ## the first draw_screen is needed before topline and botline
        ## are set, and the second to show the cursor having moved
      end
    end
  
 -  def reply
 +  def reply type_arg=nil
      t = cursor_thread or return
      m = t.latest_message
      return if m.nil? # probably won't happen
      m.load_from_source!
 -    mode = ReplyMode.new m
 +    mode = ReplyMode.new m, type_arg
      BufferManager.spawn "Reply to #{m.subj}", mode
    end
  
 +  def reply_all; reply :all; end
 +
    def forward
      t = cursor_thread or return
      m = t.latest_message
index 27167cbdd9750158f0a76dda51b4c11740a99c9a,27132de8d9dfe1d623c2cf92d59153aaeaab4837..8ab1d8567b2911a347ba001d9e48da3b0b95544c
@@@ -1,4 -1,3 +1,3 @@@
- require 'open3'
  module Redwood
  
  class ThreadViewMode < LineCursorMode
@@@ -53,7 -52,6 +52,7 @@@ EO
      k.add :toggle_new, "Toggle unread/read status of message", 'N'
  #    k.add :collapse_non_new_messages, "Collapse all but unread messages", 'N'
      k.add :reply, "Reply to a message", 'r'
 +    k.add :reply_all, "Reply to all participants of this message", 'G'
      k.add :forward, "Forward a message or attachment", 'f'
      k.add :bounce, "Bounce message to other recipient(s)", '!'
      k.add :alias, "Edit alias/nickname for a person", 'i'
      update
    end
  
 -  def reply
 +  def reply type_arg=nil
      m = @message_lines[curpos] or return
 -    mode = ReplyMode.new m
 +    mode = ReplyMode.new m, type_arg
      BufferManager.spawn "Reply to #{m.subj}", mode
    end
  
 +  def reply_all; reply :all; end
 +
    def subscribe_to_list
      m = @message_lines[curpos] or return
      if m.list_subscribe && m.list_subscribe =~ /<mailto:(.*?)\?(subject=(.*?))>/
      end
    end
  
-   def jump_to_first_open loose_alignment=false
+   def jump_to_first_open
      m = @message_lines[0] or return
      if @layout[m].state != :closed
-       jump_to_message m, loose_alignment
+       jump_to_message m#, true
      else
-       jump_to_next_open loose_alignment
+       jump_to_next_open #true
      end
    end
  
-   def jump_to_next_open loose_alignment=false
+   def jump_to_next_open force_alignment=nil
      return continue_search_in_buffer if in_search? # hack: allow 'n' to apply to both operations
      m = (curpos ... @message_lines.length).argfind { |i| @message_lines[i] }
      return unless m
        break if @layout[nextm].state != :closed
        m = nextm
      end
-     jump_to_message nextm, loose_alignment if nextm
+     jump_to_message nextm, force_alignment if nextm
    end
  
    def align_current_message
      m = @message_lines[curpos] or return
-     jump_to_message m
+     jump_to_message m, true
    end
  
-   def jump_to_prev_open loose_alignment=false
+   def jump_to_prev_open
      m = (0 .. curpos).to_a.reverse.argfind { |i| @message_lines[i] } # bah, .to_a
      return unless m
      ## jump to the top of the current message if we're in the body;
          break if @layout[prevm].state != :closed
          m = prevm
        end
-       jump_to_message prevm, loose_alignment if prevm
+       jump_to_message prevm if prevm
      else
-       jump_to_message m, loose_alignment
+       jump_to_message m
      end
    end
  
-   IDEAL_TOP_CONTEXT = 3 # try and give 3 rows of top context
-   IDEAL_LEFT_CONTEXT = 4 # try and give 4 columns of left context
-   def jump_to_message m, loose_alignment=false
+   def jump_to_message m, force_alignment=false
      l = @layout[m]
-     left = l.depth * INDENT_SPACES
-     right = left + l.width
  
-     ## jump to the top line
-     if loose_alignment
-       jump_to_line [l.top - IDEAL_TOP_CONTEXT, 0].max # give 3 lines of top context
-     else
-       jump_to_line l.top
+     ## boundaries of the message
+     message_left = l.depth * INDENT_SPACES
+     message_right = message_left + l.width
+     ## calculate leftmost colum
+     left = if force_alignment # force mode: align exactly
+       message_left
+     else # regular: minimize cursor movement
+       ## leftmost and rightmost are boundaries of all valid left-column
+       ## alignments.
+       leftmost = [message_left, message_right - buffer.content_width + 1].min
+       rightmost = message_left
+       leftcol.clamp(leftmost, rightmost)
      end
  
-     ## jump to the left column
-     ideal_left = left +
-       if loose_alignment
-         -IDEAL_LEFT_CONTEXT + (l.width - buffer.content_width + IDEAL_LEFT_CONTEXT + 1).clamp(0, IDEAL_LEFT_CONTEXT)
-       else
-         0
-       end
-     jump_to_col [ideal_left, 0].max
-     ## either way, move the cursor to the first line
-     set_cursor_pos l.top
+     jump_to_line l.top    # move vertically
+     jump_to_col left      # move horizontally
+     set_cursor_pos l.top  # set cursor pos
    end
  
    def expand_all_messages