live update

Hello.
I'm having a panel with a setvar input field. I would like to process the input directly as it is typed.
Currently the only way for getting the event is pressing [Enter] or leaving the field with a mouse click action.
I'm trying to get a live update as the user types in sth. JSON in java or onChange() in VBA would probably be the pendant.

Window Panel() : Panel
    NewPanel /W=(150,77,454,190) as "Panel"
    String/G temp
    SetVariable setvar,pos={61.00,19.00},size={176.00,15.00},proc=SetVarProc
    SetVariable setvar,limits={-inf,inf,0},value= temp,live= 1
EndMacro

Function SetVarProc(sva) : SetVariableControl
    STRUCT WMSetVariableAction &sva

    switch( sva.eventCode )
        case 1: // mouse up
        case 2: // Enter key
        case 3: // Live update
            Variable dval = sva.dval
            String sval = sva.sval
            print sval, dval
            break
        case -1: // control being killed
            break
    endswitch

    return 0
End
The live keyword only refers to changes made via the increment arrow buttons. Unfortunately, I'm not sure there is a solution to your problem.

What are you trying to achieve?

John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
Hi.
I try to update search results in a list on-the-fly via an "search"-input field.
Would be great to have it show the results while typing.
Hitting the Enter button is probably enough as a solution. The drawbag of hitting enter is that the box looses the fokus and you have to click in the field again.
Maybe to ease your problem a bit you could look into the SetVariable ctrlName, activate command option. This will highlight the setvar box again. Unfortunately, it also selects the whole text, so you cannot just continue typing. But a 'type' -> 'enter'(or up/down arrow in live update) -> 'right arrow' -> 'type' cycle might be faster than reactivating the control via click / tab. If you use up/down arrows for updating your search you could assign the enter key to terminate the input.

I came across this while trying to accomplish the same thing recently- using a SetVariable string input as a live search that controls a drop down menu which updates on each keystroke. For anyone's future reference, you can hack your way into this behavior (it's not pretty but it ends up working and actually looks decent). It goes like this:

Upon clicking the SetVariable, immediately send focus back to the main panel and set a window hook that will detect mouse movements and keystrokes.

By using a window hook, each keystroke can be sent to the SetVariable to display, while also updating a menu. Don't use a normal popupmenu or even a contextual menu though, since it receives focus and will disrupt keystrokes. You have to fake the menu by printing out the list of menu items manually using DrawText. For it to look decent, I first display a group box sized according to the number of menu items, and print the items on top of it. It looks enough like a real menu for me. For mine, I also hook backspace/delete to gain that functionality over the string input.

For selecting something from the menu:

Using mouse move events in the hook function, you can detect the mouse location relative to the text (where each item has a known location) to record the user's menu selection on mouse down events. The selection can be shown live as a colored text item in the 'menu'. Alternatively, detect arrow keystrokes to toggle the selection up and down. On mouse down or a 'return/enter' keystroke, return the selected item from the fake menu, kill the window hook, and delete the text with DrawAction.

I'm pretty happy with how mine turned out, it lets me live search through probably a hundred different user-defined functions in my GUI very quickly without having to navigate through a popup menu with a bunch of submenus, and doesn't have very noticeable lag.