update docs
This commit is contained in:
+10
-6
@@ -101,7 +101,7 @@
|
||||
Options:
|
||||
- :init - Initial model (required)
|
||||
- :update - (fn [model msg] [new-model cmd]) (required)
|
||||
- :view - (fn [model] hiccup) (required)
|
||||
- :view - (fn [model size] hiccup) where size is {:width w :height h} (required)
|
||||
- :init-cmd - Initial command to run
|
||||
- :fps - Target frames per second (default 60)
|
||||
- :alt-screen - Use alternate screen buffer (default true)
|
||||
@@ -128,8 +128,10 @@
|
||||
(execute-cmd! init-cmd msg-chan))
|
||||
|
||||
;; Initial render
|
||||
(let [initial-view (render/render (view init))]
|
||||
(term/render! initial-view))
|
||||
(let [size (term/get-terminal-size)
|
||||
ctx {:available-height (:height size)
|
||||
:available-width (:width size)}]
|
||||
(term/render! (render/render (view init size) ctx)))
|
||||
|
||||
;; Main loop
|
||||
(loop [model init
|
||||
@@ -151,15 +153,17 @@
|
||||
|
||||
;; Update model
|
||||
(let [[new-model cmd] (update model msg)
|
||||
new-view (render/render (view new-model))
|
||||
size (term/get-terminal-size)
|
||||
ctx {:available-height (:height size)
|
||||
:available-width (:width size)}
|
||||
now (System/currentTimeMillis)]
|
||||
|
||||
;; Execute command
|
||||
(when cmd
|
||||
(execute-cmd! cmd msg-chan))
|
||||
|
||||
;; Render
|
||||
(term/render! new-view)
|
||||
;; Render with context for flex layouts
|
||||
(term/render! (render/render (view new-model size) ctx))
|
||||
|
||||
(recur new-model now))))))
|
||||
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
(ns tui.simple
|
||||
"Simplified TUI runtime - no core.async, works with Babashka.
|
||||
Synchronous event loop, no timers/async commands."
|
||||
(:require [tui.terminal :as term]
|
||||
[tui.input :as input]
|
||||
[tui.render :as render]
|
||||
[tui.ansi :as ansi]))
|
||||
|
||||
;; === Commands ===
|
||||
(def quit [:quit])
|
||||
|
||||
;; === Key Matching ===
|
||||
(defn key=
|
||||
"Check if message is a specific key."
|
||||
[msg key-pattern]
|
||||
(input/key-match? msg key-pattern))
|
||||
|
||||
(defn key-str
|
||||
"Get string representation of key."
|
||||
[msg]
|
||||
(input/key->str msg))
|
||||
|
||||
;; === Simple Run Loop ===
|
||||
(defn run
|
||||
"Run a TUI application (synchronous, no async commands).
|
||||
|
||||
Options:
|
||||
- :init - Initial model (required)
|
||||
- :update - (fn [model msg] [new-model cmd]) (required)
|
||||
- :view - (fn [model size] hiccup) where size is {:width w :height h} (required)
|
||||
- :alt-screen - Use alternate screen buffer (default true)
|
||||
|
||||
Returns the final model."
|
||||
[{:keys [init update view alt-screen]
|
||||
:or {alt-screen true}}]
|
||||
|
||||
;; Setup terminal
|
||||
(term/raw-mode!)
|
||||
(term/init-input!)
|
||||
(when alt-screen (term/alt-screen!))
|
||||
(term/clear!)
|
||||
|
||||
(try
|
||||
;; Initial render
|
||||
(let [size (term/get-terminal-size)
|
||||
ctx {:available-height (:height size)
|
||||
:available-width (:width size)}]
|
||||
(term/render! (render/render (view init size) ctx)))
|
||||
|
||||
;; Main loop - simple synchronous
|
||||
(loop [model init]
|
||||
(if-let [key-msg (input/read-key)]
|
||||
(let [[new-model cmd] (update model key-msg)
|
||||
size (term/get-terminal-size)
|
||||
ctx {:available-height (:height size)
|
||||
:available-width (:width size)}]
|
||||
;; Render with context for flex layouts
|
||||
(term/render! (render/render (view new-model size) ctx))
|
||||
|
||||
;; Check for quit
|
||||
(if (= cmd [:quit])
|
||||
new-model
|
||||
(recur new-model)))
|
||||
(recur model)))
|
||||
|
||||
(finally
|
||||
;; Cleanup
|
||||
(when alt-screen (term/exit-alt-screen!))
|
||||
(term/restore!)
|
||||
(term/close-input!)
|
||||
(println)
|
||||
(flush))))
|
||||
|
||||
;; Re-export render
|
||||
(def render render/render)
|
||||
Reference in New Issue
Block a user