On Thu, 16 Jul 2015 11:28:03 -0700 (PDT) "Edward K. Ream" <[email protected]> wrote:
> On Thursday, July 16, 2015 at 2:44:32 AM UTC-5, Israel Hands wrote: > > Hi, I'm writing a very simple script and need to get interactive > input from > > the user. I have read the information in the docs and it seems a > > complicated, can anyone point me to the simplest working example of > > a script that uses interactivity? Depends how much interaction you need: g.app.gui.* methods: ['runAboutLeoDialog', 'runAskDateTimeDialog', 'runAskOkCancelNumberDialog', 'runAskOkCancelStringDialog', 'runAskOkDialog', 'runAskYesNoCancelDialog', 'runAskYesNoDialog', 'runOpenDirectoryDialog', 'runOpenFileDialog', 'runSaveFileDialog'] might be sufficient if dialogs are acceptable. Cheers -Terry > Good question. There should at least be a section in the scripting > miscellany chapter <http://leoeditor.com/scripting-miscellany.html>, > but at present there isn't. > > Here is a relatively simple example. I sniffed around Leo's sources > for a template. I picked @cmd('shell-command') pretty much at > random, and then pared it down to this:: > > def interactive_example(event=None): > '''Prompts for a number.''' > k = c.k > state_name = 'enter-a-number' > state = k.getState(state_name) > if state == 0: > k.setLabelBlue('Enter a number: ') > k.getArg(event, state_name, 1, interactive_example) > else: > n = k.arg > k.clearState() > k.showStateAndMode() > c.frame.putStatusLine(n, bg='blue', fg='white') > c.bodyWantsFocus() > > interactive_example() > > You can see this in action by executing the code above with Ctrl-B. > > The challenge in any interaction is to coordinate keystrokes. *All* > keystrokes always go through k.masterKeyHandler. So interactive code > must do the correct incantations to make this work. Let's look at > this example line by line. > > 1. There must be a function (typically a method) to handle the > interactions. Usually the method implements a Leo command, which is > why the event arg is supplied, but in this case the code actually > doesn't ever use the event arg. > > 2. The first step in the code is to give your interaction a *unique > name*, in this case, the string 'enter-a-number'. > > 3. Next, the code does: > > state = k.getState(state_name) > > Initially, state will be zero, because we aren't in the state. So > the code does: > > k.setLabelBlue('Enter a number: ') > k.getArg(event, state_name, 1, interactive_example) > > The first line puts a prompt into the minibuffer, the second calls > the k.getArg to accumulate the desired value. > > k.getArg is a thin wrapper around the k.GetArg *class*, which has a > gazillion options. k.getArg will coordinate with k.masterKeyHandler > to get the argument "interactively", that is, character by > character. k.getArg sets the state and state number using the second > and third arguments. k.getArg supports Ctrl-G and Backspace by > default, and can also handle tab completion as well as other > esoterica. > > When the user hits <Return> k.getArg will call the handler, the last > arg in the call to k.getArg, with state == 1. The handler is > interactive_example, so control reenters interactive_example, but > this time with state == 1. So now the following is executed: > > n = k.arg > k.clearState() > k.showStateAndMode() > c.frame.putStatusLine(n, bg='blue', fg='white') > c.bodyWantsFocus() > > k.getArg sets the k.arg value to the accumulated result. g.getArg > does no checking of the value of k.arg: that would be up to the > handler. > > The handler could call k.getArg again, with another state number if > more interaction were desired. When the interaction is finished, the > handler must call k.clearState() > . > Leo's interaction mechanism is arguably too complex, but I think > we're stuck with it. > > Please feel free to ask more questions. > > Edward > -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/leo-editor. For more options, visit https://groups.google.com/d/optout.
