[Add] New rectangle widget. More widget creation checking.

This commit is contained in:
Allanis 2013-03-06 22:28:46 +00:00
parent c5280cb4b3
commit 9d08ff3ae0
2 changed files with 69 additions and 6 deletions

View File

@ -12,7 +12,8 @@ typedef enum WidgetType_ {
WIDGET_BUTTON,
WIDGET_TEXT,
WIDGET_IMAGE,
WIDGET_LIST
WIDGET_LIST,
WIDGET_RECT
} WidgetType;
typedef enum WidgetStatus_ {
@ -55,6 +56,11 @@ typedef struct Widget_ {
int pos; // Current topmost option (in view).
void (*fptr) (char*); // Modify callback.
} lst;
// Widget rect.
struct {
glColour* colour; // Background colour.
int border; // Border.
} rct;
} dat;
} Widget;
@ -101,6 +107,7 @@ static void toolkit_renderButton(Widget* btn, double bx, double by);
static void toolkit_renderText(Widget* txt, double bx, double by);
static void toolkit_renderImage(Widget* img, double bx, double by);
static void toolkit_renderList(Widget* lst, double bx, double by);
static void toolkit_renderRect(Widget* rct, double bx, double by);
static void toolkit_drawOutline(double x, double y, double w,
double h, double b, glColour* c, glColour* lc);
static void toolkit_drawRect(double x, double y, double w, double h,
@ -151,7 +158,8 @@ void window_addText(const unsigned int wid, const int x, const int y,
else wgt->x = (double)x;
if(y < 0) wgt->y = wdw->h + y - h;
else wgt->y = (double) y;
wgt->dat.txt.colour = colour;
if(colour == NULL) wgt->dat.txt.colour = &cBlack;
else wgt->dat.txt.colour = colour;
wgt->dat.txt.centered = centered;
if(string) wgt->dat.txt.text = strdup(string);
else wgt->dat.txt.text = NULL;
@ -167,11 +175,14 @@ void window_addImage(const unsigned int wid, const int x, const int y,
wgt->type = WIDGET_IMAGE;
wgt->name = strdup(name);
// Set the propertied.
// Set the properties.
wgt->dat.img.image = image;
if(x < 0) wgt->x = wdw->w - wgt->dat.img.image->sw + x;
wgt->w = (image == NULL) ? 0 : wgt->dat.img.image->sw;
wgt->h = (image == NULL) ? 0 : wgt->dat.img.image->sh;
if(x < 0) wgt->x = wdw->w - wgt->w + x;
else wgt->x = (double)x;
if(y < 0) wgt->y = wdw->h + y;
//if(y < 0) wgt->y = wdw->h - wgt->h + y;
else wgt->y = (double)y;
}
@ -202,6 +213,26 @@ void window_addList(const unsigned int wid, const int x, const int y,
toolkit_nextFocus();
}
void window_addRect(const unsigned int wid, const int x, const int y, const int w,
const int h, char* name, glColour* colour, int border) {
Window* wdw = window_wget(wid);
Widget* wgt = window_newWidget(wdw);
wgt->type = WIDGET_RECT;
wgt->name = strdup(name);
wgt->dat.rct.colour = colour;
wgt->dat.rct.border = border;
wgt->w = (double)w;
wgt->h = (double)h;
if(x < 0) wgt->x = wdw->w - wgt->w + x;
else wgt->x = (double)x;
if(y < 0) wgt->y = wdw->h - wgt->h + y;
else wgt->y = (double)y;
}
// Return pointer to newly allocated widget.
static Widget* window_newWidget(Window* w) {
Widget* wgt = NULL;
@ -595,6 +626,9 @@ static void window_render(Window* w) {
case WIDGET_LIST:
toolkit_renderList(&w->widgets[i], x, y);
break;
case WIDGET_RECT:
toolkit_renderRect(&w->widgets[i], x, y);
break;
}
}
// Focus widget.
@ -736,6 +770,30 @@ static void toolkit_renderList(Widget* lst, double bx, double by) {
}
}
// Render a rectangle.
static void toolkit_renderRect(Widget* rct, double bx, double by) {
double x, y;
glColour* lc, *c, *oc;
x = bx + rct->x;
y = by + rct->y;
lc = &cGrey90;
c = &cGrey70;
oc = &cGrey30;
if(rct->dat.rct.colour)
// Draw rect only if it exists.
toolkit_drawRect(x, y, rct->w, rct->h, rct->dat.rct.colour, NULL);
if(rct->dat.rct.border) {
// Inner outline.
toolkit_drawOutline(x, y, rct->w, rct->h, 0., lc, c);
// Outter outline.
toolkit_drawOutline(x, y, rct->w, rct->h, 1., oc, NULL);
}
}
// Render the window.
void toolkit_render(void) {
int i;
@ -981,7 +1039,7 @@ static void toolkit_listFocus(Widget* lst, double bx, double by) {
char* toolkit_getList(const unsigned int wid, char* name) {
Widget* wgt = window_getwgt(wid, name);
if((wgt->type != WIDGET_LIST) || (wgt->dat.lst.selected != -1))
if((wgt->type != WIDGET_LIST) || (wgt->dat.lst.selected == -1))
return NULL;
return wgt->dat.lst.options[wgt->dat.lst.selected];

View File

@ -25,6 +25,11 @@ void window_addList(const unsigned int wid,
char* name, char** items, int nitems, int defitem,
void(*call)(char*));
void window_addRect(const unsigned int wid,
const int x, const int y, // Position.
const int w, const int h, // size.
char* name, glColour* colour, int border); // Properties.
// Modification
void window_modifyText(const unsigned int wid, char* name, char* newstring);
void window_modifyImage(const unsigned int wid, char* name, glTexture* image);