summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2017-05-21 11:08:11 +0200
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2017-05-21 11:08:11 +0200
commit39b3f45a7db6f089f95de34d49f56132438d5648 (patch)
treeec4ab4582060fafb30d618a321fa520e4b1ffbc5
parentddf0063ce79036a086549b18f1e3c2b3eee1e276 (diff)
downloadorg-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.el9
-rw-r--r--testing/lisp/test-org-colview.el82
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