Extend the saved search plist to include a :display-function property
that can customise the display of the saved search. It can change the
count string displayed and the name string. Thus the user can
customise so that a particular search:

does not show a count (and is thus hello is faster), shows a thread
count, show a combined message/thread count, changes colour of the
search button based on new messages arriving etc.

The display function should use (&rest args) to take a keyword list of
arguments. The advantage of this is that it is easy to add extra
arguments in a backwards compatible way (existing user scripts will
still work).

If a user uses this it will not take advantage of the batch counting
currently done so will make things slower over remote links (except in
cases where no query is done!).

It also deletes the :count-query option from the customise for saved
searches as this method is much more general. The code still supports
the :count-query option though (just the defcustom does not).
---
 emacs/notmuch-hello.el |   47 +++++++++++++++++++++++++++++++----------------
 1 file changed, 31 insertions(+), 16 deletions(-)

diff --git a/emacs/notmuch-hello.el b/emacs/notmuch-hello.el
index 0a7004c..7075860 100644
--- a/emacs/notmuch-hello.el
+++ b/emacs/notmuch-hello.el
@@ -85,12 +85,13 @@ (define-widget 'notmuch-saved-search-plist 'list
                (group :format "%v" :inline t (const :format "  Query: " 
:query) (string :format "%v")))
          (checklist :inline t
                     :format "%v"
-                    (group :format "%v" :inline t (const :format "Count-Query: 
" :count-query) (string :format "%v"))
                     (group :format "%v" :inline t (const :format "" 
:sort-order)
                            (choice :tag " Sort Order"
                                    (const :tag "Default" nil)
                                    (const :tag "Oldest-first" oldest-first)
-                                   (const :tag "Newest-first" 
newest-first))))))
+                                   (const :tag "Newest-first" newest-first)))
+                    (group :format "%v" :inline t (const :format 
"Display-function: " :display-function) (function :format "%v")))))
+

 (defcustom notmuch-saved-searches '((:name "inbox" :query "tag:inbox")
                                    (:name "unread" :query "tag:unread"))
@@ -101,12 +102,19 @@ (defcustom notmuch-saved-searches '((:name "inbox" :query 
"tag:inbox")

   :name            Name of the search (required).
   :query           Search to run (required).
-  :count-query     Optional extra query to generate the count
-                   shown. If not present then the :query property
-                   is used.
   :sort-order      Specify the sort order to be used for the search.
                    Possible values are 'oldest-first 'newest-first or
                    nil. Nil means use the default sort order.
+  :display-function Optional function to generate the count and
+                   name to be displayed. The function takes a
+                   keyword list of arguments (it should use
+                   &rest). Keywords include :current for the
+                   current saved search plist and :options. If
+                   this function is not set then the default
+                   display of message count and name is used. The
+                   function should return an updated saved search
+                   plist including :name and :count as the name
+                   and count-string to be displayed.

 Other accepted forms are a cons cell of the form (NAME . QUERY)
 or a list of the form (NAME QUERY COUNT-QUERY)."
@@ -507,15 +515,16 @@ (defun notmuch-hello-query-counts (query-list &rest 
options)
 `notmuch-hello-insert-searches'."
   (with-temp-buffer
     (dolist (elem query-list nil)
-      (let ((count-query (or (notmuch-saved-search-get elem :count-query)
-                            (notmuch-saved-search-get elem :query))))
-       (insert
-        (replace-regexp-in-string
-         "\n" " "
-         (notmuch-hello-filtered-query count-query
-                                       (or (plist-get options :filter-count)
-                                           (plist-get options :filter))))
-         "\n")))
+      (unless (notmuch-saved-search-get elem :display-function)
+       (let ((count-query (or (notmuch-saved-search-get elem :count-query)
+                              (notmuch-saved-search-get elem :query))))
+         (insert
+          (replace-regexp-in-string
+           "\n" " "
+           (notmuch-hello-filtered-query count-query
+                                         (or (plist-get options :filter-count)
+                                             (plist-get options :filter))))
+          "\n"))))

     (unless (= (call-process-region (point-min) (point-max) notmuch-command
                                    t t nil "count" "--batch") 0)
@@ -530,8 +539,14 @@ (defun notmuch-hello-query-counts (query-list &rest 
options)
      #'identity
      (mapcar
       (lambda (elem)
-       (let* ((elem-plist (notmuch-hello-saved-search-to-plist elem)))
-         (notmuch-hello-batch-message-count elem-plist options)))
+       (let* ((elem-plist (notmuch-hello-saved-search-to-plist elem))
+              (display-function (plist-get elem-plist :display-function))
+              (result (if display-function
+                           (funcall display-function
+                                    :current elem-plist
+                                    :option options)
+                         (notmuch-hello-batch-message-count elem-plist 
options))))
+         result))
       query-list))))

 (defun notmuch-hello-insert-buttons (searches)
-- 
1.7.10.4

Reply via email to