diff --git a/Nasal/prop-key-handler.nas b/Nasal/prop_key_handler.nas similarity index 90% rename from Nasal/prop-key-handler.nas rename to Nasal/prop_key_handler.nas index be739776e..aa80967b1 100644 --- a/Nasal/prop-key-handler.nas +++ b/Nasal/prop_key_handler.nas @@ -24,7 +24,7 @@ # ... like but cycles backwards # / ... switch back/forth in the history # ... cancel the operation -# ... removes last, whole path element +# ... remove last, whole path element # # # Colors: @@ -33,25 +33,13 @@ # green ... path to existing property # red ... broken path syntax (e.g. "/foo*bar" ... '*' not allowed) # yellow ... while typing in value for a valid property path -# magenta ... while typing search string (except when first char is '/') +# magenta ... while typing search string (except when first character is '/') # # # For example, to open the property browser in /position/, type '/p:'. -var kbdevent = _setlistener("/devices/status/keyboard/event", func { - var event = cmdarg(); - #debug.tree(event); - if (!getprop("/sim/input/property-key-handler") or !event.getNode("pressed").getValue()) - return; - var key = event.getNode("key"); - var shift = event.getNode("modifier/shift").getValue(); - if (handle_key(key.getValue(), shift)) - key.setValue(0); # drop key event -}); - - -var active = 0; +var listener = nil; var input = nil; # what is shown in the popup var explicit_input = nil; # what the user typed (doesn't contain unconfirmed autocompleted parts) var state = nil; @@ -62,15 +50,32 @@ var history = []; var history_pos = -1; -var handle_key = func(key, shift) { - if (!active) { - if (key != `/`) - return 0; # pass event +var start = func { + listener = setlistener("/devices/status/keyboard/event", func(event) { + debug.tree(event); + if (!event.getNode("pressed").getValue()) + return; + var key = event.getNode("key"); + var shift = event.getNode("modifier/shift").getValue(); + if (handle_key(key.getValue(), shift)) + key.setValue(0); # drop key event + }); + state = parse_input(input = ""); + handle_key(`/`, 0); +} - active = 1; - state = parse_input(input = ""); + +var stop = func(save_history = 0) { + removelistener(listener); + gui.popdown(); + if (save_history) { + append(history, input); + history_pos = size(history); } +} + +var handle_key = func(key, shift) { if (key == 357) { # up set_history(-1); @@ -93,11 +98,11 @@ var handle_key = func(key, shift) { s ~= " does not exist"; } screen.log.write(s, 1, 1, 1); - active = 0; + stop(1); + return 1; } elsif (key == 27) { # escape -> cancel - gui.popdown(); - active = 0; + stop(0); return 1; } elsif (key == 9) { # tab @@ -126,18 +131,19 @@ var handle_key = func(key, shift) { print("\n-- property search: '", input, "' ----------------------------------"); search(props.globals, input); print("-- done --\n"); - gui.popdown(); - active = 0; + stop(0); return 1; } elsif (key == `*` and state.node != nil and state.value == nil) { debug.tree(state.node); - active = 0; + stop(1); + return 1; } elsif (key == `:` and state.node != nil and state.value == nil) { var n = state.node.getAttribute("children") ? state.node : state.parent; gui.property_browser(n); - active = 0; + stop(1); + return 1; } else { input ~= chr(key); @@ -146,13 +152,6 @@ var handle_key = func(key, shift) { history_pos = size(history); } - if (!active) { - append(history, input); - history_pos = size(history); - gui.popdown(); - return 1; - } - state = parse_input(input); build_completion(explicit_input); @@ -167,7 +166,7 @@ var handle_key = func(key, shift) { color = set_color(0.7, 1, 0.7); gui.popupTip(input, 1000000, color); - return 1; # yes, we used the key + return 1; # we used the key } diff --git a/gui/dialogs/devel-extensions.xml b/gui/dialogs/devel-extensions.xml index 744649130..d1f64b6ba 100644 --- a/gui/dialogs/devel-extensions.xml +++ b/gui/dialogs/devel-extensions.xml @@ -26,7 +26,7 @@ left - + /sim/input/property-key-handler dialog-apply diff --git a/keyboard.xml b/keyboard.xml index 074d06498..e54f7a4e7 100644 --- a/keyboard.xml +++ b/keyboard.xml @@ -32,8 +32,6 @@ top down before the key bindings are parsed. if (mod == 0 or mod == 1) { controls.ptt(mod + 1); space_release = func { controls.ptt(0) } - } else { - gui.property_browser(); } } @@ -369,6 +367,27 @@ top down before the key bindings are parsed. + + / + Activate property handler development tool + + + + /sim/input/property-key-handler + + + nasal + + + + + /sim/input/property-key-handler + + nasal + + + + 0 Move rudder left.