summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elchemy-dashboard.el48
-rw-r--r--elchemy-functions.el24
-rw-r--r--elchemy-user.el2
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 . <Heading Text>) (:level <Org Heading 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