135 lines
6.5 KiB
EmacsLisp
135 lines
6.5 KiB
EmacsLisp
;;; layer-reference.el --- State and actions for the layer lab -*- lexical-binding: t; -*-
|
|
|
|
;;; Commentary:
|
|
;; The matching .ebox file owns every layout declaration. Each evaluation
|
|
;; creates independent application state; public Ebox adapters dispatch native
|
|
;; commands and help in the preview buffer and update semantic region IDs.
|
|
|
|
;;; Code:
|
|
|
|
(require 'cl-lib)
|
|
(require 'ebox)
|
|
|
|
(cl-defstruct (layer-demo (:constructor layer-demo-create))
|
|
"Application state belonging to one layer-lab preview."
|
|
(visible t) moved raised (revision 0) (lower-clicks 0)
|
|
menu-visible (placement 0) anchor-moved (selection "none")
|
|
exploded (focus 2) warm)
|
|
|
|
(defun layer-demo-orbit-status (demo)
|
|
"Describe the spatial desktop controls for DEMO."
|
|
(format "%s / %s IN FRONT / %s PALETTE"
|
|
(if (layer-demo-exploded demo) "EXPANDED" "STACKED")
|
|
(aref ["STUDIO" "NEXT" "SIGNAL"] (layer-demo-focus demo))
|
|
(if (layer-demo-warm demo) "SOLAR" "LUNAR")))
|
|
|
|
(defconst layer-demo-placements
|
|
[bottom-start bottom-end top-start top-end]
|
|
"Anchor placements visited by the lab's placement control.")
|
|
|
|
(defun layer-demo-lower-content (demo)
|
|
"Return the covered note's current content for DEMO."
|
|
(format "LOWER REV %02d\nUpdated even while covered.\nReveal me, then click this surface.\nLower activations: %02d\nThe logical note never left the tree."
|
|
(layer-demo-revision demo) (layer-demo-lower-clicks demo)))
|
|
|
|
(defun layer-demo-status (demo)
|
|
"Describe DEMO's currently published panel and menu state."
|
|
(format "A: %s / %s / z=%d | lower rev=%02d | menu: %s / %s | choice: %s"
|
|
(if (layer-demo-visible demo) "shown" "hidden")
|
|
(if (layer-demo-moved demo) "moved" "home")
|
|
(if (layer-demo-raised demo) 4 2)
|
|
(layer-demo-revision demo)
|
|
(if (layer-demo-menu-visible demo) "open" "closed")
|
|
(aref layer-demo-placements (layer-demo-placement demo))
|
|
(layer-demo-selection demo)))
|
|
|
|
(defun layer-demo-help (demo subject)
|
|
"Return live native help for DEMO's SUBJECT."
|
|
(pcase subject
|
|
('lower (format "Lower note revision %d; activated %d times. RET / SPC / click."
|
|
(layer-demo-revision demo) (layer-demo-lower-clicks demo)))
|
|
('menu (format "Menu is %s; placement %s; selected %s. RET / SPC / click."
|
|
(if (layer-demo-menu-visible demo) "open" "closed")
|
|
(aref layer-demo-placements (layer-demo-placement demo))
|
|
(layer-demo-selection demo)))
|
|
(_ (layer-demo-status demo))))
|
|
|
|
(defun layer-demo-action (demo action)
|
|
"Create a native keymap for DEMO's business ACTION."
|
|
(ebox-keymap-create
|
|
:activate
|
|
(lambda ()
|
|
(pcase action
|
|
('explode
|
|
(setf (layer-demo-exploded demo) (not (layer-demo-exploded demo)))
|
|
(let ((expanded (layer-demo-exploded demo)))
|
|
(ebox-region-update "orbit-violet"
|
|
:left (if expanded '(ch 2) '(ch 4))
|
|
:top (if expanded '(lh 1) '(lh 3)))
|
|
(ebox-region-update "orbit-signal"
|
|
:left (if expanded '(ch 26) '(ch 20))
|
|
:top (if expanded '(lh 11) '(lh 7)))
|
|
(ebox-region-update "orbit-lime"
|
|
:left (if expanded '(ch 52) '(ch 46))
|
|
:top (if expanded '(lh 0) '(lh 2)))))
|
|
('focus
|
|
(setf (layer-demo-focus demo) (% (1+ (layer-demo-focus demo)) 3))
|
|
(cl-loop for id in '("orbit-violet" "orbit-lime" "orbit-signal")
|
|
for index from 0
|
|
do (ebox-region-update id :z-index
|
|
(if (= index (layer-demo-focus demo))
|
|
6 (+ index 2)))))
|
|
('mood
|
|
(setf (layer-demo-warm demo) (not (layer-demo-warm demo)))
|
|
(cl-loop for id in '("orbit-violet" "orbit-signal" "orbit-lime")
|
|
for color in (if (layer-demo-warm demo)
|
|
'("#FFADCF" "#FFD49B" "#B8F1CD")
|
|
'("#A99BFF" "#B9E9F2" "#D7FA73"))
|
|
do (ebox-region-update id :background-color color)))
|
|
('toggle
|
|
(setf (layer-demo-visible demo) (not (layer-demo-visible demo)))
|
|
(ebox-region-update "panel-a" :visibility
|
|
(if (layer-demo-visible demo) 'visible 'hidden)))
|
|
('move
|
|
(setf (layer-demo-moved demo) (not (layer-demo-moved demo)))
|
|
(ebox-region-update "panel-a"
|
|
:left (if (layer-demo-moved demo) '(ch 10) '(ch 4))
|
|
:top (if (layer-demo-moved demo) '(lh 0) '(lh 2))))
|
|
('raise
|
|
(setf (layer-demo-raised demo) (not (layer-demo-raised demo)))
|
|
(ebox-region-update "panel-a" :z-index
|
|
(if (layer-demo-raised demo) 4 2)))
|
|
('update-lower
|
|
(cl-incf (layer-demo-revision demo))
|
|
(ebox-region-update "lower-note" :content (layer-demo-lower-content demo)))
|
|
('lower
|
|
(cl-incf (layer-demo-lower-clicks demo))
|
|
(ebox-region-update "lower-note" :content (layer-demo-lower-content demo)))
|
|
('menu
|
|
(setf (layer-demo-menu-visible demo) (not (layer-demo-menu-visible demo)))
|
|
(ebox-region-update "root-menu" :visibility
|
|
(if (layer-demo-menu-visible demo) 'visible 'hidden)))
|
|
('placement
|
|
(setf (layer-demo-placement demo) (% (1+ (layer-demo-placement demo)) 4))
|
|
(ebox-region-update "root-menu" :placement
|
|
(aref layer-demo-placements (layer-demo-placement demo))))
|
|
('anchor
|
|
(setf (layer-demo-anchor-moved demo) (not (layer-demo-anchor-moved demo)))
|
|
(ebox-region-update "menu-trigger" :left
|
|
(if (layer-demo-anchor-moved demo) '(ch 12) '(ch 4))))
|
|
((or 'sage 'amber)
|
|
(setf (layer-demo-selection demo) (symbol-name action)
|
|
(layer-demo-menu-visible demo) nil)
|
|
(ebox-region-update "menu-result" :content
|
|
(format "Selected %s from the anchored menu." action)
|
|
:color (if (eq action 'sage) "#286347" "#895314"))
|
|
(ebox-region-update "root-menu" :visibility 'hidden))
|
|
(_ (error "Unknown layer-lab action: %S" action)))
|
|
(if (memq action '(explode focus mood))
|
|
(ebox-region-update "orbit-state" :content (layer-demo-orbit-status demo))
|
|
(ebox-region-update "layer-status" :content (layer-demo-status demo))))))
|
|
|
|
(provide 'layer-demo-reference)
|
|
|
|
;;; layer-reference.el ends here
|