Data types

s3dw_widget

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.

s3dw_button

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.

s3dw_input

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.

s3dw_textbox

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.

s3dw_scrollbar

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.

s3dw_label

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.

s3dw_surface

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 ...

s3dw_style

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.

s3dw_callback

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 */
	...
}