WIP popup commander
This commit is contained in:
+24
-10
@@ -86,33 +86,47 @@
|
||||
(values f (compile-keymap v))
|
||||
(values f v)))))
|
||||
|
||||
(fn ref [tbl keys]
|
||||
(when tbl
|
||||
(match keys
|
||||
[k1 & more] (ref (. tbl k1) more)
|
||||
[k1] (. tbl k1)
|
||||
x tbl)))
|
||||
|
||||
(let [v (ref {:a 1} [:a])] (assert (= v 1) v))
|
||||
(let [v (ref {:a {:c 7}} [:a :c])] (assert (= v 7) v))
|
||||
(let [v (ref {:a {:c 7}} [:a ])] (assert (match v {:c 7} true) (view v)))
|
||||
(let [v (ref {:a {:c 7}} [:z :d])] (assert (not v) v))
|
||||
|
||||
|
||||
(fn recogniser [source-keymap]
|
||||
(let [keymap (compile-keymap source-keymap)]
|
||||
(var m keymap)
|
||||
(var key-sequence [])
|
||||
{
|
||||
:accept-event
|
||||
(fn [_ e]
|
||||
(when (not (modifier? e.keyval))
|
||||
(let [c (event->index e)]
|
||||
(match (. m c)
|
||||
(table.insert key-sequence c)
|
||||
(match (ref keymap key-sequence)
|
||||
(where v (keymap? v))
|
||||
(do
|
||||
(set m v)
|
||||
(values nil (.. c " ")))
|
||||
(values nil
|
||||
(let [syms (lume.map key-sequence index->string)]
|
||||
(table.concat syms " ")))
|
||||
|
||||
(where v (command? v))
|
||||
(do
|
||||
(set m keymap)
|
||||
(set key-sequence [])
|
||||
v)
|
||||
|
||||
(where nil (= c "103:4"))
|
||||
(do
|
||||
(set m keymap)
|
||||
(set key-sequence [])
|
||||
(values nil "cancelled"))
|
||||
_
|
||||
(do
|
||||
(set m keymap)
|
||||
(values nil (.. "No binding for " (index->string c) " ")))))))
|
||||
(let [syms (lume.map key-sequence index->string)]
|
||||
(set key-sequence [])
|
||||
(values nil (.. "No binding for " (table.concat syms " "))))))))
|
||||
}))
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user