Toyz Web GUI¶
When I first started to make interactive controls using javascript I quickly learned why most people don’t... it’s very time consuming! Typically a form must be created using html’s bulky syntax, or using jQuery’s slighly less bulky syntax, and then to submit the form each component must be loaded individually.
To ease the process Toyz has a JSON parser that takes a JSON object (or python dictionary) and uses that to build an interface for the user. The advantage (besides being slightly faster to) create the controls, is that the parser builds them in such a way that a single get function can get all of the parameters in the correct format to pass to a python function without having to manually re-configure any of them! In addition, when a dictionary is sent from the web application (like a set of saved settings), all of the inputs are populated instantly! This includes standard text/numerical inputs, select boxes, lists, and dictionaries (lists with a specific format), and even the option for users to define their own controls (which has not been thoroughly tested yet).
Below is a brief guide to the different inputs and controls currently implemented.
Parameters¶
Parameters are all given as JSON objects. The key of a parameter is it’s name, and the values are its properties.
For example:
var params = {
type: 'div',
legend: 'User Info',
params: {
name: {
lbl: 'name',
},
age: {
lbl: 'age',
prop: {
type: 'Number'
}
}
group: {
type: 'select',
options: {
red: 'Red',
blue: 'Blue',
green: 'Green'
}
}
}
};
creates a div with two input boxes: name and age, and a select box groups that has three options red, blue, green.
Properties for all Parameters¶
type: optional¶
- Type of parameter.
- If no type is given the parameter defaults to input
prop: optional¶
- Lists any properties of the html element
- Uses the jquery .prop function to add the property to the parameters html element
css: optional¶
- Lists any styles for the html elements. This uses the jquery .css function
func: optional¶
- Functions attached to the parameter.
- Works for any jquery event for the given element type
Example:
var my_button = {
type: 'button',
prop: {
innerHTML: 'click me'
},
func: {
click: function(){
alert('You clicked me')
}
}
}
will alert the user when the button is clicked.
- events: optional
- Dictionary whose keys are Toyz events (not to be confused with javascript window events)
- For each event, a function is given that is called when a Toyz application triggers the given event
Container Parameters¶
div¶
div defines an HTML div (division) element on the webpage.
Properties for all div containers¶
- legend: optional
- If legend is given, the div is wrapped in a fieldset with legend as the title
- legend_class: optional
- Included if any classes are to be set for the legend
- legend_css: optional
- Included if any styles are to be set for the legend (uses jquery .css function)
- div_class: optional
- If it is desired to set any classes for the div container, it can be done using the classDiv field
div Properties¶
- params: required
- Each key in params is a parameter in the div
- This can be any type of parameter, including another div
conditional¶
Similar to a div, but a conditional contains a selector that allows the user to choose from a list of options, then display a div that contains a subset of parameters based on the selection choice.
conditional Properties¶
- selector: required
- Parameter that for certain values will cause a subset of parameters to appear on the form. This will usually have input type select or input type checkbox
- param_sets: required
- Subsets of parameters for each value of the selector. If a particular value doesn’t have a subset, do not give it a key in param_sets
Example:
var my_param = {
type: 'conditional',
params: {
model: {
type: 'select',
options: {
polynomial: 'polynomial',
gaussian: 'gaussian',
exponential: 'exponential',
}
}
},
param_sets: {
polynomial: {
type: 'div',
params: {
order: {
prop: {
type: 'number',
value: 2
}
},
coefficients: {
lbl: 'initial guess (coefficients)',
prop: {
value: '0,1,1'
}
}
}
},
gaussian: {
type: 'div',
params: {
mean: {
prop: {
type: 'number',
value: 0
}
},
std_dev: {
lbl: 'standard deviation',
prop: {
type: 'number',
value: 1
}
},
amplitude: {
prop: {
type: 'number',
value: 1
}
},
floor: {
prop: {
type: 'number',
value: 0
}
}
}
}
}
creates a drop down box that allows the user to select a function type (polynomial, gaussian, exponential), and if either polynomial or gaussian is chosen, a subset of parameters is given.
Input Parameters¶
Properties for all input parameters¶
In addition to the properties available for all parameters, there are some properties available to all input parameters
- lbl: optional
- If given, this is a label shown to the left of an input parameter
- div_class and div_css: optional
Each input parameter is contained in a div that is roughly of the form:
<div><label>Input label:</label><input></input></div>
If it is desired to set any classes for the parent div, it can be done using the classDiv field
If it is desired to change the style of the parent div, it can be done by using the divCss field (this uses the jquery .css function)
- lbl_class and lbl_css: optional
- If the user wants to customize the label for a parameter, classes can be added by using the
lbl_class property, and styles can be added by using the lbl_css property
- title: optional
- Sets the tooltip title of the input div (this includes both the label and the input)
- units: optional
- Some parameters may have optional units that can be set
- The value of the units field is a list of available units (if multiple units are available) or a single string (if units is just a label for the users benefit)
Example:
var velocity = {
prop: {
type: 'Number'
},
units: ['m/s','km/s', 'mph']
};
creates a number input with a dropdown units box containing m/s, km/s, mph as possible units.
- file_dialog: optional
- Many times the input will be a path or filename from the server
- This option creates a button that opens a file manager to view directories and files available for the user
- The value of file_dialog does not matter, but is typically set to true
Example:
var file_dialog = new Toyz.Core.FileDialog({});
var my_path = {
lbl: 'path',
file_dialog: true
}
input¶
This is the default if no type is given for a parameter. If no additional properties are given, a text box with no label will appear on the form. This object has no special properties other than the ones listed above for all parameters.
Input types¶
To set the type of an input (for example a checkbox, or number (as opposed to a string)) use {prop: type: input_type}. For example:
var my_input = {
prop: {
type: 'checkbox',
'checked': true
}
}
creates a checkbox with true as its default value.
select¶
Select (drop-down) box, consisting of a list of options that can later be changed or updated.
select Properties¶
- options: required
- Objects whose keys are the values of select HTML object and values are the text displayed to the user
- order: optional
- An array that lists the order in which options should be added to the select box
- Only options in the order array will be added to the select box
Example:
var stoplight = {
type: 'select',
options: {
green: 'Green light',
yellow: 'Yellow light',
red: 'Red light',
},
defaultVal: 'red'
}
creates a drop-down box with a default value of red.
list¶
An editable list of objects. If the input required is something as simple as a simple list of numbers (input = [1,2,3,4,5]) it may be best to simply have a text input and parse the results by separating on the ,.
The list type is geared toward more complicated inputs, such as dictionaries, lists of lists (where each entry in the list is also a list) or more complicated custom input types. Each element in the list has a radio button to choose the current entry that can be removed (if desired), as well as built in controls to add/remove entries.
list Properties¶
- format: required
- Format of the input from: list, dict, OrderedDict, custom. Defaults to list. (OrderedDict and none not supported yet)
- For format = dict, new_item is required to be a div
- ordered: optional
- Boolean that describes whether or not the list is numbered or not. Defaults to false (unordered list <ul>)
- buttons: optional
- Defines a div containing buttons for the list. If buttons is not defined, the default is to have an add button and remove button and add/remove items from the list
- new_item: required
- When the add button is clicked, a new item is added to the list. newItem can either be a div with sub parameters or a single parameter
newItem Properties¶
New items are a bit different than ordinary divs because list objects might actually be dictionaries or lists of lists. As a result, new_item objects have additional properties
- key, value: required for format=``dict``
- key and value of the dictionary when getting/setting values
- In this case, new_item is required to be a div
Example:
var my_div = {
type: 'div',
legend: 'shortcut',
paramas: {
key: {
lbl: 'path name'
},
value: {
lbl: 'path',
}
}
}
will create a div that contains a field to return a dictionary key:value pair.
- get: required for format=``custom``
- Function to get the value of the custom list parameter
- set: required for format=`custom`
- Function to set the value of the custom list parameter
list Examples¶
Dictionary input Example:
- var my_list = {
type: ‘list’, new_item: {
type: ‘div’, format: ‘dict’, params: {
- key: {
- lbl: ‘knickname’,
}, value: {
lbl: ‘full name’}
}
}
}
List input Example:
- var my_list = {
type: ‘list’, new_item: {
type: ‘div’, format: ‘list’, items: 3, params: {
- li1: {
- lbl: ‘name’,
}, li2: {
lbl: ‘age’ type: ‘Number’}, li3:{
lbl: ‘height’, units: [‘feet’, ‘inches’, ‘m’, ‘cm’]}
}
}
}
button¶
Buttons are not actually inputs but still might exist on the form. They have no special properties other than those given above for all objects, but typically will have a click function given by the func object.
custom¶
It is also possible for users to specify a custom input type, for example some type of control. In this case the method of setting and retrieving the value of the input must be given.