From 3f3396f1877c6027a5516856030888fee97bfa69 Mon Sep 17 00:00:00 2001 From: Christian Cunningham Date: Fri, 14 Jun 2024 16:33:23 -0700 Subject: Consolidate Button Layouts --- elchemy-dashboard.el | 48 +++++++++++++++++++++++++----------------------- elchemy-functions.el | 24 ++++++++++++++++++++++-- elchemy-user.el | 2 ++ 3 files changed, 49 insertions(+), 25 deletions(-) diff --git a/elchemy-dashboard.el b/elchemy-dashboard.el index 6e8b0ae..eee2808 100644 --- a/elchemy-dashboard.el +++ b/elchemy-dashboard.el @@ -14,16 +14,9 @@ (add-text-properties start (point) '(face (:height 4.0)))) (insert "\n\n") - (dotimes (i (length elchemy/dashboard/heading-buttons)) - (let* ((button (nth i elchemy/dashboard/heading-buttons)) - (title (car button)) - (callback (cdr button))) - (insert (buttonize title callback)) - (if (eq (% (+ i 1) elchemy/dashboard/heading-columns) 0) - (insert "\n") - (insert (format (concat "%-" (format "%d" (+ (- elchemy/dashboard/heading-max-length (length title)) elchemy/dashboard/heading-padding)) "s") " "))))) - (unless (eq (% (length elchemy/dashboard/heading-buttons) elchemy/dashboard/heading-columns) 0) - (insert "\n")) + (elchemy/display-tabular-button-alist + elchemy/dashboard/heading-buttons + elchemy/dashboard/heading-columns elchemy/dashboard/heading-padding) (insert "\n\n") (when (file-exists-p (concat elchemy/elchemy-root elchemy/elchemy-projects-file)) (let ((start (point))) @@ -31,11 +24,10 @@ (add-text-properties start (point) '(face (:height 1.5)))) (insert "\n") - (mapcar #'(lambda (x) (let ((name (car x)) - (path (cdr x))) - (insert (buttonize name (lambda (y) (elchemy/find-file y)) path) "\n"))) - (elchemy/read-alist-file (concat elchemy/elchemy-root elchemy/elchemy-projects-file))) - (insert "\n")) + (elchemy/display-tabular-button-alist + (elchemy/read-alist-file (concat elchemy/elchemy-root elchemy/elchemy-projects-file)) + elchemy/dashboard/projects-columns elchemy/dashboard/projects-padding) + (insert "\n")) (ignore-errors (setq agenda-items (mapcar #'(lambda (x) (elchemy/get-agenda-items x 3)) elchemy/dashboard-agenda-titles) agenda-max-count (apply 'max (mapcar #'(lambda (x) (length x)) agenda-items)) @@ -45,11 +37,7 @@ (add-text-properties start (point) '(face (:height 1.5)))) (insert "\n") - (let ((start (point))) - (insert (apply 'format (concat "%-" (format "%d" (+ agenda-max-length elchemy/dashboard-agenda-padding)) "s" "%-" (format "%d" (+ agenda-max-length elchemy/dashboard-agenda-padding)) "s" "%-" (format "%d" (+ agenda-max-length elchemy/dashboard-agenda-padding)) "s") elchemy/dashboard-agenda-titles)) - (add-text-properties start (point) - '(face (:weight bold :slant italic :foreground "red")))) - (insert "\n") + (insert (apply 'format (concat "%-" (format "%d" (+ agenda-max-length elchemy/dashboard-agenda-padding)) "s" "%-" (format "%d" (+ agenda-max-length elchemy/dashboard-agenda-padding)) "s" "%s\n") elchemy/dashboard-agenda-titles)) (dotimes (i agenda-max-count) (insert (format (concat "%-" (format "%d" (+ agenda-max-length elchemy/dashboard-agenda-padding)) "s") @@ -58,11 +46,25 @@ (concat "%-" (format "%d" (+ agenda-max-length elchemy/dashboard-agenda-padding)) "s") (elchemy/replace-nil (nth i (nth 1 agenda-items))))) (insert (format - (concat "%-" (format "%d" (+ agenda-max-length elchemy/dashboard-agenda-padding)) "s") + "%s" (elchemy/replace-nil (nth i (nth 2 agenda-items))))) (insert "\n") - )) - (insert "\n") + ) + (insert "\n") + (let ((start (point))) + (insert "Overdue") + (add-text-properties start (point) + '(face (:height 1.5)))) + (insert "\n") + (insert (elchemy/format-processed-agenda (mapcar 'elchemy/process-agenda-heading (org-ql-select (org-agenda-files) `(and (todo "STRT" "WAIT" "TODO" "CYCL") (ts :from ,(- elchemy/schedule-lookahead) :to today)) :sort '(todo priority date))))) + (insert "\n") + (let ((start (point))) + (insert "Upcoming") + (add-text-properties start (point) + '(face (:height 1.5)))) + (insert "\n") + (insert (elchemy/format-processed-agenda (mapcar 'elchemy/process-agenda-heading (org-ql-select (org-agenda-files) `(and (todo "STRT" "WAIT" "TODO" "CYCL") (ts :from today :to ,elchemy/schedule-lookahead)) :sort '(todo priority date))))) + (insert "\n")) (let ((start (point))) (insert "Command Reference") (add-text-properties start (point) diff --git a/elchemy-functions.el b/elchemy-functions.el index 7a27356..57663b2 100644 --- a/elchemy-functions.el +++ b/elchemy-functions.el @@ -91,7 +91,27 @@ Returns '((:raw-value . ) (:level ) (:priority "Format a processed agenda to a string: [PRIORITY] TODO-KEYWORD: HEADING ~ SCHEDULED" (apply #'concat (mapcar #'(lambda (x) - (concat (format "[%c] " (elchemy/format-priority (cdr (assoc :priority x)))) (cdr (assoc :todo-keyword x)) ": " (cdr (assoc :raw-value x)) " ~ " (cdr (assoc :scheduled x)) "\n")) - agenda-list))) + (concat (format "[%c] " (elchemy/format-priority (cdr (assoc :priority x)))) (cdr (assoc :todo-keyword x)) ": " (cdr (assoc :raw-value x)) " ~ " (cdr (assoc :scheduled x)) "\n")) + agenda-list))) + +(defun elchemy/display-tabular-button-alist (ALIST &optional columns padding) + "Display a Button Alist as a Table" + (unless columns + (setq columns 1)) + (unless padding + (setq padding 0)) + (let* ((colwidth (+ padding (apply 'max (mapcar #'(lambda (x) (length (car x))) ALIST))))) + (dotimes (i (length ALIST)) + (let* ((elem (nth i ALIST)) + (name (car elem)) + (callback (cdr elem))) + (insert (buttonize name callback)) + (message "%s\n" columns) + (if (eq (% (+ i 1) columns) 0) + (insert "\n") + (insert (format (concat "%" (format "%ds" (- colwidth (length name)))) " "))) + )) + (unless (eq (% (length ALIST) columns) 0) + (insert "\n")))) (provide 'elchemy-functions) diff --git a/elchemy-user.el b/elchemy-user.el index dee91b6..2d9d1d2 100644 --- a/elchemy-user.el +++ b/elchemy-user.el @@ -20,6 +20,8 @@ ) elchemy/dashboard/heading-max-length (apply #'max (mapcar #'(lambda (x) (length (car x))) elchemy/dashboard/heading-buttons)) elchemy/dashboard/heading-padding 2 + elchemy/dashboard/projects-columns 4 + elchemy/dashboard/projects-padding 2 elchemy/dashboard-agenda-padding 2) ;; General Settings -- cgit v1.2.1