| @@ -34,6 +34,8 @@ typedef enum { | |||||
| ST_COLUMN = 4, | ST_COLUMN = 4, | ||||
| // row | // row | ||||
| ST_ROW = 5, | ST_ROW = 5, | ||||
| // check button | |||||
| ST_CHECK = 6, | |||||
| } SubType; | } SubType; | ||||
| typedef struct { | typedef struct { | ||||
| @@ -46,6 +48,12 @@ typedef struct { | |||||
| const char *label; | const char *label; | ||||
| } UIButtonData; | } UIButtonData; | ||||
| typedef struct { | |||||
| UIData head; | |||||
| const char *label; | |||||
| int *option; | |||||
| } UICheckData; | |||||
| typedef struct { | typedef struct { | ||||
| UIData head; | UIData head; | ||||
| int iconid; | int iconid; | ||||
| @@ -125,6 +133,14 @@ void drawUI(NVGcontext *vg, int item, int x, int y) { | |||||
| cornerFlags(item),(BNDwidgetState)uiGetState(item), | cornerFlags(item),(BNDwidgetState)uiGetState(item), | ||||
| data->iconid,data->label); | data->iconid,data->label); | ||||
| } break; | } break; | ||||
| case ST_CHECK: { | |||||
| const UICheckData *data = (UICheckData*)head; | |||||
| BNDwidgetState state = (BNDwidgetState)uiGetState(item); | |||||
| if (*data->option) | |||||
| state = BND_ACTIVE; | |||||
| bndOptionButton(vg,rect.x,rect.y,rect.w,rect.h, state, | |||||
| data->label); | |||||
| } break; | |||||
| case ST_RADIO:{ | case ST_RADIO:{ | ||||
| const UIRadioData *data = (UIRadioData*)head; | const UIRadioData *data = (UIRadioData*)head; | ||||
| BNDwidgetState state = (BNDwidgetState)uiGetState(item); | BNDwidgetState state = (BNDwidgetState)uiGetState(item); | ||||
| @@ -191,6 +207,30 @@ int button(int parent, UIhandle handle, int iconid, const char *label, | |||||
| return item; | return item; | ||||
| } | } | ||||
| void checkhandler(int item, UIevent event) { | |||||
| const UICheckData *data = (const UICheckData *)uiGetData(item); | |||||
| *data->option = !(*data->option); | |||||
| } | |||||
| int check(int parent, UIhandle handle, const char *label, int *option) { | |||||
| // create new ui item | |||||
| int item = uiItem(); | |||||
| // set persistent handle for item that is used | |||||
| // to track activity over time | |||||
| uiSetHandle(item, handle); | |||||
| // set size of wiget; horizontal size is dynamic, vertical is fixed | |||||
| uiSetSize(item, 0, BND_WIDGET_HEIGHT); | |||||
| // attach event handler e.g. demohandler above | |||||
| uiSetHandler(item, checkhandler, UI_BUTTON0_DOWN); | |||||
| // store some custom data with the button that we use for styling | |||||
| UICheckData *data = (UICheckData *)uiAllocData(item, sizeof(UICheckData)); | |||||
| data->head.subtype = ST_CHECK; | |||||
| data->label = label; | |||||
| data->option = option; | |||||
| uiAppend(parent, item); | |||||
| return item; | |||||
| } | |||||
| // simple logic for a slider | // simple logic for a slider | ||||
| // starting offset of the currently active slider | // starting offset of the currently active slider | ||||
| @@ -569,6 +609,12 @@ void draw(NVGcontext *vg, float w, float h) { | |||||
| button(col, 11, BND_ICONID(6,3), "Item 5", NULL); | button(col, 11, BND_ICONID(6,3), "Item 5", NULL); | ||||
| static int option1,option2,option3; | |||||
| check(col, 12, "Item 6", &option1); | |||||
| check(col, 13, "Item 7", &option2); | |||||
| check(col, 14, "Item 8", &option3); | |||||
| uiProcess(); | uiProcess(); | ||||