From: William Morgan Date: Thu, 3 Sep 2009 17:09:45 +0000 (-0400) Subject: Merge branch 'alignment-tweaks' into next X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=134a8db4780dbac1854ca69d132721663d88fde8;hp=1474193564b8968e041cf260dfdc9ad909742fc6;p=sup Merge branch 'alignment-tweaks' into next --- diff --git a/lib/sup/mode.rb b/lib/sup/mode.rb index 209ca45..03deacb 100644 --- a/lib/sup/mode.rb +++ b/lib/sup/mode.rb @@ -1,3 +1,4 @@ +require 'open3' module Redwood class Mode diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb index d1b7fdb..5038d29 100644 --- a/lib/sup/modes/thread-index-mode.rb +++ b/lib/sup/modes/thread-index-mode.rb @@ -112,7 +112,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 27167cb..8ab1d85 100644 --- a/lib/sup/modes/thread-view-mode.rb +++ b/lib/sup/modes/thread-view-mode.rb @@ -1,4 +1,3 @@ -require 'open3' module Redwood class ThreadViewMode < LineCursorMode @@ -361,16 +360,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 @@ -378,15 +377,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; @@ -398,38 +397,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