summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Dominik <carsten.dominik@gmail.com>2009-02-19 11:12:52 +0100
committerCarsten Dominik <carsten.dominik@gmail.com>2009-02-19 11:12:52 +0100
commit06056781fef0df592c3cf974807092c896227723 (patch)
tree15f6ef244ca0d01d2b4c90d43dd05ce50c572ff0
parentfa54d8104a4fa84924c1ce13cd8153b12c10f110 (diff)
downloadorg-mode-06056781fef0df592c3cf974807092c896227723.tar.gz
Agenda: Do not make tasks invisible if they are blocked by checkboxes.
John Rakestraw writes: > I noticed today that, at least in my set-up, setting these variables > this way: > > (setq org-agenda-dim-blocked-tasks 'invisible) > (setq org-enforce-todo-checkbox-dependencies t) > > means that a TODO task with checkboxes doesn't get included in the > agenda. However, the sub-tasks in the checkbox list don't get included, > either. So the TODO task with checkboxes doesn't show up in the agenda. > > It makes sense given the way the variables work. However, I wonder if > it makes more sense for a task with checklisted sub-tasks to be > included in the agenda so that the tasks and sub-tasks don't get lost. > Or, to put the point slightly differently, I think that a TODO that's > blocked because it has dependent TODOs might be treated differently in > agenda listings than a TODO that's blocked because it has dependent > checklist items. > > Not a big deal to me because I don't typically use checkboxes for TODO > items. But I thought I'd raise it for consideration. I agree with this view and the commit implements exactly this.
-rwxr-xr-xlisp/ChangeLog8
-rw-r--r--lisp/org-agenda.el28
-rw-r--r--lisp/org.el6
3 files changed, 31 insertions, 11 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 0dd8ac0..bd7c5cd 100755
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,8 +1,14 @@
2009-02-19 Carsten Dominik <carsten.dominik@gmail.com>
+ * org.el (org-block-todo-from-checkboxes): Announce that
+ checkboxes are the culprit.
+
* org-agenda.el (org-agenda-show-1): Renamed from
`org-agenda-show'.
- (org-agenda-show): Re-install the old version ofr now.
+ (org-agenda-show): Re-install the old version for now.
+ (org-agenda-dim-blocked-tasks): Update docstring. Scope a
+ variable into the blokker hook, so that the checkbox checker can
+ anounce that it caused the blocking.
* org.el (org-track-ordered-property-with-tag): New option.
(org-toggle-ordered-property): Honor
diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
index f649deb..625ff15 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -523,12 +523,19 @@ deadlines are always turned off when the item is DONE."
(defcustom org-agenda-dim-blocked-tasks t
"Non-nil means, dim blocked tasks in the agenda display.
-This causes some overhead during agenda construction, but if you have turned
-on `org-enforce-todo-dependencies' or any other blocking mechanism, this
-will create useful feedback in the agenda.
-Instead ot t, this variable can also have the value `invisible'. Then
-blocked tasks will be invisible and only become visible when they
-become unblocked."
+This causes some overhead during agenda construction, but if you
+have turned on `org-enforce-todo-dependencies',
+`org-enforce-todo-checkbox-dependencies', or any other blocking
+mechanism, this will create useful feedback in the agenda.
+
+Instead ot t, this variable can also have the value `invisible'.
+Then blocked tasks will be invisible and only become visible when
+they become unblocked. An exemption to this behavior is when a task is
+blocked because of unchecked checkboxes below it. Since checkboxes do
+not show up in the agenda views, making this task invisible you remove any
+trace from agenda views that there is something to do. Therefore, a task
+that is blocked because of checkboxes will never be made invisible, it
+will only be dimmed."
:group 'org-agenda-daily/weekly
:group 'org-agenda-todo-list
:type '(choice
@@ -2206,10 +2213,12 @@ VALUE defaults to t."
(let ((inhibit-read-only t)
(org-depend-tag-blocked nil)
(invis (eq org-agenda-dim-blocked-tasks 'invisible))
- b e p ov h l)
+ org-blocked-by-checkboxes
+ invis1 b e p ov h l)
(goto-char (point-min))
(while (let ((pos (next-single-property-change (point) 'todo-state)))
(and pos (goto-char (1+ pos))))
+ (setq org-blocked-by-checkboxes nil invis1 invis)
(let ((marker (get-text-property (point) 'org-hd-marker)))
(when (and marker
(not (with-current-buffer (marker-buffer marker)
@@ -2221,10 +2230,11 @@ VALUE defaults to t."
:position marker
:from 'todo
:to 'done))))))
- (setq b (if invis (max (point-min) (1- (point))) (point))
+ (if org-blocked-by-checkboxes (setq invis1 nil))
+ (setq b (if invis1 (max (point-min) (1- (point))) (point))
e (point-at-eol)
ov (org-make-overlay b e))
- (if invis
+ (if invis1
(org-overlay-put ov 'invisible t)
(org-overlay-put ov 'face 'org-agenda-dimmed-todo-face))
(org-overlay-put ov 'org-type 'org-blocked-todo)))))))
diff --git a/lisp/org.el b/lisp/org.el
index cca1aea..9b12d38 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -8748,6 +8748,7 @@ See variable `org-track-ordered-property-with-tag'."
(and tag (org-toggle-tag tag 'on))
(message "Subtasks must be completed in sequence")))))
+(defvar org-blocked-by-checkboxes) ; dynamically scoped
(defun org-block-todo-from-checkboxes (change-plist)
"Block turning an entry into a TODO, using checkboxes.
This checks whether the current task should be blocked from state
@@ -8770,7 +8771,10 @@ changes because there are uncheckd boxes in this entry."
(goto-char beg)
(if (re-search-forward "^[ \t]*\\([-+*]\\|[0-9]+[.)]\\)[ \t]+\\[[- ]\\]"
end t)
- (throw 'dont-block nil))))
+ (progn
+ (if (boundp 'org-blocked-by-checkboxes)
+ (setq org-blocked-by-checkboxes t))
+ (throw 'dont-block nil)))))
t)) ; do not block
(defun org-update-parent-todo-statistics ()