update examples. fix bugs

This commit is contained in:
2026-02-03 12:53:52 -05:00
parent 9150c90ad1
commit 426a0c4715
15 changed files with 867 additions and 1148 deletions
+33 -31
View File
@@ -1,7 +1,8 @@
(ns examples.spinner
"Spinner example - demonstrates animated loading states.
Mirrors bubbletea's spinner example."
(:require [tui.core :as tui]))
(:require [tui.core :as tui]
[tui.events :as ev]))
;; === Spinner Frames ===
(def spinner-styles
@@ -21,42 +22,43 @@
:style :dots
:loading true
:message "Loading..."
:styles (keys spinner-styles)
:styles (vec (keys spinner-styles))
:style-idx 0})
;; === Update ===
(defn update-model [{:keys [styles style-idx] :as model} msg]
(cond
;; Quit
(or (tui/key= msg "q")
(tui/key= msg [:ctrl \c]))
[model tui/quit]
(defn update-fn [{:keys [model event]}]
(let [{:keys [styles style-idx]} model]
(cond
;; Quit
(or (ev/key= event \q)
(ev/key= event \c #{:ctrl}))
{:model model :events [(ev/quit)]}
;; Spinner frame - advance animation
(= msg :spinner-frame)
(if (:loading model)
[(update model :frame inc) (tui/after 80 :spinner-frame)]
[model nil])
;; Spinner frame - advance animation
(= (:type event) :spinner-frame)
(if (:loading model)
{:model (update model :frame inc)
:events [(ev/delayed-event 80 {:type :spinner-frame})]}
{:model model})
;; Space - simulate completion
(tui/key= msg " ")
[(assoc model :loading false :message "Done!") nil]
;; Space - simulate completion
(ev/key= event \space)
{:model (assoc model :loading false :message "Done!")}
;; Tab - change spinner style
(tui/key= msg :tab)
(let [new-idx (mod (inc style-idx) (count styles))]
[(assoc model
:style-idx new-idx
:style (nth styles new-idx))
nil])
;; Tab - change spinner style
(ev/key= event :tab)
(let [new-idx (mod (inc style-idx) (count styles))]
{:model (assoc model
:style-idx new-idx
:style (nth styles new-idx))})
;; r - restart
(tui/key= msg "r")
[(assoc model :loading true :frame 0 :message "Loading...")
(tui/after 80 :spinner-frame)]
;; r - restart
(ev/key= event \r)
{:model (assoc model :loading true :frame 0 :message "Loading...")
:events [(ev/delayed-event 80 {:type :spinner-frame})]}
:else
[model nil]))
:else
{:model model})))
;; === View ===
(defn spinner-view [{:keys [frame style]}]
@@ -84,7 +86,7 @@
(defn -main [& _args]
(println "Starting spinner...")
(tui/run {:init initial-model
:update update-model
:update update-fn
:view view
:init-cmd (tui/after 80 :spinner-frame)})
:init-events [(ev/delayed-event 80 {:type :spinner-frame})]})
(println "Spinner demo finished."))