Make bodies locally toggleable
authorAlexander Botero-Lowry <alex.boterolowry@gmail.com>
Tue, 24 Nov 2009 07:39:57 +0000 (23:39 -0800)
committerAlexander Botero-Lowry <alexbl@fortitudo.(none)>
Tue, 24 Nov 2009 18:39:18 +0000 (10:39 -0800)
Having actually implemented this, I realized that my
initial approach of providing a function to configure
a button was wrong. Instead I've replaced that with
button types. This then makes it possible to provide
the fully expanded view when all threads in a message
are unread.

It also has the potential to allow global-expansion functions
if that is desireable

notmuch.el

index 23a07cca2efbbcf6355e642199063799d466aa55..af0c487e14d6664accb53ba19dbe3cef27ebd997 100644 (file)
@@ -497,12 +497,15 @@ which this thread was originally shown."
   (force-window-update)
   (redisplay t))
 
-(defun notmuch-configure-invisibility-button (btn invis-spec help-msg)
-  (button-put btn 'invisibility-spec invis-spec)
-  (button-put btn 'action 'notmuch-toggle-invisible-action)
-  (button-put btn 'follow-link t)
-  (button-put btn 'help-echo (concat "mouse-1, RET: " help-msg))
-)
+(define-button-type 'notmuch-button-invisibility-toggle-type 'action 'notmuch-toggle-invisible-action 'follow-link t)
+(define-button-type 'notmuch-button-citation-toggle-type 'help-echo "mouse-1, RET: Show citation"
+  :supertype 'notmuch-button-invisibility-toggle-type)
+(define-button-type 'notmuch-button-signature-toggle-type 'help-echo "mouse-1, RET: Show signature"
+  :supertype 'notmuch-button-invisibility-toggle-type)
+(define-button-type 'notmuch-button-headers-toggle-type 'help-echo "mouse-1, RET: Show headers"
+  :supertype 'notmuch-button-invisibility-toggle-type)
+(define-button-type 'notmuch-button-body-toggle-type 'help-echo "mouse-1, RET: Show message"
+  :supertype 'notmuch-button-invisibility-toggle-type)
 
 (defun notmuch-show-markup-citations-region (beg end depth)
   (goto-char beg)
@@ -525,7 +528,9 @@ which this thread was originally shown."
                              "-line citation.]")))
                 (goto-char (- beg-sub 1))
                 (insert (concat "\n" indent))
-                (notmuch-configure-invisibility-button (insert-button cite-button-text) invis-spec "Show citation")
+                (insert-button cite-button-text
+                               'invisibility-spec invis-spec
+                               :type 'notmuch-button-citation-toggle-type)
                 (insert "\n")
                 (goto-char (+ (length cite-button-text) p))
               ))))
@@ -541,9 +546,11 @@ which this thread was originally shown."
                   
                     (goto-char (- beg-sub 1))
                     (insert (concat "\n" indent))
-                    (notmuch-configure-invisibility-button
-                     (insert-button (concat "[" (number-to-string sig-lines)
-                                            "-line signature.]"))  invis-spec "Show signature")
+                    (let ((sig-button-text (concat "[" (number-to-string sig-lines)
+                                                   "-line signature.]")))
+                      (insert-button sig-button-text 'invisibility-spec invis-spec
+                                     :type 'notmuch-button-signature-toggle-type)
+                     )
                     (insert "\n")
                     (goto-char end))))))
       (forward-line))))
@@ -572,16 +579,19 @@ which this thread was originally shown."
     (while (< (point) end)
       (notmuch-show-markup-part beg end depth))))
 
-(defun notmuch-show-markup-body (depth)
+(defun notmuch-show-markup-body (depth btn)
   (re-search-forward notmuch-show-body-begin-regexp)
   (forward-line)
   (let ((beg (point-marker)))
     (re-search-forward notmuch-show-body-end-regexp)
     (let ((end (copy-marker (match-beginning 0))))
       (notmuch-show-markup-parts-region beg end depth)
-      (if (not (notmuch-show-message-unread-p))
-         (overlay-put (make-overlay beg end)
-                      'invisible 'notmuch-show-body-read))
+      (let ((invis-spec (make-symbol "notmuch-show-body-read")))
+        (overlay-put (make-overlay beg end)
+                     'invisible invis-spec)
+        (button-put btn 'invisibility-spec invis-spec)
+        (if (not (notmuch-show-message-unread-p))
+            (add-to-invisibility-spec invis-spec)))
       (set-marker beg nil)
       (set-marker end nil)
       )))
@@ -589,10 +599,12 @@ which this thread was originally shown."
 (defun notmuch-show-markup-header (depth)
   (re-search-forward notmuch-show-header-begin-regexp)
   (forward-line)
-  (let ((beg (point-marker)))
+  (let ((beg (point-marker))
+        (btn nil))
     (end-of-line)
     ; Inverse video for subject
     (overlay-put (make-overlay beg (point)) 'face '(:inverse-video t))
+    (setq btn (make-button beg (point) :type 'notmuch-button-body-toggle-type))
     (forward-line 1)
     (end-of-line)
     (let ((beg-hidden (point-marker)))
@@ -614,23 +626,25 @@ which this thread was originally shown."
                        'invisible invis-spec)
           (goto-char beg)
           (forward-line)
-          (notmuch-configure-invisibility-button
-           (make-button (line-beginning-position) (line-end-position))
-           (cons invis-spec t) "Show headers"))
+          (make-button (line-beginning-position) (line-end-position)
+                        'invisibility-spec (cons invis-spec t)
+                        :type 'notmuch-button-headers-toggle-type))
         (goto-char end)
         (insert "\n")
        (set-marker beg nil)
        (set-marker beg-hidden nil)
        (set-marker end nil)
-       ))))
+       ))
+    btn))
 
 (defun notmuch-show-markup-message ()
   (if (re-search-forward notmuch-show-message-begin-regexp nil t)
       (progn
        (re-search-forward notmuch-show-depth-regexp)
-       (let ((depth (string-to-number (buffer-substring (match-beginning 1) (match-end 1)))))
-         (notmuch-show-markup-header depth)
-         (notmuch-show-markup-body depth)))
+       (let ((depth (string-to-number (buffer-substring (match-beginning 1) (match-end 1))))
+              (btn nil))
+         (setq btn (notmuch-show-markup-header depth))
+         (notmuch-show-markup-body depth btn)))
     (goto-char (point-max))))
 
 (defun notmuch-show-hide-markers ()
@@ -650,17 +664,6 @@ which this thread was originally shown."
       (notmuch-show-markup-message)))
   (notmuch-show-hide-markers))
 
-(defun notmuch-show-toggle-body-read-visible ()
-  "Toggle visibility of message bodies of read messages"
-  (interactive)
-  (if notmuch-show-body-read-visible
-      (add-to-invisibility-spec 'notmuch-show-body-read)
-    (remove-from-invisibility-spec 'notmuch-show-body-read))
-  (set 'notmuch-show-body-read-visible (not notmuch-show-body-read-visible))
-  ; Need to force the redisplay for some reason
-  (force-window-update)
-  (redisplay t))
-
 ;;;###autoload
 (defun notmuch-show-mode ()
   "Major mode for viewing a thread with notmuch.
@@ -689,14 +692,6 @@ view, (remove the \"inbox\" tag from each), with
 \\{notmuch-show-mode-map}"
   (interactive)
   (kill-all-local-variables)
-  (set (make-local-variable 'notmuch-show-headers-visible) t)
-  (notmuch-show-toggle-headers-visible)
-  (set (make-local-variable 'notmuch-show-body-read-visible) t)
-  (notmuch-show-toggle-body-read-visible)
-  (set (make-local-variable 'notmuch-show-citations-visible) t)
-  (notmuch-show-toggle-citations-visible)
-  (set (make-local-variable 'notmuch-show-signatures-visible) t)
-  (notmuch-show-toggle-signatures-visible)
   (add-to-invisibility-spec 'notmuch-show-marker)
   (use-local-map notmuch-show-mode-map)
   (setq major-mode 'notmuch-show-mode
@@ -765,7 +760,16 @@ thread from that buffer can be show when done with this one)."
            (if (not (notmuch-show-message-unread-p))
                (progn
                  (goto-char (point-min))
-                 (notmuch-show-toggle-body-read-visible)))))
+                  (let ((btn (forward-button 1)))
+                    (while btn
+                      (if (button-has-type-p btn 'notmuch-button-body-toggle-type)
+                          (push-button))
+                      (condition-case err
+                          (setq btn (forward-button 1))
+                        (error (setq btn nil)))
+                    ))
+                  (beginning-of-buffer)
+                  ))))
       )))
 
 (defvar notmuch-search-authors-width 40
@@ -803,6 +807,7 @@ thread from that buffer can be show when done with this one)."
 (defvar notmuch-search-query-string)
 (defvar notmuch-search-oldest-first)
 
+
 (defun notmuch-search-scroll-up ()
   "Scroll up, moving point to last message in thread if at end."
   (interactive)