This is a gui addon displaying ofParameter
based data with a focus on simplicity and extensibility. It can be configured using JSON.
Since ofJson just recently got added to openFrameworks, you have to use the current master branch in order for it to work. Please report an issue if ofxGuiExtended is not compatible with the latest openFrameworks version.
This addon is tested on Ubuntu 16.04 64bit. Please tell me if it runs on other systems or if you have issues.
This addon was first built as an extension for the OF core ofxGui addon. You can download this version here.
This is the standalone ofxGuiExtended version build from ofxGui. It also contains a minimized version of ofxDOM. It does not depend on other addons.
This addon is built with the best intentions to be as extensible as possible. There are addons working with ofxGuiExtended:
- ofxSortableList
- ofxMasterSlaveControl
- ofx2DMapping compatible version is not online yet
Please tell me if you wrote something compatible, I will add it to the list. Check out the bottom of this page for contribution and implementation notes.
Just initialize some parameters and pass them on to the addon. It will create a panel showing the parameters. Have a look at this example to see it in action.
//ofApp.h
#include "ofxGuiExtended"
//..
ofxGui gui;
ofParameter<bool> moving;
ofParameter<float> speed;
ofParameter<float> rotation;
//..
//ofApp.cpp
void setup(){
// initialize the parameters you want to work with
moving.set("moving", true);
speed.set("speed", 0.5, 0, 1);
rotation.set("rotation", 0, 0, 360);
// add them to the gui
gui.add(moving, speed, rotation);
}
A container is just a collection of other elements, a group derives from it and has a header to minimize and maximize itself and a panel has a header to move it around and save and load element states.
In the last example, the panel got created automatically, but you can also create containers yourself.
ofxGuiPanel* panel = gui.addPanel();
panel->add(..);
In the same way you can add other containers to existing containers:
ofxGuiGroup* group = panel->addGroup();
group->add(..);
Some parameters automatically create groups if you add them to the gui:
ofParameter<ofPoint> position;
ofParameter<ofColor> color;
gui.add(position, color);
Controls get automatically created whenever you add a parameter to the GUI.
panel->add(moving); // creates a toggle
panel->add(speed); // creates a slider
panel->add(rotation); // creates a slider
You can also add a specific control (this is very useful if you implement your own control classes):
panel->add<ofxGuiLabel>("labeltext");
panel->add<yourControlElementClass>(/* contructor parameters of control element class */);
There are attributes that you can set for each element. You will find these attributes in the description of the classes beneath the examples on this page.
When adding parameters or creating containers, you can append attributes with ofJson
.
ofJson panelConfig = {{"background-color", "#ff0000"}, {"padding", 10}};
ofJson itemConfig = {{"fill-color", "rgba(0,255,255,0.5)"}};
ofxGuiPanel* panel = gui.addPanel("panel title", panelConfig);
panel->add(moving, itemConfig);
panel->add(speed, itemConfig);
panel->add(rotation, itemConfig);
The goal is to set attributes in an external file to set style and layout without recompiling. This is not yet implemented but most of the work is done, stay tuned.
In a theme you can define attributes for the different element class types. Have a look at this example. Also read the class descriptions in the next chapters of this page for the class type names and the attributes that you can set for each class.
This is how you load a theme:
panel = gui.addPanel();
panel->loadTheme("theme_light.json");
A theme file could look like this:
//theme_light.json
{
"light": {
"base": {
"background-color": "rgba(255,255,255,0.4)",
"fill-color": "rgba(255,255,255,1)",
"border-width": 0,
"padding": 0,
"border-color": "rgb(0,0,0)",
"margin": 3,
"text-color": "#000000",
"text-padding": 3
},
"group": {
"background-color": "rgba(155,155,155,0.6)",
"border-color": "#ffffff",
"padding": 1,
"margin-left": 20,
"border-width": 1
},
"group-header": {
"background-color": "#2da1e3",
"text-color": "#ffffff"
}
}
}
The default layout lets you align elements in containers horizontally and vertically. The layout can be changed. ofxDOMFlexBoxLayout was implemented for more complex layout scenarios. If you want to use it, you have to set it up before adding elements to the GUI:
gui.setupFlexBoxLayout();
Have a look at the layout attribute descriptions later in this file for details and check out this flexbox layout example.
If you want to implement your own layout class, you can use it by adding it to your GUI like this (assuming ofxDOMLayoutCustom
is your layout class):
gui.setup<ofxDOMLayoutCustom>();
- Derived from
DOM::Element
. - Base class of all other gui elements.
- class type name for JSON theme:
base
Attribute | Value | Example | Description |
show-name |
bool |
true |
Display or hide the name of the element. |
background-color border-color fill-color text-color header-background-color |
string |
"#ff0000" "rgb(255,0,0)" "rgba(255,0,0,0.5)" "transparent" |
Colors of the element. |
border-width |
float |
1 |
Width of the border. |
border-radius |
float |
3 |
Radius of the border (not implemented for all controls yet). |
text-align |
string |
left right center |
Sets the text alignment. *Currently only affecting fullsize toggles.* |
font-family |
string |
"fonts/UbuntuMono-B.ttf" |
Sets the font family and changes the font rendering from bitmap font to TTF. Font path is relative to bin/data . |
font-size |
float |
10 (default) |
Sets the font size. Only works if you set a font family, the default bitmap font has a fixed size. The elements can't currently update their size according to the font size so if you set it high you have to adjust the element size yourself in order to prevent overlapping. |
margin |
float string |
10 "10 20" "10 20 30" "10 20 30 40" |
Set the margin of the element. Analog to CSS margin. |
margin-top margin-right margin-bottom margin-left |
float |
10 |
Set the margin for the specified side of the element. |
padding |
float` |
10 "10 20" "10 20 30" "10 20 30 40" |
Set the padding of the element. Analog to CSS padding. Padding currently only has an effect on containers, not on controls. |
padding-top padding-right padding-bottom padding-left |
float |
10 |
Set the padding for the specified side of the element. |
background-image |
string |
images/ente.jpg |
Set the background image path of the element, relative to the bin directory of the application. |
background-size |
string |
cover (default)contain scale |
Set how the background image is sized - contain makes the whole image fit inside the element by keeping it's proportions, cover makes the image cover the element by keeping it's proportions, scale scales the image to the same size as the element. |
- Derived from
ofxGuiElement
. - Default control type for
ofParameter<bool>
. - class type name for JSON theme:
toggle
Attribute | Value | Example | Description |
type |
string |
"checkbox" (default)"radio" "fullsize" |
Visual type of toggle. |
- Derived from
ofxGuiToggle
. - Default control type for
ofParameter<void>
. - class type name for JSON theme:
button
- Derived from
ofxGuiElement
. - This is a template class, use
ofxGuiFloatSlider
orofxGuiIntSlider
. - Default control types for
ofParameter<float>
andofParameter<int>
.
Attribute | Value | Example | Description |
type |
string |
"straight" (default)"circular" |
Visual type of slider. The straight type will appear as a horizontal or vertical slider depending on the aspect ration of its size. |
precision |
int |
6 (default) |
Sets the displayed precision of a float value. The value of the parameter won't be changed. |
update-on-release-only |
bool |
false (default) |
If true, the slider will trigger on release only. |
- Derived from
ofxGuiElement
. - Displays a text or a numerical value as a label.
- class type name for JSON theme:
label
- Derived from
ofxGuiElement
. - Displays any
ofBaseDraws
reference. - class type name for JSON theme:
graphics
- Derived from
ofxGuiGraphics
. ofBaseDraws
reference can be zoomed with scroll wheel and dragged with mouse button.
- Derived from
ofxGuiElement
. - class type name for JSON theme:
value-plotter
- //TODO
- Derived from
ofxGuiValuePlotter
. - //TODO
- Derived from
ofxGuiElement
. - class type name for JSON theme:
function-plotter
- //TODO
- derived from
ofxGuiElement
. - Contains other elements according to the current layout
- class type name for JSON theme:
container
- derived from
ofxGuiContainer
. - Groups other elements according to the current layout with a header to minimize or maximize the group
- class type name for JSON theme:
group
- class type name of group header for JSON theme:
group-header
Attribute | Value | Example | Description |
show-header |
bool |
true (default) |
Show or hide the header of the group. |
- derived from
ofxGuiGroup
. - Header can be used to drag group (only if panel is in absolute position mode).
- class type name for JSON theme:
panel
- class type name of group header for JSON theme:
panel-header
- derived from
ofxGuiGroup
. - Add groups to this container and they will be displayed as tabs.
- class type name for JSON theme:
tabs
- //TODO
- Derived from
DOM::Layout
. - Simple layout that lets you align elements in a container horizontally or vertically. Vertically aligned items will always use the full width of the container, horizontally aligned items will always use the full height of the container.
Attribute Value Example Description width
height
float
string
800
"70%"
Size of the element. direction
string
"vertical"
(default)"horizontal"
The direction child elements get aligned. - Derived from
ofxDOMBoxLayout
. - Implements parts of the CSS FlexBox Layout.
- There are multiple guides online that describe the layout and its options [1], [2].
Attribute Value Example Description width
height
float
string
800
"70%"
Size of the element. flex
string
float
"none"
(default)"auto"
3
Flex attribute of the element [[source](https://www.w3.org/TR/css-flexbox/#flex-property)]. flex-direction
string
"column"
(default)"row"
The direction child elements get aligned. flex-wrap
string
"nowrap"
(default)"wrap"
Determines if the child elements are aligned on one or multiple lines if space is insufficient justify-content
string
"flex-start"
(default)"flex-end"
"center"
"space-between"
"space-around"
How to align the child items along the main axis. align-items`
string`
"stretch"
(default)"flex-start"
"flex-end"
"center"
How to align child items along the cross axis. align-content
string
"stretch"
(default)"flex-start"
"flex-end"
"center"
"space-between"
"space-around"
Alignment options for item lines when there is space in the container along the cross axis, only used if multiple rows / columns are present. align-self`
string`
"auto"
(default)"flex-start"
"flex-end"
"center"
"stretch"
Individual alignment options for a flex item along the cross axis. - //TODO
- //TODO
- //TODO
- //TODO
- ** Please report issues! **
- Have a look at the issues on github, there are up to date posts on bugs and feature requests
- @arturoc for his work on ofxGui
- @bakercp for his work on ofxDOM
- @fxlange for his work on ofxInputField
- Derived from