v1.0.0 review fixes: dialog, textarea, scrollbox, demo, ASDF, layout
Fixes from subagent code review (15 findings): CRITICAL runtime bugs: - dialog.lisp: backend-write calls -> draw-rect/draw-text (wrong arg count) - dialog.lisp: removed undefined render-component call - dialog.lisp: toast render backend-write -> draw-text MAJOR data loss / silent failures: - textarea.lisp: undo overflow now drops oldest entry instead of wiping stack - scrollbox.lisp: :background-element -> :bright-black (theme keyword never resolved) ASDF completeness: - modern-tests.lisp wired as component and test-op suite - layout tests added to test-op suite list - markdown suite lookup now uses keyword (was looking up wrong string) - test runner updated to match API cleanup: - container-package: removed duplicate render export - select-package: removed duplicate render export - markdown.lisp: #\Escape -> #\Esc for consistency - textarea.lisp: removed duplicate %split-string defn Demo robustness: - Added unwind-protect for guaranteed terminal cleanup - Uses make-modern-backend constructor - Uses set-raw-mode/restore-terminal-state Layout: - normalize-box handles partial padding specs (was returning all zeros)
This commit is contained in:
111
demo.lisp
111
demo.lisp
@@ -15,28 +15,22 @@
|
||||
(let ((b (read-raw)))
|
||||
(unless b (return-from read-key nil))
|
||||
(case b
|
||||
(#x1b ; ESC — could be Arrow, Escape, or Alt
|
||||
(let ((b2 (read-raw 1)))
|
||||
(#x1b
|
||||
(let ((b2 (read-raw 1)))
|
||||
(unless b2 (return-from read-key :escape))
|
||||
(if (= b2 #x5b) ; ESC [
|
||||
(if (= b2 #x5b)
|
||||
(let ((b3 (read-raw 1)))
|
||||
(case b3
|
||||
(#x41 :up) (#x42 :down)
|
||||
(#x43 :right) (#x44 :left)
|
||||
(#x48 :home) (#x46 :end)
|
||||
(#x5e ; ESC [ N ~
|
||||
(let ((b4 (read-raw 1)))
|
||||
(case b4
|
||||
(#x31 :home) (#x34 :end)
|
||||
(#x35 :page-up) (#x36 :page-down)
|
||||
(t :unknown))))
|
||||
(t :unknown)))
|
||||
(t :unknown))))
|
||||
:unknown)))
|
||||
(#x03 :ctrl-c)
|
||||
(#x0d :enter)
|
||||
(#x09 :tab)
|
||||
(#x7f :backspace)
|
||||
(t (code-char b))))) ; printable
|
||||
(t (code-char b)))))
|
||||
|
||||
;;; ─── Tab content renderers ─────────────────────────────────────────────────
|
||||
|
||||
@@ -59,7 +53,7 @@
|
||||
for pair = (nth i '(("Box" "Bordered containers, title, bg")
|
||||
("Text" "Styled text, word-wrap, spans")
|
||||
("ScrollBox" "Scrollable viewport, scrollbars")
|
||||
("TabBar" "Tab navigation — you're using it!")
|
||||
("TabBar" "Tab navigation you are using")
|
||||
("Select" "Dropdown with fuzzy filter")
|
||||
("Dialog" "Modal overlays + Toast notifs")))
|
||||
do (cl-tty.backend:draw-text be 8 (+ 9 i) (first pair)
|
||||
@@ -72,16 +66,11 @@
|
||||
(cl-tty.backend:draw-text be 8 9 "Metric" :bright-white :default :bold t)
|
||||
(cl-tty.backend:draw-text be 40 9 "Value" :bright-white :default :bold t)
|
||||
(loop for i from 0 below 8
|
||||
for pair = (nth i '(("Versions" "11")
|
||||
("Components" "12")
|
||||
("Tests" "280+")
|
||||
("Lines" "~3060")
|
||||
("Dependencies" "0")
|
||||
("FFI" "0")
|
||||
("ncurses" "no")
|
||||
("License" "TBD")))
|
||||
do (cl-tty.backend:draw-text be 8 (+ 11 i) (first pair)
|
||||
:white :default)
|
||||
for pair = (nth i '(("Versions" "11") ("Components" "12")
|
||||
("Tests" "280+") ("Lines" "~3060")
|
||||
("Dependencies" "0") ("FFI" "0")
|
||||
("ncurses" "no") ("License" "TBD")))
|
||||
do (cl-tty.backend:draw-text be 8 (+ 11 i) (first pair) :white :default)
|
||||
(cl-tty.backend:draw-text be 40 (+ 11 i) (second pair)
|
||||
:bright-green :default :bold t)))
|
||||
|
||||
@@ -102,51 +91,39 @@
|
||||
;;; ─── Main loop ─────────────────────────────────────────────────────────────
|
||||
|
||||
(defun run-demo ()
|
||||
(let* ((be (make-instance 'cl-tty.backend:modern-backend))
|
||||
(tabs '(" Home " " Components " " Stats "))
|
||||
(active 0)
|
||||
(running t))
|
||||
|
||||
(cl-tty.backend:initialize-backend be)
|
||||
(cl-tty.backend:cursor-hide be)
|
||||
|
||||
(loop while running
|
||||
do (cl-tty.backend:backend-clear be)
|
||||
|
||||
;; Title
|
||||
(cl-tty.backend:draw-border be 2 1 76 3 :style :double :title " cl-tty ")
|
||||
(cl-tty.backend:draw-text be 4 2
|
||||
"Interactive demo — navigate with arrows, q to quit"
|
||||
:bright-white :default)
|
||||
|
||||
;; Tabs + content
|
||||
(render-tabs be tabs active)
|
||||
(case active
|
||||
(0 (render-home be))
|
||||
(1 (render-components be))
|
||||
(2 (render-stats be)))
|
||||
|
||||
;; Footer
|
||||
(cl-tty.backend:draw-rect be 2 23 76 1 :bg :blue)
|
||||
(cl-tty.backend:draw-text be 2 23
|
||||
(format nil " Tab ~d/3: ~a "
|
||||
(1+ active) (string-trim " " (nth active tabs)))
|
||||
:bright-white :blue :bold t)
|
||||
|
||||
;; Input
|
||||
(let ((key (read-key)))
|
||||
(case key
|
||||
(:ctrl-c (setf running nil))
|
||||
(:enter (setf running nil))
|
||||
(#\q (setf running nil))
|
||||
(#\Q (setf running nil))
|
||||
(:right (setf active (mod (1+ active) (length tabs))))
|
||||
(:left (setf active (mod (1- active) (length tabs))))
|
||||
(:tab (setf active (mod (1+ active) (length tabs)))))))
|
||||
|
||||
(cl-tty.backend:cursor-show be)
|
||||
(cl-tty.backend:backend-clear be)
|
||||
(cl-tty.backend:shutdown-backend be)))
|
||||
(let* ((raw (find-symbol "SET-RAW-MODE" :cl-tty.input))
|
||||
(restore (find-symbol "RESTORE-TERMINAL-STATE" :cl-tty.input))
|
||||
(saved (funcall raw)))
|
||||
(unwind-protect
|
||||
(let* ((backend (cl-tty.backend:make-modern-backend))
|
||||
(tabs '(" Home " " Components " " Stats "))
|
||||
(active 0) (running t))
|
||||
(cl-tty.backend:initialize-backend backend)
|
||||
(cl-tty.backend:cursor-hide backend)
|
||||
(loop while running
|
||||
do (cl-tty.backend:backend-clear backend)
|
||||
(cl-tty.backend:draw-border backend 2 1 76 3
|
||||
:style :double :title " cl-tty ")
|
||||
(cl-tty.backend:draw-text backend 4 2
|
||||
"Interactive demo arrows: tabs q: quit" :bright-white :default)
|
||||
(render-tabs backend tabs active)
|
||||
(case active
|
||||
(0 (render-home backend))
|
||||
(1 (render-components backend))
|
||||
(2 (render-stats backend)))
|
||||
(cl-tty.backend:draw-rect backend 2 23 76 1 :bg :blue)
|
||||
(cl-tty.backend:draw-text backend 2 23
|
||||
(format nil " Tab ~d/3: ~a "
|
||||
(1+ active) (string-trim " " (nth active tabs)))
|
||||
:bright-white :blue :bold t)
|
||||
(case (read-key)
|
||||
((:ctrl-c :enter #\q #\Q) (setf running nil))
|
||||
((:right :tab) (setf active (mod (1+ active) (length tabs))))
|
||||
(:left (setf active (mod (1- active) (length tabs))))))
|
||||
(cl-tty.backend:cursor-show backend)
|
||||
(cl-tty.backend:backend-clear backend)
|
||||
(cl-tty.backend:shutdown-backend backend))
|
||||
(when saved (funcall restore saved)))))
|
||||
|
||||
;;; ─── Entry ──────────────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
Reference in New Issue
Block a user