]> git.cworth.org Git - sup/commitdiff
Allow thread index view to sort oldest first
authorKeith Packard <keithp@keithp.com>
Tue, 22 Sep 2009 18:23:20 +0000 (11:23 -0700)
committerKeith Packard <keithp@keithp.com>
Fri, 25 Sep 2009 19:26:14 +0000 (12:26 -0700)
This allows the thread index view to present oldest messages first
instead of always presenting newer messages at the top of the list.
This can be toggled using the 'o' key.

A config file option :inbox_newest_first controls whether this is
turned on by default when viewing the inbox

Refine searches inherit the order from the originating thread index.

Signed-off-by: Keith Packard <keithp@keithp.com>
bin/sup
lib/sup/modes/inbox-mode.rb
lib/sup/modes/label-search-results-mode.rb
lib/sup/modes/search-results-mode.rb
lib/sup/modes/thread-index-mode.rb

diff --git a/bin/sup b/bin/sup
index e53a8e8bfafa2fcffa00cf89d1e75fa26eb62bec..43a26fca4127cdc227c1cc6ee356d74ac9d1e8c7 100755 (executable)
--- a/bin/sup
+++ b/bin/sup
@@ -205,7 +205,7 @@ begin
   end
 
   if $opts[:search]
-    SearchResultsMode.spawn_from_query $opts[:search]
+    SearchResultsMode.spawn_from_query $opts[:search], true
   end
 
   until Redwood::exceptions.nonempty? || $die
@@ -267,9 +267,9 @@ begin
     when :search
       query = BufferManager.ask :search, "search all messages: "
       next unless query && query !~ /^\s*$/
-      SearchResultsMode.spawn_from_query query
+      SearchResultsMode.spawn_from_query query, true
     when :search_unread
-      SearchResultsMode.spawn_from_query "is:unread"
+      SearchResultsMode.spawn_from_query "is:unread", InboxMode.newest_first
     when :list_labels
       labels = LabelManager.all_labels.map { |l| LabelManager.string_for l }
       user_label = bm.ask_with_completions :label, "Show threads with label (enter for listing): ", labels
index 51f3a515c63949f31a959e0b0aaa7e70779459d4..f347ffb9cc19f0f1f812f50a2d8ccb263de5f494 100644 (file)
@@ -10,10 +10,19 @@ class InboxMode < ThreadIndexMode
     k.add :refine_search, "Refine search", '|'
   end
 
+  def self.newest_first
+    if !$config[:inbox_newest_first].nil?
+      $config[:inbox_newest_first]
+    else
+      true
+    end
+  end
+
   def initialize
     super [:inbox, :sent, :draft], { :label => :inbox, :skip_killed => true }
     raise "can't have more than one!" if defined? @@instance
     @@instance = self
+    @newest_first = InboxMode.newest_first
   end
 
   def is_relevant? m; (m.labels & [:spam, :deleted, :killed, :inbox]) == Set.new([:inbox]) end
@@ -21,7 +30,7 @@ class InboxMode < ThreadIndexMode
   def refine_search
     text = BufferManager.ask :search, "refine query: ", "label:inbox AND "
     return unless text && text !~ /^\s*$/
-    SearchResultsMode.spawn_from_query text
+    SearchResultsMode.spawn_from_query text, @newest_first
   end
 
   ## label-list-mode wants to be able to raise us if the user selects
index bca51d456143e901683b7f3b65f1be3a909e25e0..6899104c46d21b1b6d90e43e8d1ab467d15edf8c 100644 (file)
@@ -1,12 +1,13 @@
 module Redwood
 
 class LabelSearchResultsMode < ThreadIndexMode
-  def initialize labels
+  def initialize labels, newest_first
     @labels = labels
     opts = { :labels => @labels }
     opts[:load_deleted] = true if labels.include? :deleted
     opts[:load_spam] = true if labels.include? :spam
     super [], opts
+    @newest_first = newest_first
   end
 
   register_keymap do |k|
@@ -17,7 +18,7 @@ class LabelSearchResultsMode < ThreadIndexMode
     label_query = @labels.size > 1 ? "(#{@labels.join('||')})" : @labels.first
     query = BufferManager.ask :search, "refine query: ", "+label:#{label_query} "
     return unless query && query !~ /^\s*$/
-    SearchResultsMode.spawn_from_query query
+    SearchResultsMode.spawn_from_query query, @newest_first
   end
 
   def is_relevant? m; @labels.all? { |l| m.has_label? l } end
@@ -29,7 +30,7 @@ class LabelSearchResultsMode < ThreadIndexMode
     when :inbox
       BufferManager.raise_to_front InboxMode.instance.buffer
     else
-      b, new = BufferManager.spawn_unless_exists("All threads with label '#{label}'") { LabelSearchResultsMode.new [label] }
+      b, new = BufferManager.spawn_unless_exists("All threads with label '#{label}'") { LabelSearchResultsMode.new [label], true }
       b.mode.load_threads :num => b.content_height if new
     end
   end
index 121e8176a5e1060aa3aa96057f9cf526b758f5e4..da03b5125e7c6c1f02e99dd226707e59a2a2428b 100644 (file)
@@ -1,9 +1,10 @@
 module Redwood
 
 class SearchResultsMode < ThreadIndexMode
-  def initialize query
+  def initialize query, newest_first
     @query = query
     super [], query
+    @newest_first = newest_first
   end
 
   register_keymap do |k|
@@ -13,7 +14,7 @@ class SearchResultsMode < ThreadIndexMode
   def refine_search
     text = BufferManager.ask :search, "refine query: ", (@query[:text] + " ")
     return unless text && text !~ /^\s*$/
-    SearchResultsMode.spawn_from_query text
+    SearchResultsMode.spawn_from_query text, @newest_first
   end
 
   ## a proper is_relevant? method requires some way of asking ferret
@@ -22,12 +23,12 @@ class SearchResultsMode < ThreadIndexMode
   ## the message, and search against it to see if i have > 0 results,
   ## but that seems pretty insane.
 
-  def self.spawn_from_query text
+  def self.spawn_from_query text, newest_first
     begin
       query = Index.parse_query(text)
       return unless query
       short_text = text.length < 20 ? text : text[0 ... 20] + "..."
-      mode = SearchResultsMode.new query
+      mode = SearchResultsMode.new query, newest_first
       BufferManager.spawn "search: \"#{short_text}\"", mode
       mode.load_threads :num => mode.buffer.content_height
     rescue Index::ParseError => e
index 82f258b689681183614b65d6475829ba10d0563e..6a6bd581035352a9762d7579b74e59cdd7bc04ad 100644 (file)
@@ -47,6 +47,7 @@ EOS
     k.add :tag_matching, "Tag matching threads", 'g'
     k.add :apply_to_tagged, "Apply next command to all tagged threads", '+', '='
     k.add :join_threads, "Force tagged threads to be joined into the same thread", '#'
+    k.add :toggle_sort, "Toggle newest first/last sort order", 'o'
     k.add :undo, "Undo the previous action", 'u'
   end
 
@@ -65,6 +66,8 @@ EOS
     @hidden_labels = hidden_labels + LabelManager::HIDDEN_RESERVED_LABELS
     @date_width = DATE_WIDTH
 
+    @newest_first = true
+
     @interrupt_search = false
     
     initialize_threads # defines @ts and @ts_mutex
@@ -219,10 +222,18 @@ EOS
     UndoManager.undo
   end
 
+  def toggle_sort
+    @newest_first = !@newest_first
+    update
+  end
+
   def update
     @mutex.synchronize do
       ## let's see you do THIS in python
-      @threads = @ts.threads.select { |t| !@hidden_threads[t] }.sort_by { |t| [t.date, t.first.id] }.reverse
+      @threads = @ts.threads.select { |t| !@hidden_threads[t] }.sort_by { |t| [t.date, t.first.id] }
+      if @newest_first
+        @threads = @threads.reverse
+      end
       @size_widgets = @threads.map { |t| size_widget_for_thread t }
       @size_widget_width = @size_widgets.max_of { |w| w.display_length }
     end
@@ -664,6 +675,9 @@ EOS
     else
       n = opts[:num]
     end
+    if !@newest_first
+      n = -1
+    end
 
     myopts = @load_thread_opts.merge({ :when_done => (lambda do |num|
       opts[:when_done].call(num) if opts[:when_done]