From 048438b587fe43cc2e40e1a37ecebae196bed354 Mon Sep 17 00:00:00 2001 From: vurtun Date: Sat, 9 May 2015 19:42:31 +0200 Subject: [PATCH] fixed shelf scrolling + added addition screenshot --- Readme.md | 1 + config.png | Bin 0 -> 6918 bytes demo/demo.c | 20 +++++++++++--------- gui.c | 48 ++++++++++++++++++++++++------------------------ gui.h | 5 ++--- 5 files changed, 38 insertions(+), 36 deletions(-) create mode 100644 config.png diff --git a/Readme.md b/Readme.md index 0c7397c..f9435a1 100644 --- a/Readme.md +++ b/Readme.md @@ -26,6 +26,7 @@ Summary: It is only responsible for the actual user interface ## Gallery ![gui screenshot](/demo.png?raw=true) +![gui screenshot](/config.png?raw=true) ## Example ```c diff --git a/config.png b/config.png new file mode 100644 index 0000000000000000000000000000000000000000..eef247852c713c5b53ee3ae0fb043990d68157fe GIT binary patch literal 6918 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 = gui_panel_tab_begin(panel, &tab, "Color", control->color_min); if (control->picker_act) { @@ -258,7 +259,7 @@ color_tab(struct gui_panel_layout *panel, struct control_window *control, struct gui_panel_row(&tab, 30, 3); gui_panel_seperator(&tab, 1); if (gui_panel_button_text(&tab, "ok", GUI_BUTTON_DEFAULT)) { - config->colors[i] = control->color; + config->colors[control->current] = control->color; control->picker_act = gui_false; } if (gui_panel_button_text(&tab, "cancel", GUI_BUTTON_DEFAULT)) @@ -267,11 +268,12 @@ color_tab(struct gui_panel_layout *panel, struct control_window *control, struct gui_panel_row(&tab, 30, 2); for (i = 0; i < GUI_COLOR_COUNT; ++i) { struct gui_panel_layout layout; - gui_panel_label(&tab, labels[i], GUI_TEXT_CENTERED); + gui_panel_label(&tab, labels[i], GUI_TEXT_LEFT); if (gui_panel_button_color(&tab, config->colors[i], GUI_BUTTON_DEFAULT)) { if (!control->picker_act) { control->picker_act = gui_true; control->color = config->colors[i]; + control->current = i; } else continue; } } diff --git a/gui.c b/gui.c index a62c855..ae6df11 100644 --- a/gui.c +++ b/gui.c @@ -678,7 +678,7 @@ gui_buffer_input(gui_char *buffer, gui_size length, gui_size max, gui_size gui_edit(const struct gui_canvas *canvas, gui_float x, gui_float y, gui_float w, gui_float h, gui_char *buffer, gui_size len, gui_size max, gui_bool *active, - const struct gui_input_field *field, const struct gui_input *in, const struct gui_font *font) + const struct gui_edit *field, const struct gui_input *in, const struct gui_font *font) { gui_float input_w, input_h; gui_bool input_active; @@ -1232,10 +1232,9 @@ gui_default_config(struct gui_config *config) vec2_load(config->item_spacing, 10.0f, 4.0f); vec2_load(config->item_padding, 4.0f, 4.0f); vec2_load(config->scaler_size, 16.0f, 16.0f); - /*col_load(config->colors[GUI_COLOR_TEXT], 200, 200, 200, 255);*/ col_load(config->colors[GUI_COLOR_TEXT], 100, 100, 100, 255); col_load(config->colors[GUI_COLOR_PANEL], 45, 45, 45, 255); - /*col_load(config->colors[GUI_COLOR_HEADER], 76, 88, 68, 255);*/ + col_load(config->colors[GUI_COLOR_HEADER], 76, 88, 68, 255); col_load(config->colors[GUI_COLOR_HEADER], 45, 45, 45, 255); col_load(config->colors[GUI_COLOR_BORDER], 100, 100, 100, 255); col_load(config->colors[GUI_COLOR_BUTTON], 50, 50, 50, 255); @@ -1951,26 +1950,25 @@ gui_panel_edit(struct gui_panel_layout *layout, gui_char *buffer, gui_size len, { struct gui_rect *c; struct gui_rect bounds; - struct gui_input_field field; + struct gui_edit field; const struct gui_config *config; ASSERT(layout); ASSERT(layout->config); ASSERT(layout->canvas); - if (!layout || !layout->config || !layout->canvas) return 0; - if (!layout->valid) return 0; + if (!layout || !layout->config || !layout->canvas) return len; + if (!layout->valid) return len; gui_panel_alloc_space(&bounds, layout); config = layout->config; c = &layout->clip; if (!INTERSECT(c->x, c->y, c->w, c->h, bounds.x, bounds.y, bounds.w, bounds.h)) - return 0; + return len; field.padding.x = config->item_padding.x; field.padding.y = config->item_padding.y; field.filter = filter; field.show_cursor = gui_true; - field.font = config->colors[GUI_COLOR_TEXT]; field.background = config->colors[GUI_COLOR_INPUT]; field.foreground = config->colors[GUI_COLOR_INPUT_BORDER]; return gui_edit(layout->canvas, bounds.x, bounds.y, bounds.w, bounds.h, @@ -1983,7 +1981,7 @@ gui_panel_shell(struct gui_panel_layout *layout, gui_char *buffer, gui_size *len { struct gui_rect *c; struct gui_rect bounds; - struct gui_input_field field; + struct gui_edit field; struct gui_button button; gui_float button_x, button_y; gui_float button_w, button_h; @@ -1997,13 +1995,13 @@ gui_panel_shell(struct gui_panel_layout *layout, gui_char *buffer, gui_size *len ASSERT(layout->config); ASSERT(layout->canvas); - if (!layout || !layout->config || !layout->canvas) return 0; - if (!layout->valid) return 0; + if (!layout || !layout->config || !layout->canvas) return *active; + if (!layout->valid) return *active; gui_panel_alloc_space(&bounds, layout); config = layout->config; c = &layout->clip; if (!INTERSECT(c->x, c->y, c->w, c->h, bounds.x, bounds.y, bounds.w, bounds.h)) - return 0; + return *active; width = layout->font.width(layout->font.userdata, (const gui_char*)"submit", 6); button.border = 1; @@ -2030,7 +2028,6 @@ gui_panel_shell(struct gui_panel_layout *layout, gui_char *buffer, gui_size *len field.padding.y = config->item_padding.y; field.filter = GUI_INPUT_DEFAULT; field.show_cursor = gui_true; - field.font = config->colors[GUI_COLOR_TEXT]; field.background = config->colors[GUI_COLOR_INPUT]; field.foreground = config->colors[GUI_COLOR_INPUT_BORDER]; *len = gui_edit(layout->canvas, field_x, field_y, field_w, field_h, buffer, @@ -2046,7 +2043,7 @@ gui_panel_spinner(struct gui_panel_layout *layout, gui_int min, gui_int value, struct gui_rect *c; const struct gui_config *config; const struct gui_canvas *canvas; - struct gui_input_field field; + struct gui_edit field; char string[MAX_NUMBER_BUFFER]; gui_size len, old_len; @@ -2106,7 +2103,6 @@ gui_panel_spinner(struct gui_panel_layout *layout, gui_int min, gui_int value, field.padding.y = config->item_padding.y; field.filter = GUI_INPUT_FLOAT; field.show_cursor = gui_false; - field.font = config->colors[GUI_COLOR_TEXT]; field.background = config->colors[GUI_COLOR_SPINNER]; field.foreground = config->colors[GUI_COLOR_SPINNER_BORDER]; len = gui_edit(canvas, field_x, field_y, field_w, field_h, (gui_char*)string, @@ -2142,14 +2138,14 @@ gui_panel_selector(struct gui_panel_layout *layout, const char *items[], ASSERT(item_count); ASSERT(item_current < item_count); - if (!layout || !layout->config || !layout->canvas) return 0; - if (!layout->valid) return 0; + if (!layout || !layout->config || !layout->canvas) return item_current; + if (!layout->valid) return item_current; gui_panel_alloc_space(&bounds, layout); config = layout->config; canvas = layout->canvas; c = &layout->clip; if (!INTERSECT(c->x, c->y, c->w, c->h, bounds.x, bounds.y, bounds.w, bounds.h)) - return 0; + return item_current; canvas->draw_rect(canvas->userdata, bounds.x, bounds.y, bounds.w, bounds.h, config->colors[GUI_COLOR_SELECTOR_BORDER]); @@ -2319,6 +2315,9 @@ gui_panel_graph_push_histo(struct gui_panel_layout *layout, gui_bool gui_panel_graph_push(struct gui_panel_layout *layout, struct gui_graph *graph, gui_float value) { + ASSERT(layout); + ASSERT(graph); + if (!layout || !graph || !layout->valid) return gui_false; if (graph->type == GUI_GRAPH_LINES) return gui_panel_graph_push_line(layout, graph, value); else if (graph->type == GUI_GRAPH_HISTO) @@ -2355,7 +2354,7 @@ gui_panel_graph(struct gui_panel_layout *layout, enum gui_graph_type type, ASSERT(layout); ASSERT(values); ASSERT(count); - if (!layout || !values || !count) + if (!layout || !layout->valid || !values || !count) return -1; max_value = values[0]; @@ -2390,7 +2389,7 @@ gui_panel_graph_ex(struct gui_panel_layout *layout, enum gui_graph_type type, ASSERT(layout); ASSERT(get_value); ASSERT(count); - if (!layout || !get_value || !count) + if (!layout || !layout->valid || !get_value || !count) return -1; max_value = get_value(userdata, 0); @@ -2678,9 +2677,10 @@ gui_panel_shelf_begin(struct gui_panel_layout *parent, struct gui_panel_layout * bounds.h -= header_h; flags = GUI_PANEL_BORDER|GUI_PANEL_SCROLLBAR|GUI_PANEL_TAB|GUI_PANEL_NO_HEADER; - gui_panel_init(&panel, bounds.x,bounds.y,bounds.w,bounds.h,flags,parent->config,&parent->font); - gui_panel_begin(shelf, &panel, NULL, parent->canvas, parent->input); + gui_panel_init(&panel, bounds.x, bounds.y, bounds.w, bounds.h, flags, config, &parent->font); + gui_panel_begin(shelf, &panel, NULL, canvas, parent->input); shelf->offset = offset; + unify(&clip, &parent->clip, shelf->clip.x, shelf->clip.y, shelf->clip.x + shelf->clip.w, shelf->clip.y + shelf->clip.h); canvas->scissor(canvas->userdata, clip.x, clip.y, clip.w, clip.h); @@ -2715,7 +2715,7 @@ gui_panel_shelf_end(struct gui_panel_layout *parent, struct gui_panel_layout *sh canvas->scissor(canvas->userdata, clip.x, clip.y, clip.w, clip.h); gui_panel_end(shelf, &panel); canvas->scissor(canvas->userdata, parent->clip.x,parent->clip.y,parent->clip.w,parent->clip.h); - return shelf->offset; + return panel.offset; } void @@ -2751,7 +2751,7 @@ gui_panel_end(struct gui_panel_layout *layout, struct gui_panel *panel) scroll.foreground = config->colors[GUI_COLOR_SCROLLBAR_CURSOR]; scroll.border = config->colors[GUI_COLOR_SCROLLBAR_BORDER]; if (panel->flags & GUI_PANEL_BORDER) scroll_h -= 1; - scroll_target = (layout->at_y - layout->y) - layout->header_height; + scroll_target = (layout->at_y - layout->y) - (layout->header_height + 2 * config->item_spacing.y); panel->offset = gui_scroll(canvas, scroll_x, scroll_y, scroll_w, scroll_h, scroll_offset, scroll_target, scroll_step, &scroll, layout->input); diff --git a/gui.h b/gui.h index b4c4f56..cdee83d 100644 --- a/gui.h +++ b/gui.h @@ -150,13 +150,12 @@ enum gui_input_filter { GUI_INPUT_BIN }; -struct gui_input_field { +struct gui_edit { struct gui_vec2 padding; gui_bool show_cursor; enum gui_input_filter filter; struct gui_color background; struct gui_color foreground; - struct gui_color font; }; enum gui_graph_type { @@ -509,7 +508,7 @@ gui_size gui_progress(const struct gui_canvas*, gui_float x, gui_float y, gui_fl const struct gui_slider*, const struct gui_input*); gui_size gui_edit(const struct gui_canvas*, gui_float x, gui_float y, gui_float w, gui_float h, gui_char*, gui_size, gui_size max, gui_bool*, - const struct gui_input_field*, const struct gui_input*, const struct gui_font*); + const struct gui_edit*, const struct gui_input*, const struct gui_font*); gui_float gui_scroll(const struct gui_canvas*, gui_float x, gui_float y, gui_float w, gui_float h, gui_float offset, gui_float target, gui_float step, const struct gui_scroll*, const struct gui_input*);