diff --git a/examples/ui_style_test/main.c b/examples/ui_style_test/main.c index d70207a..7dc3287 100644 --- a/examples/ui_style_test/main.c +++ b/examples/ui_style_test/main.c @@ -204,98 +204,6 @@ void widget_end_view(void) #define widget_view(s) defer_loop(widget_begin_view(s), widget_end_view()) - -void panel_begin(char* str, ui_flags flags) -{ - ui_box* box = ui_box_begin(str, flags | UI_FLAG_CLIP | UI_FLAG_BLOCK_MOUSE); - - ui_style contentsStyle = { - .size.width = {UI_SIZE_CHILDREN}, - .size.height = {UI_SIZE_CHILDREN}, - .floating.x = true, - .floating.y = true, - .floatTarget = {-box->scroll.x, -box->scroll.y}}; - - ui_style_next(&contentsStyle, UI_STYLE_FLOAT); - ui_box_begin("contents", 0); - -} - -void panel_end(void) -{ - ui_box* contents = ui_box_top(); - ui_box_end(); - - ui_box* panel = ui_box_top(); - ui_sig sig = ui_box_sig(panel); - - f32 contentsW = ClampLowBound(contents->rect.w, panel->rect.w); - f32 contentsH = ClampLowBound(contents->rect.h, panel->rect.h); - - contentsW = ClampLowBound(contentsW, 1); - contentsH = ClampLowBound(contentsH, 1); - - ui_box* scrollBarX = 0; - ui_box* scrollBarY = 0; - - bool needsScrollX = contentsW > panel->rect.w; - bool needsScrollY = contentsH > panel->rect.h; - - if(needsScrollX) - { - f32 thumbRatioX = panel->rect.w / contentsW; - f32 sliderX = panel->scroll.x /(contentsW - panel->rect.w); - - ui_style_next(&(ui_style){.size.width = {UI_SIZE_PARENT, 1., 0}, - .size.height = {UI_SIZE_PIXELS, 10, 0}, - .floating.x = true, - .floating.y = true, - .floatTarget = {0, panel->rect.h - 10}}, - UI_STYLE_SIZE - |UI_STYLE_FLOAT); - - scrollBarX = ui_slider("scrollerX", thumbRatioX, &sliderX); - - panel->scroll.x = sliderX * (contentsW - panel->rect.w); - if(sig.hovering) - { - panel->scroll.x += sig.wheel.x; - ui_box_activate(scrollBarX); - } - } - - if(needsScrollY) - { - f32 thumbRatioY = panel->rect.h / contentsH; - f32 sliderY = panel->scroll.y /(contentsH - panel->rect.h); - - f32 spacerSize = needsScrollX ? 10 : 0; - - ui_style_next(&(ui_style){.size.width = {UI_SIZE_PIXELS, 10, 0}, - .size.height = {UI_SIZE_PARENT_MINUS_PIXELS, spacerSize, 0}, - .floating.x = true, - .floating.y = true, - .floatTarget = {panel->rect.w - 10, 0}}, - UI_STYLE_SIZE - |UI_STYLE_FLOAT); - - scrollBarY = ui_slider("scrollerY", thumbRatioY, &sliderY); - - panel->scroll.y = sliderY * (contentsH - panel->rect.h); - if(sig.hovering) - { - panel->scroll.y += sig.wheel.y; - ui_box_activate(scrollBarY); - } - } - panel->scroll.x = Clamp(panel->scroll.x, 0, contentsW - panel->rect.w); - panel->scroll.y = Clamp(panel->scroll.y, 0, contentsH - panel->rect.h); - - ui_box_end(); -} - -#define panel(s, f) defer_loop(panel_begin(s, f), panel_end()) - int main() { LogLevel(LOG_LEVEL_WARNING); @@ -519,7 +427,7 @@ int main() } } } -/* + ui_style_next(&(ui_style){.size.width = {UI_SIZE_PARENT, 0.5}, .size.height = {UI_SIZE_PARENT, 1}}, UI_STYLE_SIZE); @@ -561,7 +469,7 @@ int main() UI_STYLE_SIZE |UI_STYLE_LAYOUT_AXIS); - panel("Panel", UI_FLAG_DRAW_BORDER) + ui_panel("Panel", UI_FLAG_DRAW_BORDER) { ui_style_next(&(ui_style){.layout.axis = UI_AXIS_X}, UI_STYLE_LAYOUT_AXIS); @@ -593,7 +501,7 @@ int main() } } - }*/ + } } } } diff --git a/src/ui.c b/src/ui.c index 877e080..3fbcd9d 100644 --- a/src/ui.c +++ b/src/ui.c @@ -1040,8 +1040,7 @@ void ui_layout_downward_dependent_size(ui_context* ui, ui_box* box, int axis) void ui_layout_upward_dependent_size(ui_context* ui, ui_box* box, int axis) { - //NOTE: compute size of children that depend on box's size, and also compute - // total children sum and total slack available in layout axis + //NOTE: re-compute/set size of children that depend on box's size f32 margin = box->style.layout.margin.c[axis]; f32 availableSize = maximum(0, box->rect.c[2+axis] - box->spacing[axis] - 2*margin); @@ -1662,25 +1661,31 @@ ui_box* ui_slider(const char* label, f32 thumbRatio, f32* scrollValue) return(frame); } -/* -ui_box* ui_panel_begin(const char* name) +void ui_panel_begin(const char* str, ui_flags flags) { - ui_flags panelFlags = UI_FLAG_DRAW_BACKGROUND - | UI_FLAG_DRAW_BORDER - | UI_FLAG_CLIP - | UI_FLAG_BLOCK_MOUSE; - ui_box* panel = ui_box_begin(name, panelFlags); + ui_box* box = ui_box_begin(str, flags | UI_FLAG_CLIP | UI_FLAG_BLOCK_MOUSE); - return(panel); + ui_style contentsStyle = { + .size.width = {UI_SIZE_CHILDREN}, + .size.height = {UI_SIZE_CHILDREN}, + .floating.x = true, + .floating.y = true, + .floatTarget = {-box->scroll.x, -box->scroll.y}}; + + ui_style_next(&contentsStyle, UI_STYLE_FLOAT); + ui_box_begin("contents", 0); } -void ui_panel_end() +void ui_panel_end(void) { + ui_box* contents = ui_box_top(); + ui_box_end(); + ui_box* panel = ui_box_top(); ui_sig sig = ui_box_sig(panel); - f32 contentsW = ClampLowBound(panel->childrenSum[0], panel->rect.w); - f32 contentsH = ClampLowBound(panel->childrenSum[1], panel->rect.h); + f32 contentsW = ClampLowBound(contents->rect.w, panel->rect.w); + f32 contentsH = ClampLowBound(contents->rect.h, panel->rect.h); contentsW = ClampLowBound(contentsW, 1); contentsH = ClampLowBound(contentsH, 1); @@ -1688,14 +1693,23 @@ void ui_panel_end() ui_box* scrollBarX = 0; ui_box* scrollBarY = 0; - if(contentsW > panel->rect.w) + bool needsScrollX = contentsW > panel->rect.w; + bool needsScrollY = contentsH > panel->rect.h; + + if(needsScrollX) { f32 thumbRatioX = panel->rect.w / contentsW; f32 sliderX = panel->scroll.x /(contentsW - panel->rect.w); - scrollBarX = ui_scrollbar("scrollerX", thumbRatioX, &sliderX); -// ui_box_set_size(scrollBarX, UI_AXIS_X, UI_SIZE_PARENT, 1., 0); -// ui_box_set_size(scrollBarX, UI_AXIS_Y, UI_SIZE_PIXELS, 10, 0); + ui_style_next(&(ui_style){.size.width = {UI_SIZE_PARENT, 1., 0}, + .size.height = {UI_SIZE_PIXELS, 10, 0}, + .floating.x = true, + .floating.y = true, + .floatTarget = {0, panel->rect.h - 10}}, + UI_STYLE_SIZE + |UI_STYLE_FLOAT); + + scrollBarX = ui_slider("scrollerX", thumbRatioX, &sliderX); panel->scroll.x = sliderX * (contentsW - panel->rect.w); if(sig.hovering) @@ -1705,14 +1719,22 @@ void ui_panel_end() } } - if(contentsH > panel->rect.h) + if(needsScrollY) { f32 thumbRatioY = panel->rect.h / contentsH; f32 sliderY = panel->scroll.y /(contentsH - panel->rect.h); - scrollBarY = ui_scrollbar("scrollerY", thumbRatioY, &sliderY); -// ui_box_set_size(scrollBarY, UI_AXIS_X, UI_SIZE_PIXELS, 10, 0); -// ui_box_set_size(scrollBarY, UI_AXIS_Y, UI_SIZE_PARENT, 1., 0); + f32 spacerSize = needsScrollX ? 10 : 0; + + ui_style_next(&(ui_style){.size.width = {UI_SIZE_PIXELS, 10, 0}, + .size.height = {UI_SIZE_PARENT_MINUS_PIXELS, spacerSize, 0}, + .floating.x = true, + .floating.y = true, + .floatTarget = {panel->rect.w - 10, 0}}, + UI_STYLE_SIZE + |UI_STYLE_FLOAT); + + scrollBarY = ui_slider("scrollerY", thumbRatioY, &sliderY); panel->scroll.y = sliderY * (contentsH - panel->rect.h); if(sig.hovering) @@ -1721,25 +1743,13 @@ void ui_panel_end() ui_box_activate(scrollBarY); } } - panel->scroll.x = Clamp(panel->scroll.x, 0, contentsW - panel->rect.w); panel->scroll.y = Clamp(panel->scroll.y, 0, contentsH - panel->rect.h); - if(scrollBarX) - { -// ui_box_set_floating(scrollBarX, UI_AXIS_X, panel->scroll.x); -// ui_box_set_floating(scrollBarX, UI_AXIS_Y, panel->scroll.y + panel->rect.h - 12); - } - - if(scrollBarY) - { -// ui_box_set_floating(scrollBarY, UI_AXIS_X, panel->scroll.x + panel->rect.w - 12); -// ui_box_set_floating(scrollBarY, UI_AXIS_Y, panel->scroll.y); - } - ui_box_end(); } -*/ + +/* ui_sig ui_tooltip_begin(const char* name) { @@ -1773,17 +1783,17 @@ void ui_menu_bar_begin(const char* name) // ui_box_set_size(bar, UI_AXIS_X, UI_SIZE_PARENT, 1., 0); // ui_box_set_size(bar, UI_AXIS_Y, UI_SIZE_CHILDREN, 0, 0); //ui_box_set_layout(bar, UI_AXIS_X, UI_ALIGN_START, UI_ALIGN_START); -/* - ui_push_size(UI_AXIS_X, UI_SIZE_TEXT, 0, 0); - ui_push_size(UI_AXIS_Y, UI_SIZE_TEXT, 0, 0); -*/ + +// ui_push_size(UI_AXIS_X, UI_SIZE_TEXT, 0, 0); +// ui_push_size(UI_AXIS_Y, UI_SIZE_TEXT, 0, 0); + ui_sig sig = ui_box_sig(bar); if(!sig.hovering && mp_mouse_released(MP_MOUSE_LEFT)) { ui_box_deactivate(bar); } } - +*/ void ui_menu_bar_end(void) { /* diff --git a/src/ui.h b/src/ui.h index 7b73ee2..88bdae4 100644 --- a/src/ui.h +++ b/src/ui.h @@ -433,9 +433,9 @@ ui_sig ui_button(const char* label); ui_box* ui_slider(const char* label, f32 thumbRatio, f32* scrollValue); ui_box* ui_scrollbar(const char* label, f32 thumbRatio, f32* scrollValue); -ui_box* ui_panel_begin(const char* name); +void ui_panel_begin(const char* name, ui_flags flags); void ui_panel_end(void); -#define ui_panel(name) defer_loop(ui_panel_begin(name), ui_panel_end()) +#define ui_panel(s, f) defer_loop(ui_panel_begin(s, f), ui_panel_end()) ui_sig ui_tooltip_begin(const char* name); void ui_tooltip_end(void);