0
0
Fork 1
mirror of https://git.savannah.gnu.org/git/emacs/org-mode.git synced 2024-09-29 22:07:49 +00:00

org-agenda: Support for dimming local to each agenda.

Composite agenda views could not separately specify whether to dim
blocked tasks.

* lisp/org-agenda.el (org-agenda--mark-blocked-entry): New function.
(org-agenda-dim-blocked-tasks): Modified to work with text properties
set by org-agenda--marked-blocked-entry.
This commit is contained in:
Yuri D. Lensky 2017-07-10 19:21:39 -07:00 committed by Nicolas Goaziou
parent 6d50e167ca
commit 912a385518

View file

@ -3886,35 +3886,53 @@ dimming them."
(when (eq (overlay-get o 'org-type) 'org-blocked-todo)
(delete-overlay o)))
(save-excursion
(let ((inhibit-read-only t)
(org-depend-tag-blocked nil)
org-blocked-by-checkboxes)
(let ((inhibit-read-only t))
(goto-char (point-min))
(while (let ((pos (text-property-not-all
(point) (point-max) 'todo-state nil)))
(point) (point-max) 'org-todo-blocked nil)))
(when pos (goto-char pos)))
(setq org-blocked-by-checkboxes nil)
(let ((marker (org-get-at-bol 'org-hd-marker)))
(when (and (markerp marker)
(with-current-buffer (marker-buffer marker)
(save-excursion (goto-char marker)
(org-entry-blocked-p))))
;; Entries blocked by checkboxes cannot be made invisible.
;; See `org-agenda-dim-blocked-tasks' for details.
(let* ((really-invisible
(and (not org-blocked-by-checkboxes)
(or invisible (eq org-agenda-dim-blocked-tasks
'invisible))))
(ov (make-overlay (if really-invisible (line-end-position 0)
(line-beginning-position))
(line-end-position))))
(if really-invisible (overlay-put ov 'invisible t)
(overlay-put ov 'face 'org-agenda-dimmed-todo-face))
(overlay-put ov 'org-type 'org-blocked-todo))))
(let* ((invisible (eq (org-get-at-bol 'org-todo-blocked) 'invisible))
(ov (make-overlay (if invisible
(line-end-position 0)
(line-beginning-position))
(line-end-position))))
(if invisible
(overlay-put ov 'invisible t)
(overlay-put ov 'face 'org-agenda-dimmed-todo-face))
(overlay-put ov 'org-type 'org-blocked-todo))
(forward-line))))
(when (called-interactively-p 'interactive)
(message "Dim or hide blocked tasks...done")))
(defun org-agenda--mark-blocked-entry (entry)
"For ENTRY a string with the text property `org-hd-marker', if
the header at `org-hd-marker' is blocked according to
`org-entry-blocked-p', then if `org-agenda-dim-blocked-tasks' is
'invisible and the header is not blocked by checkboxes, set the
text property `org-todo-blocked' to 'invisible, otherwise set it
to t."
(when (get-text-property 0 'todo-state entry)
(let ((entry-marker (get-text-property 0 'org-hd-marker entry))
(org-blocked-by-checkboxes nil)
;; Necessary so that `org-entry-blocked-p' does not change
;; the buffer.
(org-depend-tag-blocked nil))
(when entry-marker
(let ((blocked
(with-current-buffer (marker-buffer entry-marker)
(save-excursion
(goto-char entry-marker)
(org-entry-blocked-p)))))
(when blocked
(let ((really-invisible
(and (not org-blocked-by-checkboxes)
(eq org-agenda-dim-blocked-tasks 'invisible))))
(put-text-property
0 (length entry) 'org-todo-blocked
(if really-invisible 'invisible t)
entry))))))
entry))
(defvar org-agenda-skip-function nil
"Function to be called at each match during agenda construction.
If this function returns nil, the current match should not be skipped.
@ -6781,6 +6799,8 @@ The optional argument TYPE tells the agenda type."
(setq list (org-agenda-limit-entries list 'tags max-tags)))
(when max-entries
(setq list (org-agenda-limit-entries list 'org-hd-marker max-entries)))
(when (and org-agenda-dim-blocked-tasks org-blocker-hook)
(setq list (mapcar #'org-agenda--mark-blocked-entry list)))
(mapconcat 'identity list "\n")))
(defun org-agenda-limit-entries (list prop limit &optional fn)