diff options
author | Nicolas Goaziou <mail@nicolasgoaziou.fr> | 2017-05-21 11:08:11 +0200 |
---|---|---|
committer | Nicolas Goaziou <mail@nicolasgoaziou.fr> | 2017-05-21 11:08:11 +0200 |
commit | 39b3f45a7db6f089f95de34d49f56132438d5648 (patch) | |
tree | ec4ab4582060fafb30d618a321fa520e4b1ffbc5 | |
parent | ddf0063ce79036a086549b18f1e3c2b3eee1e276 (diff) | |
download | org-mode-39b3f45a7db6f089f95de34d49f56132438d5648.tar.gz |
org-colview: Fix {X%} and {X/} on recursive summaries
* lisp/org-colview.el (org-columns--summary-checkbox-count):
(org-columns--summary-checkbox-percent): Handle own output for higher
level summaries.
* testing/lisp/test-org-colview.el (test-org-colview/columns-summary):
Add tests.
-rw-r--r-- | lisp/org-colview.el | 9 | ||||
-rw-r--r-- | testing/lisp/test-org-colview.el | 82 |
2 files changed, 88 insertions, 3 deletions
diff --git a/lisp/org-colview.el b/lisp/org-colview.el index d8c7bb4..43922ad 100644 --- a/lisp/org-colview.el +++ b/lisp/org-colview.el @@ -1234,14 +1234,17 @@ When PRINTF is non-nil, use it to format the result." (defun org-columns--summary-checkbox-count (check-boxes _) "Summarize CHECK-BOXES with a check-box cookie." (format "[%d/%d]" - (cl-count "[X]" check-boxes :test #'equal) + (cl-count-if (lambda (b) (or (equal b "[X]") + (string-match-p "\\[\\([1-9]\\)/\\1\\]" b))) + check-boxes) (length check-boxes))) (defun org-columns--summary-checkbox-percent (check-boxes _) "Summarize CHECK-BOXES with a check-box percent." (format "[%d%%]" - (round (* 100.0 (cl-count "[X]" check-boxes :test #'equal)) - (float (length check-boxes))))) + (round (* 100.0 (cl-count-if (lambda (b) (member b '("[X]" "[100%]"))) + check-boxes)) + (length check-boxes)))) (defun org-columns--summary-min (values printf) "Compute the minimum of VALUES. diff --git a/testing/lisp/test-org-colview.el b/testing/lisp/test-org-colview.el index 84bac8f..82e78a0 100644 --- a/testing/lisp/test-org-colview.el +++ b/testing/lisp/test-org-colview.el @@ -340,6 +340,88 @@ :END:" (let ((org-columns-default-format "%A{X%}")) (org-columns)) (get-char-property (point) 'org-columns-value-modified)))) + ;; {X/} handles recursive summaries. + (should + (equal + "[1/2]" + (org-test-with-temp-text + "* H +** S1 +:PROPERTIES: +:A: [ ] +:END: +** S2 +*** S21 +:PROPERTIES: +:A: [X] +:END: +*** S22 +:PROPERTIES: +:A: [X] +:END:" + (let ((org-columns-default-format "%A{X/}")) (org-columns)) + (get-char-property (point) 'org-columns-value-modified)))) + (should + (equal + "[1/2]" + (org-test-with-temp-text + "* H +** S1 +:PROPERTIES: +:A: [X] +:END: +** S2 +*** S21 +:PROPERTIES: +:A: [ ] +:END: +*** S22 +:PROPERTIES: +:A: [ ] +:END:" + (let ((org-columns-default-format "%A{X/}")) (org-columns)) + (get-char-property (point) 'org-columns-value-modified)))) + ;; {X%} handles recursive summaries. + (should + (equal + "[50%]" + (org-test-with-temp-text + "* H +** S1 +:PROPERTIES: +:A: [ ] +:END: +** S2 +*** S21 +:PROPERTIES: +:A: [X] +:END: +*** S22 +:PROPERTIES: +:A: [X] +:END:" + (let ((org-columns-default-format "%A{X%}")) (org-columns)) + (get-char-property (point) 'org-columns-value-modified)))) + (should + (equal + "[50%]" + (org-test-with-temp-text + "* H +** S1 +:PROPERTIES: +:A: [X] +:END: +** S2 +*** S21 +:PROPERTIES: +:A: [ ] +:END: +*** S22 +:PROPERTIES: +:A: [ ] +:END:" + (let ((org-columns-default-format "%A{X%}")) (org-columns)) + (get-char-property (point) 'org-columns-value-modified)))) ;; {min} is the smallest number in column, {max} the largest one. ;; {mean} is the arithmetic mean of numbers in column. (should |