;;; config-dashboard.el --- Generated package (no.5) from my config -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2026 TEC
;;
;; Author: TEC <https://code.tecosaur.net/tec>
;; Maintainer: TEC <contact@tecosaur.net>
;; Created: August 16, 2026
;; Modified: August 16, 2026
;; Version: 2026.08.16
;; Homepage: https://code.tecosaur.net/tec/emacs-config
;; Package-Requires: ((emacs "29.1"))
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;;  Generated package (no.5) from my config.
;;
;;  During generation, dependency on other aspects of my configuration and
;;  packages is inferred via (regexp-based) static analysis.  While this seems
;;  to do a good job, this method is imperfect.  This code likely depends on
;;  utilities provided by Doom, and if you try to run it in isolation you may
;;  discover the code makes more assumptions.
;;
;;  That said, I've found pretty good results so far.
;;
;;; Code:

(require 'fancy-splash)
(require 'splash-phrases)

(defun doom-dashboard-draw-ascii-emacs-banner-fn ()
  (propertize
   (string-join
    '(",---.,-.-.,---.,---.,---."
      "|---'| | |,---||    `---."
      "`---'` ' '`---^`---'`---'")
    "\n")
   'face 'doom-dashboard-banner))

(unless (display-graphic-p) ; for some reason this messes up the graphical splash screen atm
  (setq +dashboard-ascii-banner-fn #'doom-dashboard-draw-ascii-emacs-banner-fn))

(defun +dashboard-setup-modified-keymap ()
  (setq +dashboard-mode-map (make-sparse-keymap))
  (map! :map +dashboard-mode-map
        :desc "Find file" :ng "f" #'find-file
        :desc "Recent files" :ng "r" #'consult-recent-file
        :desc "Config dir" :ng "C" #'doom/open-private-config
        :desc "Open config.org" :ng "c" (cmd! (find-file (expand-file-name "config.org" doom-user-dir)))
        :desc "Open org-mode root" :ng "O" (cmd! (find-file (expand-file-name "lisp/org/" doom-user-dir)))
        :desc "Open dotfile" :ng "." (cmd! (doom-project-find-file "~/.config/"))
        :desc "Notes (roam)" :ng "n" #'org-roam-node-find
        :desc "Switch buffer" :ng "b" #'+vertico/switch-workspace-buffer
        :desc "Switch buffers (all)" :ng "B" #'consult-buffer
        :desc "IBuffer" :ng "i" #'ibuffer
        :desc "Previous buffer" :ng "p" #'previous-buffer
        :desc "Set theme" :ng "t" #'consult-theme
        :desc "Quit" :ng "Q" #'save-buffers-kill-terminal
        :desc "Show keybindings" :ng "h" (cmd! (which-key-show-keymap '+dashboard-mode-map))))

(add-transient-hook! #'+dashboard-mode (+dashboard-setup-modified-keymap))
(add-transient-hook! #'+dashboard-mode :append (+dashboard-setup-modified-keymap))
(add-hook! 'doom-init-ui-hook :append (+dashboard-setup-modified-keymap))

(map! :leader :desc "Dashboard" "d" #'+dashboard/open)

(defun +dashboard-benchmark-line ()
  "Insert the load-time line."
  (when doom-init-time
    (insert "\n\n")
    (+dashboard-insert
     (propertize
      (doom-display-benchmark-h 'return)
      'face '+dashboard-loaded))))

(remove-hook 'doom-after-init-hook #'doom-display-benchmark-h)

(setq +dashboard-functions
      (list #'+dashboard-widget-banner
            #'+dashboard-benchmark-line
            #'splash-phrase-dashboard-insert))

(defun +dashboard-tweak (&optional _)
  (with-current-buffer (get-buffer +dashboard-name)
    (setq-local line-spacing 0.2
                mode-line-format nil
                mode-name ""
                evil-normal-state-cursor (list nil))
    (when (fboundp 'hl-line-mode)
      (hl-line-mode -1))
    ;; (unless (memq 'doom-modeline-time (mapcar #'car face-remapping-alist))
    ;;   (face-remap-add-relative
    ;;    'doom-modeline-time
    ;;    '(mode-line-emphasis bold)))
    ))

(add-hook '+dashboard-mode-hook #'+dashboard-tweak)

(add-hook 'doom-after-init-hook #'+dashboard-tweak 1)

(setq +dashboard-name "► Doom"
      doom-fallback-buffer-name +dashboard-name)

(add-hook 'window-size-change-functions #'fancy-splash-apply-appropriate-image)
(add-hook 'doom-load-theme-hook #'fancy-splash-apply-appropriate-image)

(provide 'config-dashboard)
;;; config-dashboard.el ends here