From 1c1608fe1facb48405c56476acd4863e5a1486b2 Mon Sep 17 00:00:00 2001 From: Daniel Barlow Date: Wed, 21 Dec 2022 18:04:20 +0000 Subject: [PATCH] add invoke-interactively, for use in keymaps move commander widget to Command.widget --- command.fnl | 48 +++++++++++++++++++++++++++++++++++++++++++++--- frame.fnl | 22 ++++++++++------------ test/command.fnl | 11 +++++++++++ 3 files changed, 66 insertions(+), 15 deletions(-) diff --git a/command.fnl b/command.fnl index 3fda039..8dc71bc 100644 --- a/command.fnl +++ b/command.fnl @@ -2,6 +2,7 @@ (local { : view } (require :fennel)) (local commands {}) + (local Buffer (require :buffer)) (fn define-command [name function params] @@ -74,9 +75,13 @@ (do (tset p k input-string) (state-for-next-param c p)) - _ - (do (print "unexpected state " (view state)) - state) + + {:command c :this-param nil :collected-params p} + (do + (state-for-next-param c p)) + + _ (do (print "unexpected state " (view state)) + state) ))) (fn on-input [str] @@ -90,13 +95,50 @@ :default (and param (param)) })) +(fn update-widget-state [w result] + (set w.placeholder_text + (or result.prompt "")) + (set w.sensitive result.active) + (set w.text + (or result.default result.error ""))) + +(local widget + (let [w (Gtk.Entry { + :sensitive false + })] + (tset w :on_activate + (fn [event] + (update-widget-state w (on-input event.text)))) + w)) + (fn activate [] (tset state :active true) + (set widget.sensitive true) + (set widget.text "") + (widget:grab_focus) state) +(fn invoke-interactively [name params] + (let [c (find-command name) + s { + :active true + :command c + :collected-params params + }] + (set state s) + (activate) + (let [r (on-input nil)] + (update-widget-state widget r) + r))) + +(fn active? [] state.active) + { : activate + : active? : define-command : on-input : reset-state + : invoke-interactively + : widget } diff --git a/frame.fnl b/frame.fnl index e6cce8f..1c53ad1 100644 --- a/frame.fnl +++ b/frame.fnl @@ -16,9 +16,6 @@ container (Gtk.Box { :orientation Gtk.Orientation.VERTICAL }) - commander (Gtk.Entry { - :sensitive false - }) progress-bar (Gtk.ProgressBar { :orientation Gtk.Orientation.HORIZONTAL :fraction 1.0 @@ -28,26 +25,28 @@ :orientation Gtk.Orientation.VERTICAL }) ] - (tset commander :on_activate + (tset Command.widget :on_activate (fn [event] (let [result (Command.on-input event.text)] - (set commander.placeholder_text + (set Command.widget.placeholder_text (or result.prompt "")) - (set commander.sensitive result.active) - (set commander.text + (set Command.widget.sensitive result.active) + (set Command.widget.text (or result.default result.error ""))))) (tset window :on_key_release_event (fn [window event] + (when (and (not (Command.active?)) + (= event.keyval (string.byte "g"))) + (Command.invoke-interactively + "visit-location" + {:buffer "main"})) (when (and event.state.MOD1_MASK (= event.keyval (string.byte "x"))) - (set commander.sensitive true) - (set commander.text "") - (commander:grab_focus) (Command.activate)))) (doto container - (: :pack_start commander false false vpad) + (: :pack_start Command.widget false false vpad) (: :pack_start progress-bar false false vpad) (: :pack_start contentwidget true true vpad)) (window:add container) @@ -56,7 +55,6 @@ { :window window :buffer nil - :commander commander :content contentwidget :show-buffer (fn [self b] (each [_ w (pairs (contentwidget:get_children))] diff --git a/test/command.fnl b/test/command.fnl index 1d18d31..e258e2f 100644 --- a/test/command.fnl +++ b/test/command.fnl @@ -31,3 +31,14 @@ (catch x (values nil (view x))))] (assert ok err)) + +(before) +(let [(ok err) + (match + (Command.invoke-interactively + "multiply" + {:a "7" :b "9"}) + (where {:active false} (= happened 63)) true + x (values nil (.. "wrong answer " (view x) " " (view happened))) + nil (values nil "???"))] + (assert ok err))