[Add] New rectangle widget. More widget creation checking.
This commit is contained in:
parent
c5280cb4b3
commit
9d08ff3ae0
@ -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 + 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];
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user