From b8dd68f59f6b9930e3cc1d30aed8ae4059874821 Mon Sep 17 00:00:00 2001 From: William Morgan Date: Thu, 3 Sep 2009 13:08:29 -0400 Subject: [PATCH] rejigger alignment of messages when using 'n' and 'p' minimize horizontal movement. 'z' can be used to force alignment of current message with left column. --- lib/sup/modes/thread-index-mode.rb | 2 +- lib/sup/modes/thread-view-mode.rb | 57 ++++++++++++++---------------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb index fb6b2ce..bc5625c 100644 --- a/lib/sup/modes/thread-index-mode.rb +++ b/lib/sup/modes/thread-index-mode.rb @@ -111,7 +111,7 @@ EOS 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 diff --git a/lib/sup/modes/thread-view-mode.rb b/lib/sup/modes/thread-view-mode.rb index 639ae66..27132de 100644 --- a/lib/sup/modes/thread-view-mode.rb +++ b/lib/sup/modes/thread-view-mode.rb @@ -357,16 +357,16 @@ EOS 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 @@ -374,15 +374,15 @@ EOS 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; @@ -394,38 +394,33 @@ EOS 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 - 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 + ## boundaries of the message + message_left = l.depth * INDENT_SPACES + message_right = message_left + l.width - jump_to_col [ideal_left, 0].max + ## 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 - ## 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 -- 2.43.0