|
|
@@ -46,6 +46,9 @@ typedef enum { |
|
|
|
ST_DEMOSTUFF = 10, |
|
|
|
// colored rectangle |
|
|
|
ST_RECT = 11, |
|
|
|
|
|
|
|
ST_HBOX = 12, |
|
|
|
ST_VBOX = 13, |
|
|
|
} SubType; |
|
|
|
|
|
|
|
typedef struct { |
|
|
@@ -118,7 +121,52 @@ void testrect(NVGcontext *vg, UIrect rect) { |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
void drawUI(NVGcontext *vg, int item) { |
|
|
|
|
|
|
|
void drawUI(NVGcontext *vg, int item, int corners); |
|
|
|
|
|
|
|
void drawUIItems(NVGcontext *vg, int item, int corners) { |
|
|
|
int kid = uiFirstChild(item); |
|
|
|
while (kid > 0) { |
|
|
|
drawUI(vg, kid, corners); |
|
|
|
kid = uiNextSibling(kid); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void drawUIItemsHbox(NVGcontext *vg, int item) { |
|
|
|
int kid = uiFirstChild(item); |
|
|
|
if (kid < 0) return; |
|
|
|
int nextkid = uiNextSibling(kid); |
|
|
|
if (nextkid < 0) { |
|
|
|
drawUI(vg, kid, BND_CORNER_NONE); |
|
|
|
} else { |
|
|
|
drawUI(vg, kid, BND_CORNER_RIGHT); |
|
|
|
kid = nextkid; |
|
|
|
while (uiNextSibling(kid) > 0) { |
|
|
|
drawUI(vg, kid, BND_CORNER_ALL); |
|
|
|
kid = uiNextSibling(kid); |
|
|
|
} |
|
|
|
drawUI(vg, kid, BND_CORNER_LEFT); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void drawUIItemsVbox(NVGcontext *vg, int item) { |
|
|
|
int kid = uiFirstChild(item); |
|
|
|
if (kid < 0) return; |
|
|
|
int nextkid = uiNextSibling(kid); |
|
|
|
if (nextkid < 0) { |
|
|
|
drawUI(vg, kid, BND_CORNER_NONE); |
|
|
|
} else { |
|
|
|
drawUI(vg, kid, BND_CORNER_DOWN); |
|
|
|
kid = nextkid; |
|
|
|
while (uiNextSibling(kid) > 0) { |
|
|
|
drawUI(vg, kid, BND_CORNER_ALL); |
|
|
|
kid = uiNextSibling(kid); |
|
|
|
} |
|
|
|
drawUI(vg, kid, BND_CORNER_TOP); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void drawUI(NVGcontext *vg, int item, int corners) { |
|
|
|
const UIData *head = (const UIData *)uiGetHandle(item); |
|
|
|
UIrect rect = uiGetRect(item); |
|
|
|
if (uiGetState(item) == UI_FROZEN) { |
|
|
@@ -128,9 +176,17 @@ void drawUI(NVGcontext *vg, int item) { |
|
|
|
switch(head->subtype) { |
|
|
|
default: { |
|
|
|
testrect(vg,rect); |
|
|
|
drawUIItems(vg,item,corners); |
|
|
|
} break; |
|
|
|
case ST_HBOX: { |
|
|
|
drawUIItemsHbox(vg, item); |
|
|
|
} break; |
|
|
|
case ST_VBOX: { |
|
|
|
drawUIItemsVbox(vg, item); |
|
|
|
} break; |
|
|
|
case ST_PANEL: { |
|
|
|
bndBevel(vg,rect.x,rect.y,rect.w,rect.h); |
|
|
|
drawUIItems(vg,item,corners); |
|
|
|
} break; |
|
|
|
case ST_LABEL: { |
|
|
|
assert(head); |
|
|
@@ -141,7 +197,7 @@ void drawUI(NVGcontext *vg, int item) { |
|
|
|
case ST_BUTTON: { |
|
|
|
const UIButtonData *data = (UIButtonData*)head; |
|
|
|
bndToolButton(vg,rect.x,rect.y,rect.w,rect.h, |
|
|
|
BND_CORNER_NONE,(BNDwidgetState)uiGetState(item), |
|
|
|
corners,(BNDwidgetState)uiGetState(item), |
|
|
|
data->iconid,data->label); |
|
|
|
} break; |
|
|
|
case ST_CHECK: { |
|
|
@@ -158,7 +214,7 @@ void drawUI(NVGcontext *vg, int item) { |
|
|
|
if (*data->value == item) |
|
|
|
state = BND_ACTIVE; |
|
|
|
bndRadioButton(vg,rect.x,rect.y,rect.w,rect.h, |
|
|
|
BND_CORNER_NONE,state, |
|
|
|
corners,state, |
|
|
|
data->iconid,data->label); |
|
|
|
} break; |
|
|
|
case ST_SLIDER:{ |
|
|
@@ -167,7 +223,7 @@ void drawUI(NVGcontext *vg, int item) { |
|
|
|
static char value[32]; |
|
|
|
sprintf(value,"%.0f%%",(*data->progress)*100.0f); |
|
|
|
bndSlider(vg,rect.x,rect.y,rect.w,rect.h, |
|
|
|
BND_CORNER_NONE,state, |
|
|
|
corners,state, |
|
|
|
*data->progress,data->label,value); |
|
|
|
} break; |
|
|
|
case ST_TEXT: { |
|
|
@@ -175,7 +231,7 @@ void drawUI(NVGcontext *vg, int item) { |
|
|
|
BNDwidgetState state = (BNDwidgetState)uiGetState(item); |
|
|
|
int idx = strlen(data->text); |
|
|
|
bndTextField(vg,rect.x,rect.y,rect.w,rect.h, |
|
|
|
BND_CORNER_NONE,state, -1, data->text, idx, idx); |
|
|
|
corners,state, -1, data->text, idx, idx); |
|
|
|
} break; |
|
|
|
case ST_DEMOSTUFF: { |
|
|
|
draw_demostuff(vg, rect.x, rect.y, rect.w, rect.h); |
|
|
@@ -209,22 +265,15 @@ void drawUI(NVGcontext *vg, int item) { |
|
|
|
} |
|
|
|
nvgSave(vg); |
|
|
|
nvgIntersectScissor(vg, rect.x, rect.y, rect.w, rect.h); |
|
|
|
|
|
|
|
drawUIItems(vg,item,corners); |
|
|
|
|
|
|
|
nvgRestore(vg); |
|
|
|
} break; |
|
|
|
} |
|
|
|
} else { |
|
|
|
testrect(vg,rect); |
|
|
|
} |
|
|
|
|
|
|
|
int kid = uiFirstChild(item); |
|
|
|
while (kid > 0) { |
|
|
|
drawUI(vg, kid); |
|
|
|
kid = uiNextSibling(kid); |
|
|
|
} |
|
|
|
|
|
|
|
if (head) { |
|
|
|
if (head->subtype == ST_RECT) { |
|
|
|
nvgRestore(vg); |
|
|
|
} |
|
|
|
drawUIItems(vg,item,corners); |
|
|
|
} |
|
|
|
|
|
|
|
if (uiGetState(item) == UI_FROZEN) { |
|
|
@@ -414,6 +463,24 @@ int panel() { |
|
|
|
return item; |
|
|
|
} |
|
|
|
|
|
|
|
int hbox() { |
|
|
|
int item = uiItem(); |
|
|
|
UIData *data = (UIData *)uiAllocHandle(item, sizeof(UIData)); |
|
|
|
data->subtype = ST_HBOX; |
|
|
|
uiSetBox(item, UI_ROW); |
|
|
|
return item; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int vbox() { |
|
|
|
int item = uiItem(); |
|
|
|
UIData *data = (UIData *)uiAllocHandle(item, sizeof(UIData)); |
|
|
|
data->subtype = ST_VBOX; |
|
|
|
uiSetBox(item, UI_COLUMN); |
|
|
|
return item; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int column_append(int parent, int item) { |
|
|
|
uiInsert(parent, item); |
|
|
|
// fill parent horizontally, anchor to previous item vertically |
|
|
@@ -722,27 +789,27 @@ void build_democontent(int parent) { |
|
|
|
column_append(col, button(BND_ICONID(6,3), "Item 2", demohandler)); |
|
|
|
|
|
|
|
{ |
|
|
|
int h = column_append(col, hgroup()); |
|
|
|
int h = column_append(col, hbox()); |
|
|
|
hgroup_append(h, radio(BND_ICONID(6,3), "Item 3.0", &enum1)); |
|
|
|
uiSetMargins(hgroup_append_fixed(h, radio(BND_ICONID(0,10), NULL, &enum1)), 1,0,0,0); |
|
|
|
uiSetMargins(hgroup_append_fixed(h, radio(BND_ICONID(1,10), NULL, &enum1)), 1,0,0,0); |
|
|
|
uiSetMargins(hgroup_append(h, radio(BND_ICONID(6,3), "Item 3.3", &enum1)), 1,0,0,0); |
|
|
|
uiSetMargins(hgroup_append_fixed(h, radio(BND_ICONID(0,10), NULL, &enum1)), -1,0,0,0); |
|
|
|
uiSetMargins(hgroup_append_fixed(h, radio(BND_ICONID(1,10), NULL, &enum1)), -1,0,0,0); |
|
|
|
uiSetMargins(hgroup_append(h, radio(BND_ICONID(6,3), "Item 3.3", &enum1)), -1,0,0,0); |
|
|
|
} |
|
|
|
|
|
|
|
{ |
|
|
|
int rows = column_append(col, row()); |
|
|
|
int coll = row_append(rows, vgroup()); |
|
|
|
vgroup_append(coll, label(-1, "Items 4.0:")); |
|
|
|
coll = vgroup_append(coll, vgroup()); |
|
|
|
coll = vgroup_append(coll, vbox()); |
|
|
|
vgroup_append(coll, button(BND_ICONID(6,3), "Item 4.0.0", demohandler)); |
|
|
|
vgroup_append(coll, button(BND_ICONID(6,3), "Item 4.0.1", demohandler)); |
|
|
|
uiSetMargins(vgroup_append(coll, button(BND_ICONID(6,3), "Item 4.0.1", demohandler)),0,-2,0,0); |
|
|
|
int colr = row_append(rows, vgroup()); |
|
|
|
uiSetMargins(colr, 8, 0, 0, 0); |
|
|
|
uiSetFrozen(colr, option1); |
|
|
|
vgroup_append(colr, label(-1, "Items 4.1:")); |
|
|
|
colr = vgroup_append(colr, vgroup()); |
|
|
|
colr = vgroup_append(colr, vbox()); |
|
|
|
vgroup_append(colr, slider("Item 4.1.0", &progress1)); |
|
|
|
vgroup_append(colr, slider("Item 4.1.1", &progress2)); |
|
|
|
uiSetMargins(vgroup_append(colr, slider("Item 4.1.1", &progress2)),0,-2,0,0); |
|
|
|
} |
|
|
|
|
|
|
|
column_append(col, button(BND_ICONID(6,3), "Item 5", NULL)); |
|
|
@@ -1024,7 +1091,7 @@ void draw(NVGcontext *vg, float w, float h) { |
|
|
|
} |
|
|
|
|
|
|
|
uiLayout(); |
|
|
|
drawUI(vg, 0); |
|
|
|
drawUI(vg, 0, BND_CORNER_NONE); |
|
|
|
|
|
|
|
if (choice == opt_blendish_demo) { |
|
|
|
UIvec2 cursor = uiGetCursor(); |
|
|
|