From 39b3f45a7db6f089f95de34d49f56132438d5648 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Sun, 21 May 2017 11:08:11 +0200 Subject: [PATCH] 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. --- lisp/org-colview.el | 9 +++-- 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 d8c7bb4d5..43922ad29 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 84bac8f38..82e78a0d3 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 -- 2.11.4.GIT