;;; packages.el --- Spacemacs UI Visual Layer packages File
;;
;; Copyright (c) 2012-2022 Sylvain Benner & Contributors
;;
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; 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 <http://www.gnu.org/licenses/>.


(setq spacemacs-visual-packages
      '(
        all-the-icons
        (ansi-colors :location built-in)
        desktop
        ;; `display-fill-column-indicator' is available in Emacs 27+
        (display-fill-column-indicator :location built-in
                                       :toggle (boundp 'display-fill-column-indicator))
        (fill-column-indicator :toggle (not (boundp 'display-fill-column-indicator)))
        hl-todo
        popup
        popwin
        posframe
        (zoom-frm :location local)))

(defun spacemacs-visual/init-all-the-icons ()
  (use-package all-the-icons
    :defer t))

(defun spacemacs-visual/init-ansi-colors ()
  (add-hook 'compilation-filter-hook
            'spacemacs-visual//compilation-buffer-apply-ansi-colors))

(defun spacemacs-visual/init-desktop ()
  (use-package desktop
    :defer t
    :init
    (setq desktop-dirname spacemacs-cache-directory)
    :config
    (add-to-list 'desktop-path spacemacs-cache-directory)))

(defun spacemacs-visual/init-display-fill-column-indicator ()
  (spacemacs|add-toggle fill-column-indicator
    :mode display-fill-column-indicator-mode
    :documentation "Display the fill column indicator."
    :evil-leader "tf")
  (spacemacs|add-toggle fill-column-indicator-globally
    :mode global-display-fill-column-indicator-mode
    :documentation "Display the fill column indicator globally."
    :evil-leader "t C-f")
  (with-eval-after-load 'display-fill-column-indicator
    ;; manually register the minor mode since it does not define any
    ;; lighter
    (add-to-list 'minor-mode-alist '(display-fill-column-indicator-mode ""))
    (spacemacs|diminish display-fill-column-indicator-mode " ⓕ" " f")))

(defun spacemacs-visual/init-fill-column-indicator ()
  (use-package fill-column-indicator
    :defer t
    :spacediminish ((fci-mode " ⓕ" " f"))
    :init
    (progn
      (setq fci-rule-width 1)
      ;; manually register the minor mode since it does not define any
      ;; lighter
      (add-to-list 'minor-mode-alist '(fci-mode ""))
      (spacemacs|add-toggle fill-column-indicator
        :status fci-mode
        :on (turn-on-fci-mode)
        :off (turn-off-fci-mode)
        :documentation "Display the fill column indicator."
        :evil-leader "tf"))))

(defun spacemacs-visual/init-hl-todo ()
  (use-package hl-todo
    :defer t
    :init
    ;; global hook activates hl-todo-mode for prog-mode, text-mode
    ;; mode can be explicitly defined using hl-todo-activate-in-modes variable
    (global-hl-todo-mode 1)))

(defun spacemacs-visual/init-popup ())

(defun spacemacs-visual/init-posframe ()
  (use-package posframe :defer t))

(defun spacemacs-visual/init-popwin ()
  (use-package popwin
    :config
    (progn
      (popwin-mode 1)
      (spacemacs/set-leader-keys "wpm" 'popwin:messages)
      (spacemacs/set-leader-keys "wpp" 'popwin:close-popup-window)
      (spacemacs/set-leader-keys "rw" 'spacemacs/last-popwin)

      ;; don't use default value but manage it ourselves
      (setq popwin:special-display-config nil)

      ;; buffers that we manage
      (push '("*quickrun*"             :dedicated t :position bottom :stick t :noselect t   :height 0.3) popwin:special-display-config)
      (push '("*Help*"                 :dedicated t :position bottom :stick t :noselect t   :height 0.4) popwin:special-display-config)
      (push '("*Process List*"         :dedicated t :position bottom :stick t :noselect nil :height 0.4) popwin:special-display-config)
      (push '(compilation-mode         :dedicated nil :position bottom :stick t :noselect t   :height 0.4) popwin:special-display-config)
      (push '(dap-server-log-mode      :dedicated nil :position bottom :stick t :noselect t   :height 0.4) popwin:special-display-config)
      (push '("*Shell Command Output*" :dedicated t :position bottom :stick t :noselect nil            ) popwin:special-display-config)
      (push '("*Async Shell Command*"  :dedicated t :position bottom :stick t :noselect nil            ) popwin:special-display-config)
      (push '("*undo-tree*"            :dedicated t :position right  :stick t :noselect nil :width   60) popwin:special-display-config)
      (push '("*undo-tree Diff*"       :dedicated t :position bottom :stick t :noselect nil :height 0.3) popwin:special-display-config)
      (push '("*ert*"                  :dedicated t :position bottom :stick t :noselect nil            ) popwin:special-display-config)
      (push '("*grep*"                 :dedicated t :position bottom :stick t :noselect nil            ) popwin:special-display-config)
      (push '("*nosetests*"            :dedicated t :position bottom :stick t :noselect nil            ) popwin:special-display-config)
      (push '("^\*WoMan.+\*$" :regexp t             :position bottom                                   ) popwin:special-display-config)
      (push '("*Google Translate*"     :dedicated t :position bottom :stick t :noselect t   :height 0.4) popwin:special-display-config)

      (advice-add 'popwin:match-config :around #'spacemacs/advice-popwin))))

(defun spacemacs-visual/init-zoom-frm ()
  (use-package zoom-frm
    :commands (zoom-frm-unzoom
               zoom-frm-out
               zoom-frm-in)
    :init
    (progn
      (spacemacs|define-transient-state zoom-frm
        :title "Zoom Frame Transient State"
        :doc "
[_+_/_=_/_k_] zoom frame in   [_m_] max frame
[_-_/___/_j_] zoom frame out  [_f_] fullscreen
[_0_]^^^^     reset zoom      [_q_] quit"
        :bindings
        ("+" spacemacs/zoom-frm-in)
        ("=" spacemacs/zoom-frm-in)
        ("k" spacemacs/zoom-frm-in)
        ("-" spacemacs/zoom-frm-out)
        ("_" spacemacs/zoom-frm-out)
        ("j" spacemacs/zoom-frm-out)
        ("0" spacemacs/zoom-frm-unzoom)
        ("f" spacemacs/toggle-frame-fullscreen-non-native)
        ("m" spacemacs/toggle-maximize-frame)
        ("q" nil :exit t))
      (spacemacs/set-leader-keys "zf" 'spacemacs/zoom-frm-transient-state/body)

      ;; Font size, either with ctrl + mouse wheel
      (global-set-key (kbd "<C-wheel-up>") 'spacemacs/zoom-frm-in)
      (global-set-key (kbd "<C-wheel-down>") 'spacemacs/zoom-frm-out))))
