update examples. fix bugs
This commit is contained in:
+33
-31
@@ -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."))
|
||||
|
||||
Reference in New Issue
Block a user