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
+45 -44
View File
@@ -1,7 +1,8 @@
(ns examples.views
"Multiple views example - demonstrates state machine pattern.
Mirrors bubbletea's views example."
(:require [tui.core :as tui]))
(:require [tui.core :as tui]
[tui.events :as ev]))
;; === Model ===
(def initial-model
@@ -14,58 +15,58 @@
:selected nil})
;; === Update ===
(defn update-model [{:keys [view cursor items] :as model} msg]
(case view
;; Menu view
:menu
(cond
(or (tui/key= msg "q")
(tui/key= msg [:ctrl \c]))
[model tui/quit]
(defn update-fn [{:keys [model event]}]
(let [{:keys [view cursor items]} model]
(case view
;; Menu view
:menu
(cond
(or (ev/key= event \q)
(ev/key= event \c #{:ctrl}))
{:model model :events [(ev/quit)]}
(or (tui/key= msg :up)
(tui/key= msg "k"))
[(update model :cursor #(max 0 (dec %))) nil]
(or (ev/key= event :up)
(ev/key= event \k))
{:model (update model :cursor #(max 0 (dec %)))}
(or (tui/key= msg :down)
(tui/key= msg "j"))
[(update model :cursor #(min (dec (count items)) (inc %))) nil]
(or (ev/key= event :down)
(ev/key= event \j))
{:model (update model :cursor #(min (dec (count items)) (inc %)))}
(tui/key= msg :enter)
[(assoc model
:view :detail
:selected (nth items cursor))
nil]
(ev/key= event :enter)
{:model (assoc model
:view :detail
:selected (nth items cursor))}
:else
[model nil])
:else
{:model model})
;; Detail view
:detail
(cond
(or (tui/key= msg "q")
(tui/key= msg [:ctrl \c]))
[(assoc model :view :confirm) nil]
;; Detail view
:detail
(cond
(or (ev/key= event \q)
(ev/key= event \c #{:ctrl}))
{:model (assoc model :view :confirm)}
(or (tui/key= msg :escape)
(tui/key= msg "b"))
[(assoc model :view :menu :selected nil) nil]
(or (ev/key= event :escape)
(ev/key= event \b))
{:model (assoc model :view :menu :selected nil)}
:else
[model nil])
:else
{:model model})
;; Confirm quit dialog
:confirm
(cond
(tui/key= msg "y")
[model tui/quit]
;; Confirm quit dialog
:confirm
(cond
(ev/key= event \y)
{:model model :events [(ev/quit)]}
(or (tui/key= msg "n")
(tui/key= msg :escape))
[(assoc model :view :detail) nil]
(or (ev/key= event \n)
(ev/key= event :escape))
{:model (assoc model :view :detail)}
:else
[model nil])))
:else
{:model model}))))
;; === Views ===
(defn menu-view [{:keys [cursor items]}]
@@ -112,6 +113,6 @@
(defn -main [& _args]
(println "Starting views demo...")
(tui/run {:init initial-model
:update update-model
:update update-fn
:view view})
(println "Views demo finished."))