ebox-playground/examples/layer-reference.el
Kinneyzhang db41a9b769 Batch ORBIT actions and add reusable scroll performance checks
Coalesce action updates, retain native interaction behavior and validate complete mixed action cycles against fresh rendering.

Extend the shared evaluator with committed-input parity, nested owner selection, cold prefix measurements and GC counters. Document supported invocations and test cleanup and failure reporting.
2026-09-10 23:15:16 +08:00

146 lines
7.0 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 ()
(ebox-call-with-update-batch
(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