org-clock-agg: refactor nodes / elems

This commit is contained in:
Pavel Korytov 2023-12-05 22:42:04 +03:00
parent 74d4ba8e30
commit b0c9602fce

View file

@ -180,7 +180,7 @@ See `format-seconds' for the list of available format specifiers."
(unless readable-name (unless readable-name
(setq readable-name (symbol-name name))) (setq readable-name (symbol-name name)))
`(progn `(progn
(defun ,func-name (elems) (defun ,func-name (nodes)
,@body) ,@body)
(push (cons ',name '((:function . ,func-name) (push (cons ',name '((:function . ,func-name)
(:readable-name . ,readable-name))) (:readable-name . ,readable-name)))
@ -230,12 +230,12 @@ See `format-seconds' for the list of available format specifiers."
(org-clock-agg-defsort name (org-clock-agg-defsort name
"Sort by name." "Sort by name."
:readable-name "Name" :readable-name "Name"
(seq-sort-by (lambda (elem) (alist-get :name elem)) #'string-lessp elems)) (seq-sort-by (lambda (elem) (alist-get :name elem)) #'string-lessp nodes))
(org-clock-agg-defsort total (org-clock-agg-defsort total
"Sort by total time spent." "Sort by total time spent."
:readable-name "Total time" :readable-name "Total time"
(seq-sort-by (lambda (elem) (alist-get :total elem)) #'> elems)) (seq-sort-by (lambda (elem) (alist-get :total elem)) #'> nodes))
(org-clock-agg-defsort start-time (org-clock-agg-defsort start-time
"Sort by start time." "Sort by start time."
@ -247,7 +247,7 @@ See `format-seconds' for the list of available format specifiers."
(org-clock-agg--ungroup) (org-clock-agg--ungroup)
(mapcar (lambda (row-elem) (alist-get :start row-elem))) (mapcar (lambda (row-elem) (alist-get :start row-elem)))
(seq-min))) (seq-min)))
#'> elem)) #'> nodes))
(org-clock-agg-defsort end-time (org-clock-agg-defsort end-time
"Sort by end time." "Sort by end time."
@ -259,7 +259,7 @@ See `format-seconds' for the list of available format specifiers."
(org-clock-agg--ungroup) (org-clock-agg--ungroup)
(mapcar (lambda (row-elem) (alist-get :end row-elem))) (mapcar (lambda (row-elem) (alist-get :end row-elem)))
(seq-max))) (seq-max)))
#'> elem)) #'> nodes))
(defun org-clock-agg--groupby-apply (alist groups elem) (defun org-clock-agg--groupby-apply (alist groups elem)
(let* ((group-params (car groups)) (let* ((group-params (car groups))
@ -304,9 +304,9 @@ See `format-seconds' for the list of available format specifiers."
res)) res))
(defun org-clock-agg--ungroup (tree) (defun org-clock-agg--ungroup (tree)
(cl-loop for tree-elem in tree (cl-loop for node in tree
append (alist-get :elems tree-elem) append (alist-get :elems node)
append (org-clock-agg--ungroup (alist-get :children elem)))) append (org-clock-agg--ungroup (alist-get :children node))))
(defun org-clock-agg--groupby-sort (tree) (defun org-clock-agg--groupby-sort (tree)
(let* ((sorted-nodes-by-group (let* ((sorted-nodes-by-group
@ -519,7 +519,7 @@ See `format-seconds' for the list of available format specifiers."
(concat (substring string 0 (- max-len 3)) "...") (concat (substring string 0 (- max-len 3)) "...")
string))) string)))
(defun org-clock-agg--render-tree-elem (elem &optional level) (defun org-clock-agg--render-tree-node (node &optional level)
(unless level (unless level
(setq level 1)) (setq level 1))
(let ((level-face (nth (mod (1- level) 8) org-level-faces)) (let ((level-face (nth (mod (1- level) 8) org-level-faces))
@ -528,21 +528,21 @@ See `format-seconds' for the list of available format specifiers."
(insert (insert
(format (format "%%-%ds %%20s %%8s" title-width) (format (format "%%-%ds %%20s %%8s" title-width)
(propertize (org-clock-agg--trim-string (propertize (org-clock-agg--trim-string
(concat level-string " " (car elem)) (concat level-string " " (car node))
title-width) title-width)
'face level-face) 'face level-face)
(propertize (propertize
(alist-get :readable-name (alist-get :groupby (cdr elem))) (alist-get :readable-name (alist-get :groupby (cdr node)))
'face 'org-clock-agg-group-face) 'face 'org-clock-agg-group-face)
(propertize (propertize
(format-seconds (format-seconds
org-clock-agg-duration-format org-clock-agg-duration-format
(alist-get :total (cdr elem))) (alist-get :total (cdr node)))
'face 'org-clock-agg-duration-face)) 'face 'org-clock-agg-duration-face))
"\n")) "\n"))
(mapc (lambda (child) (mapc (lambda (child)
(org-clock-agg--render-tree-elem child (1+ level))) (org-clock-agg--render-tree-node child (1+ level)))
(alist-get :children (cdr elem)))) (alist-get :children (cdr node))))
(defun org-clock-agg--parse-files (files) (defun org-clock-agg--parse-files (files)
(cond ((eq files 'org-agenda) (cond ((eq files 'org-agenda)
@ -567,7 +567,7 @@ See `format-seconds' for the list of available format specifiers."
(search-forward (format "* Results") nil 'noerror) (search-forward (format "* Results") nil 'noerror)
(beginning-of-line) (beginning-of-line)
(delete-region (point) (point-max)) (delete-region (point) (point-max))
(mapc #'org-clock-agg--render-tree-elem tree)))))) (mapc #'org-clock-agg--render-tree-node tree))))))
(defun org-clock-agg (from to files groupby sort sort-order) (defun org-clock-agg (from to files groupby sort sort-order)
(interactive (list -7 0 'org-agenda nil nil nil)) (interactive (list -7 0 'org-agenda nil nil nil))