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