Home | Contents | Index | Help | < Browse | Browse >

 Creating a switch button

 You can simplify making a switch button by writing a little shell script:

   .key var,s1,s2

   if $<var> EQ <s1>
          setenv <var> <s2>
          setenv <var> <s1>

 Name this script "switch", Set the script flag (Protect "switch" +S)
 and use it as shown below:

    close off
    gap 4
    defenv s ON

    button exit 'unsetenv s' exit
      text "The switch is:"
      button [s] 'switch s ON OFF' update

 Try it!


 More about variables...

 Remember that the env variables in a selector script file only are
 updated when a script is updated or loaded. So don't try something
 like this:

 button "Load script" "setenv name `requestfile`" load [name]

 The variable [name] is not changed... You can solve the problem
 above like this:

 button "Load script" "run >nil: selector `requestfile`" exit


 Changable arguments

 Maybe you would like to pass a variable from the command line, that then
 could be altered. This you can do by passing the arg to an env variable:

 Example: (script called ChArgs.sel)

    defarg arg1 'Nothing passed'
    defenv vary '[arg1]'
    close off

    button '[vary]' 'setenv vary "Button pressed"' update
    button Quit 'unsetenv vary' exit

 Try it like this:

    Selector ChArgs 'Press the button!!'
    Selector ChArgs


 Unsetenv technique

 If you wan't some variables in an information window without buttons,
 you could wonder how to unset them again. This because there is no exit
 button to unset them on... well, the answer is simple, use the unsetenv
 command at the end of the script:

 Ex: (script called "etips.sel")

    defarg arg1 c:type
    exec 'setenv size `list "[arg1]" lformat "%l"`'

    text 'The size of [arg1]'
    text 'is [size] bytes'

    unsetenv size

 Try it like this:

    selector etips
    selector etips sys:utilities/more

 This technique is possible because of the way selector inserts the env
 variables into the script, line by line. You can use this technique as
 long as you only use [variables], and no $variables. This because the
 variables only exists when the panel is loaded, and not when a button
 is pressed etc. Then they exist in the script, but not in ENV:

 This technique is in fact preferable over the alternative to unset the
 variables on an exit button. It also makes the env variables occupied for
 a shorter time, which in turn prevents name conflicts. It also in many
 cases let you skip the exit button and "close off" command. The fact that
 I not used this technique in many of the examples, is that I didn't think
 of this possibility until some minutes ago. I also added the unsetenv
 command to speed the technique up (instead of exec 'unsetenv...)


 The corresponding script (using this technique) for the
 dissapearing button example would be:

    defenv item "button 'Remove button' 'setenv item Text Nothing' update"
    unsetenv item

 Try it!

 But, as mentioned, this technique is NOT allways possible to use, for
 example in the switch example.


 Passing variables

 If you want to write, for example a general requester that can be called
 from other selector scripts, you can make this in several different ways.
 I want to show you three different ways to accomplish the same goal.

 In the examples, we want to call a color requester, and set the
 background to this color. Each of the alternatives uses different
 ways of passing variables.

 1. The simplest way. One that starts a new copy of selector. This
    takes of cource a little more memory, and is a little bit slower
    than the next two alternatives. It is much more slow if you not
    have a hard disk and selector not resident.

    Calling file:
    background [color]
    button "Select color" "setenv color `selector color.sel`" update

    Called file:
    button "Gray" exit 0
    button "Black" exit 1
    button "White" exit 2
    button "Blue" exit 3

 2. One that loads the other file to this copy of selector, and then
    reloads the old script. For this you must pass the name of the calling
    script to the called file.

    Calling file:
    background [arg1]
    button "Select color" load 'color.sel "[this]"'

    Called file:
    button "Gray" load '"[arg1]" 0'
    button "Black" load '"[arg1]" 1'
    button "White" load '"[arg1]" 2'
    button "Blue" load '"[arg1]" 3'

 3. Similar to number 2. But here the name of the variable that will
    be set is passed to color.sel, and set in that file.

    Calling file:
    background [color]
    button "Select color" load 'color.sel "[this]" color'

    Called file:
    button "Gray" 'setenv [arg2] 0' load '"[arg1]"'
    button "Black" 'setenv [arg2] 1' load '"[arg1]"'
    button "White" 'setenv [arg2] 2' load '"[arg1]"'
    button "Blue" 'setenv [arg2] 3' load '"[arg1]"'


Home | Contents | Index | Help | < Browse | Browse >