]> git.cworth.org Git - sup/commitdiff
Merge branch 'master' into next
authorWilliam Morgan <wmorgan-sup@masanjin.net>
Wed, 9 Sep 2009 14:36:07 +0000 (10:36 -0400)
committerWilliam Morgan <wmorgan-sup@masanjin.net>
Wed, 9 Sep 2009 14:36:07 +0000 (10:36 -0400)
1  2 
lib/sup/modes/thread-view-mode.rb

index 8ab1d8567b2911a347ba001d9e48da3b0b95544c,1c38fbbc741168117557ec3de0fc34ef581b9f66..47dd4718a76e04ea65939a8fa063d18cb43b6e85
@@@ -1,3 -1,4 +1,3 @@@
 -require 'open3'
  module Redwood
  
  class ThreadViewMode < LineCursorMode
@@@ -64,6 -65,9 +64,9 @@@ EO
      k.add :unsubscribe_from_list, "Subscribe to/unsubscribe from mailing list", ")"
      k.add :pipe_message, "Pipe message or attachment to a shell command", '|'
  
+     k.add :archive_and_next, "Archive this thread, kill buffer, and view next", 'a'
+     k.add :delete_and_next, "Delete this thread, kill buffer, and view next", 'd'
      k.add_multi "(a)rchive/(d)elete/mark as (s)pam/mark as u(N)read:", '.' do |kk|
        kk.add :archive_and_kill, "Archive this thread and kill buffer", 'a'
        kk.add :delete_and_kill, "Delete this thread and kill buffer", 'd'
      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