theurgy/screens/dashboard.el
2025-08-17 23:40:44 +08:00

149 lines
4.6 KiB
EmacsLisp

;;; dashboard.el --- A grid-based dashboard -*- lexical-binding: t -*-
;; Author: Jakub
;; Maintainer: Jakub
;; Version: 1.0
;; Package-Requires: (grid straight)
;; This file is not part of GNU Emacs
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
;; commentary
;;; Code:
;; For layout
(require 'grid)
(defvar enlight-theurgy-logo
(propertize
"\n\n\n\n ###########
##### ##### #####
#### ## ### ####
### ### ## ###
## ### ### ##
## ############### ##
### ## ### ### ## ###
## ##### ##### ##
## ## ## ## ## ##
### ### ### ### ## ###
##### # ### ### # #####
#############################
### ###
#### ####
##### #####
########### "
'face 'font-lock-keyword-face))
(defvar enlight-calendar
(progn
(calendar)
(prog1 (with-current-buffer (buffer-name (current-buffer))
(buffer-string))
(calendar-exit))))
(defun get-weather ()
"Get the weather JSON for THEURGY-CITY."
(let ((buf (url-retrieve-synchronously (concat "https://wttr.in/" theurgy-city "?format=j1"))))
(when buf
(with-current-buffer buf
;; Skip HTTP headers
(goto-char (point-min))
(re-search-forward "\n\n" nil 'move)
(delete-region (point-min) (point))
;; Now display it
(switch-to-buffer buf)
(buffer-string)))))
(defun connected-p ()
"Are we connected to the host?"
(= 0 (call-process-shell-command "ping -W 5 -c 2 wttr.in")))
(defun enlight-weather ()
(if (connected-p)
(progn (let ((weather (aref (gethash "current_condition"
(json-parse-string (get-weather) :object-type 'hash-table)) 0)))
(concat (propertize "Weather\n\n" 'face 'font-lock-keyword-face)
"Currently " (gethash "value" (aref (gethash "weatherDesc" weather) 0)) "\n"
"It is " (gethash "temp_C" weather) " degrees, feels like " (gethash "FeelsLikeC" weather) "\n"
"Wind speed is " (gethash "windspeedKmph" weather) "km/h\n")))
(concat (propertize "Weather\n\n" 'face 'font-lock-keyword-face)
"No connection to weather service :(")))
;; Dashboard screen using enlight
(use-package enlight
:custom
(enlight-content
(concat
(grid-get-box `(:align center :content ,enlight-theurgy-logo :width 80))
(grid-get-row
(list
(grid-get-box
`(:content ,(concat
(grid-get-box
`( :content
,(concat
(grid-get-box `( :content ,(propertize "Theurgy Emacs" 'face 'variable-pitch-serif-text)
:width 80 :align center)))
:width 80))
enlight-calendar "\n\n"
(grid-get-row
(list (grid-get-box `(:content ,(concat
(enlight-menu
'(("Exobrain"
("Agenda" (org-agenda nil "a") "a")
("Go to Inbox" open-inbox "i")
("Capture" org-capture "c")))))
:align left
:width 20))
(grid-get-box `(:content ,(concat
(enlight-menu
'(("Projects"
("Open" open-project "o")
("Project List" open-inbox "p")))))
:align center
:width 20))
(grid-get-box `(:content ,(concat
(enlight-menu
'(("Userland"
("Dired" (dired "~") "d")
("RSS" elfeed "r")
("Terminal" theurgy-bottom-shell "t")
("Weather" theurgy-show-weather "w")))))
:align center
:width 20))
(grid-get-box `(:content ,(concat
(enlight-menu
'(("Meta"
("Elisp Scratch" open-elisp-scratch "s")
("Org Scratch" open-org-scratch "o")
("Init Dir" (dired user-emacs-directory) "e")
("Info" info "h")))))
:align right
:width 20)))))
))
))
;(grid-get-box `(:content ,(enlight-weather) :align center))
)))
(setopt initial-buffer-choice #'enlight)
(provide 'dashboard)
;;; dashboard.el ends here