struct _s3dw_widget { /* private .. */ int type; s3dw_widget *parent; s3dw_style *style; int nobj; /* number of children objects */ s3dw_widget **pobj; /* pointer to list of children objects */ int focus; /* index of the widget focused in pobj */ int flags; /* flags like visibility */ float ax, ay, az; /* current position for animation */ float as; /* current scale factor */ float arx, ary, arz; /* current rotation */ float width, height; /* width and height of the widget, outer size */ uint32_t oid; /* the main object which is used for transformations etc ...*/ /* public */ void *ptr; /* a pointer to a user structure, to use in callbacks etc */ float x, y, z; /* position, relative to the surface usually */ float s; /* scale factor */ float rx, ry, rz; /* rotation around the axis */ }; typedef struct _s3dw_widget s3dw_widget; /* type may be one of the following ... */ enum { S3DW_TROOT, S3DW_TCAM, S3DW_TSURFACE, S3DW_TBUTTON, S3DW_TLABEL, S3DW_TINPUT, S3DW_TTEXTBOX, S3DW_TSCROLLBAR, S3DW_NTYPES }; #define S3DWIDGET(x) ((s3dw_widget *)x)
This is the most basic widget type, it contains all the "general" widget information. If you want to move a widget, you'd change x,y,z,s and rx,ry,rz and call s3dw_moveit to turn your action reality. Every other widget has this type as first entry, so a simple typecast to s3dw_widget will give you the widgets "general" information. For typecast, you may use S3DWIDGET().
The pointer ptr allows linking to user-specific datastructures. That comes in handy if the widget is called back by an event, and the program must now find out on which data the user reacted.
typedef struct _s3dw_button s3dw_button; struct _s3dw_button { /* private */ s3dw_widget widget; char *text; uint32_t oid_text; /* public */ s3dw_callback onclick; };
The buttons is just a button as you would expect it in a 2D widget library. It only reacts on clicks.
typedef struct _s3dw_input s3dw_input; struct _s3dw_input { /* private */ s3dw_widget widget; char *text; uint32_t oid_text; /* public */ s3dw_callback onclick; s3dw_callback onedit; };
The inputs is an input-field where a user may type things. onclick reacts on click in the field, onedit notifies you when someone writes in the field.
typedef struct _s3dw_textbox s3dw_textbox; struct _s3dw_textbox { /* private */ s3dw_widget widget; s3dw_scrollbar *scroll_vertical, *scroll_horizontal; char *text; int n_lineoids, *p_lineoids; int window_x, window_y; /* public */ s3dw_callback onclick; };
A textbox shows some text with scrollbars to scroll around. It can currently only react to a click event.
typedef struct _s3dw_scrollbar s3dw_scrollbar; struct _s3dw_scrollbar { /* private */ s3dw_widget widget; float pos, max; int type; /* 0 = horizontal, 1 = vertical */ int loid, roid, baroid; /* public */ s3dw_callback lonclick, ronclick; };
The Scrollbar should be placed around scrollable content. Currently only the left and right icons are clickable (lonclick and ronclick callbacks), in vertical mode lonclick is the callback for the up icon, ronclick the callback for the down icon.
typedef struct _s3dw_label s3dw_label; struct _s3dw_label { /* private */ s3dw_widget widget; char *text; /* public */ s3dw_callback onclick; };
The labels is an label-field where a user may type things. onclick reacts on click in the field, onedit notifies you when someone writes in the field.
typedef struct _s3dw_surface s3dw_surface; struct _s3dw_surface { /* private */ s3dw_widget widget; uint32_t oid_title; uint32_t oid_tbar; char *title; };
A surface is the window of this widget library, holding all of our elements like buttons, inputfields etc ...
typedef struct _s3dw_style s3dw_style; /* style */ struct _s3dw_style { char *name; /* name of the style ... kind of redundant */ char *fontface; /* font face for all used fonts */ float surface_mat[12]; /* material for the surface background */ float input_mat[12]; /* material for buttonboxes and other widgets */ float inputback_mat[12]; /* material for inputfield background */ float text_mat[12]; /* material for the text on buttons and inputs */ float title_mat[12]; /* material for the title bar */ float title_text_mat[12]; /* material for the text on the title bar */ };
With s3dw_style you can change the colors/materials of your widgets. materials are in the same as in s3d_push_materials_a, that means red,green,blue and alpha float values (between 0.0 and 1.0) for Ambience, Specular and Diffuse Color.
typedef void (*s3dw_callback)(s3dw_widget *);
The callback type. Receive the widget which is affected as argument.
/* example */ void my_handler(s3dw_widget *widget) { /* do something with the widget */ ... }