added align for labels & fixed selecting other panels if one panel is minimized
This commit is contained in:
parent
4b749995d8
commit
3ec9a0de9f
@ -162,16 +162,17 @@ delfont(struct gui_font *font)
|
|||||||
free(font);
|
free(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gui_int
|
||||||
message_panel(struct gui_context *ctx, struct gui_panel *panel)
|
message_panel(struct gui_context *ctx, struct gui_panel *panel)
|
||||||
{
|
{
|
||||||
|
gui_int ret = -1;
|
||||||
gui_begin_panel(ctx, panel, "Error", GUI_PANEL_MOVEABLE|GUI_PANEL_BORDER);
|
gui_begin_panel(ctx, panel, "Error", GUI_PANEL_MOVEABLE|GUI_PANEL_BORDER);
|
||||||
gui_panel_layout(panel, 30, 2);
|
gui_panel_layout(panel, 30, 2);
|
||||||
if (gui_panel_button_text(panel, "ok", GUI_BUTTON_SWITCH))
|
if (gui_panel_button_text(panel, "ok", GUI_BUTTON_SWITCH)) ret = 1;
|
||||||
fprintf(stdout, "ok pressed!\n");
|
if (gui_panel_button_text(panel, "cancel", GUI_BUTTON_SWITCH)) ret = 0;
|
||||||
if (gui_panel_button_text(panel, "cancel", GUI_BUTTON_SWITCH))
|
if (ret != -1) gui_panel_hide(panel);
|
||||||
fprintf(stdout, "cancel pressed!\n");
|
|
||||||
gui_end_panel(ctx, panel, NULL);
|
gui_end_panel(ctx, panel, NULL);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gui_int
|
static gui_int
|
||||||
@ -180,11 +181,13 @@ color_picker_panel(struct gui_context *ctx, struct gui_panel *panel, struct colo
|
|||||||
gui_size i;
|
gui_size i;
|
||||||
gui_int ret = -1;
|
gui_int ret = -1;
|
||||||
gui_byte *ptr = &picker->color.r;
|
gui_byte *ptr = &picker->color.r;
|
||||||
|
const char str[] = "R:G:B:A:";
|
||||||
gui_begin_panel(ctx, panel, "Color Picker", GUI_PANEL_MOVEABLE|GUI_PANEL_BORDER);
|
gui_begin_panel(ctx, panel, "Color Picker", GUI_PANEL_MOVEABLE|GUI_PANEL_BORDER);
|
||||||
gui_panel_layout(panel, 30, 2);
|
gui_panel_layout(panel, 30, 3);
|
||||||
for (i = 0; i < 4; ++i) {
|
for (i = 0; i < 4; ++i) {
|
||||||
gui_int ivalue;
|
gui_int ivalue;
|
||||||
gui_float fvalue = (gui_float)*ptr;
|
gui_float fvalue = (gui_float)*ptr;
|
||||||
|
gui_panel_text(panel, &str[i*2], 2, GUI_TEXT_CENTERED);
|
||||||
fvalue = gui_panel_slider(panel, 0, fvalue, 255.0f, 10.0f, GUI_HORIZONTAL);
|
fvalue = gui_panel_slider(panel, 0, fvalue, 255.0f, 10.0f, GUI_HORIZONTAL);
|
||||||
ivalue = (gui_int)fvalue;
|
ivalue = (gui_int)fvalue;
|
||||||
picker->active[i] = gui_panel_spinner(panel, 0, &ivalue, 255, 1, picker->active[i]);
|
picker->active[i] = gui_panel_spinner(panel, 0, &ivalue, 255, 1, picker->active[i]);
|
||||||
@ -196,6 +199,7 @@ color_picker_panel(struct gui_context *ctx, struct gui_panel *panel, struct colo
|
|||||||
gui_panel_seperator(panel, 1);
|
gui_panel_seperator(panel, 1);
|
||||||
if (gui_panel_button_text(panel, "ok", GUI_BUTTON_SWITCH)) ret = 1;
|
if (gui_panel_button_text(panel, "ok", GUI_BUTTON_SWITCH)) ret = 1;
|
||||||
if (gui_panel_button_text(panel, "cancel", GUI_BUTTON_SWITCH)) ret = 0;
|
if (gui_panel_button_text(panel, "cancel", GUI_BUTTON_SWITCH)) ret = 0;
|
||||||
|
if (ret != -1) gui_panel_hide(panel);
|
||||||
gui_end_panel(ctx, panel, NULL);
|
gui_end_panel(ctx, panel, NULL);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -210,8 +214,8 @@ demo_panel(struct gui_context *ctx, struct gui_panel *panel, struct demo *demo)
|
|||||||
gui_bool running;
|
gui_bool running;
|
||||||
|
|
||||||
running = gui_begin_panel(ctx, panel, "Demo",
|
running = gui_begin_panel(ctx, panel, "Demo",
|
||||||
GUI_PANEL_CLOSEABLE|GUI_PANEL_MINIMIZABLE|
|
GUI_PANEL_CLOSEABLE|GUI_PANEL_MINIMIZABLE|GUI_PANEL_SCALEABLE|
|
||||||
GUI_PANEL_SCALEABLE|GUI_PANEL_MOVEABLE|GUI_PANEL_BORDER);
|
GUI_PANEL_MOVEABLE|GUI_PANEL_BORDER);
|
||||||
|
|
||||||
/* Tabs */
|
/* Tabs */
|
||||||
gui_panel_layout(panel, 100, 1);
|
gui_panel_layout(panel, 100, 1);
|
||||||
|
@ -221,11 +221,11 @@ main(int argc, char *argv[])
|
|||||||
/* ------------------------- GUI --------------------------*/
|
/* ------------------------- GUI --------------------------*/
|
||||||
gui_begin(ctx, (gui_float)width, (gui_float)height);
|
gui_begin(ctx, (gui_float)width, (gui_float)height);
|
||||||
running = demo_panel(ctx, panel, &demo);
|
running = demo_panel(ctx, panel, &demo);
|
||||||
message_panel(ctx, message);
|
if (message_panel(ctx, message) >= 0)
|
||||||
|
fprintf(stdout, "message closed\n");
|
||||||
if (color_picker_panel(ctx, color_panel, &picker) >= 0) {
|
if (color_picker_panel(ctx, color_panel, &picker) >= 0) {
|
||||||
struct gui_color c = picker.color;
|
struct gui_color c = picker.color;
|
||||||
fprintf(stdout, "color picked: {%u, %u, %u, %u}\n", c.r, c.g, c.b, c.a);
|
fprintf(stdout, "color picked: {%u, %u, %u, %u}\n", c.r, c.g, c.b, c.a);
|
||||||
gui_panel_hide(color_panel);
|
|
||||||
}
|
}
|
||||||
gui_end(ctx, &output, NULL);
|
gui_end(ctx, &output, NULL);
|
||||||
/* ---------------------------------------------------------*/
|
/* ---------------------------------------------------------*/
|
||||||
|
59
gui.c
59
gui.c
@ -733,6 +733,7 @@ gui_widget_text(struct gui_draw_buffer *buffer, const struct gui_text *text,
|
|||||||
gui_float label_y;
|
gui_float label_y;
|
||||||
gui_float label_w;
|
gui_float label_w;
|
||||||
gui_float label_h;
|
gui_float label_h;
|
||||||
|
gui_size text_width;
|
||||||
|
|
||||||
assert(buffer);
|
assert(buffer);
|
||||||
assert(text);
|
assert(text);
|
||||||
@ -740,50 +741,25 @@ gui_widget_text(struct gui_draw_buffer *buffer, const struct gui_text *text,
|
|||||||
if (!buffer || !text || !font)
|
if (!buffer || !text || !font)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
label_x = text->x + text->pad_x;
|
text_width = gui_font_text_width(font, (const gui_char*)text->text, text->length);
|
||||||
label_y = text->y + text->pad_y;
|
label_y = text->y + text->pad_y;
|
||||||
label_w = MAX(0, text->w - 2 * text->pad_x);
|
|
||||||
label_h = MAX(0, text->h - 2 * text->pad_y);
|
label_h = MAX(0, text->h - 2 * text->pad_y);
|
||||||
|
if (text->align == GUI_TEXT_LEFT) {
|
||||||
|
label_x = text->x + text->pad_x;
|
||||||
|
label_w = MAX(0, text->w - 2 * text->pad_x);
|
||||||
|
} else if (text->align == GUI_TEXT_CENTERED) {
|
||||||
|
label_w = 2 * text->pad_x + (gui_float)text_width;
|
||||||
|
label_x = text->x + ((text->w/2) - (label_w/2));
|
||||||
|
} else if (text->align == GUI_TEXT_RIGHT) {
|
||||||
|
label_x = MAX(text->x, (text->x + text->w) - (2 * text->pad_x + (gui_float)text_width));
|
||||||
|
label_w = (gui_float)text_width + 2 * text->pad_x;
|
||||||
|
}
|
||||||
|
|
||||||
gui_draw_rectf(buffer, text->x, text->y, text->w, text->h, text->background);
|
gui_draw_rectf(buffer, text->x, text->y, text->w, text->h, text->background);
|
||||||
gui_draw_string(buffer, font, label_x, label_y, label_w, label_h,
|
gui_draw_string(buffer, font, label_x, label_y, label_w, label_h,
|
||||||
text->font, (const gui_char*)text->text, text->length);
|
text->font, (const gui_char*)text->text, text->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
gui_size
|
|
||||||
gui_widget_text_wrap(struct gui_draw_buffer *buffer, const struct gui_text *text,
|
|
||||||
const struct gui_font *font)
|
|
||||||
{
|
|
||||||
gui_size len = 0;
|
|
||||||
gui_size lines = 0;
|
|
||||||
gui_size chars = 0;
|
|
||||||
|
|
||||||
gui_float label_x, label_y;
|
|
||||||
gui_float label_w, label_h;
|
|
||||||
gui_float space;
|
|
||||||
if (!buffer || !text || !font)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
label_x = text->x + text->pad_x;
|
|
||||||
label_y = text->y + text->pad_y;
|
|
||||||
label_w = MAX(0, text->w - 2 * text->pad_x);
|
|
||||||
label_h = MAX(0, text->h - 2 * text->pad_y);
|
|
||||||
|
|
||||||
space = font->height + 2 * text->pad_y;
|
|
||||||
chars = gui_font_chars_in_space(font, (const gui_char*)text->text, text->length, label_w);
|
|
||||||
while (chars && label_h >= space) {
|
|
||||||
lines++;
|
|
||||||
gui_draw_string(buffer, font, label_x, label_y, label_w, space,
|
|
||||||
text->font, (const gui_char*)text->text + len, chars);
|
|
||||||
|
|
||||||
len += chars;
|
|
||||||
label_h -= space;
|
|
||||||
label_y += space;
|
|
||||||
chars = gui_font_chars_in_space(font, (const gui_char*)text->text + chars,
|
|
||||||
text->length - chars, label_w);
|
|
||||||
}
|
|
||||||
return lines;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
gui_widget_image(struct gui_draw_buffer *buffer, const struct gui_image *image)
|
gui_widget_image(struct gui_draw_buffer *buffer, const struct gui_image *image)
|
||||||
{
|
{
|
||||||
@ -1775,7 +1751,8 @@ gui_panel_alloc_space(struct gui_rect *bounds, struct gui_panel *panel)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gui_panel_text(struct gui_panel *panel, const char *str, gui_size len)
|
gui_panel_text(struct gui_panel *panel, const char *str, gui_size len,
|
||||||
|
enum gui_text_align alignment)
|
||||||
{
|
{
|
||||||
struct gui_rect bounds;
|
struct gui_rect bounds;
|
||||||
struct gui_text text;
|
struct gui_text text;
|
||||||
@ -1800,6 +1777,7 @@ gui_panel_text(struct gui_panel *panel, const char *str, gui_size len)
|
|||||||
text.pad_y = config->item_padding.y;
|
text.pad_y = config->item_padding.y;
|
||||||
text.text = str;
|
text.text = str;
|
||||||
text.length = len;
|
text.length = len;
|
||||||
|
text.align = alignment;
|
||||||
text.font = config->colors[GUI_COLOR_TEXT];
|
text.font = config->colors[GUI_COLOR_TEXT];
|
||||||
text.background = config->colors[GUI_COLOR_PANEL];
|
text.background = config->colors[GUI_COLOR_PANEL];
|
||||||
gui_widget_text(panel->out, &text, panel->font);
|
gui_widget_text(panel->out, &text, panel->font);
|
||||||
@ -2820,8 +2798,9 @@ gui_begin_panel(struct gui_context *ctx, struct gui_panel *panel,
|
|||||||
if (in->mouse_down && in->mouse_clicked && inpanel && cpanel != ctx->active) {
|
if (in->mouse_down && in->mouse_clicked && inpanel && cpanel != ctx->active) {
|
||||||
struct gui_context_panel *iter = cpanel->next;
|
struct gui_context_panel *iter = cpanel->next;
|
||||||
while (iter) {
|
while (iter) {
|
||||||
if (INBOX(in->mouse_prev.x, in->mouse_prev.y, iter->x, iter->y, iter->w, iter->h))
|
if (!iter->panel.minimized)
|
||||||
break;
|
if (INBOX(in->mouse_prev.x, in->mouse_prev.y, iter->x, iter->y, iter->w, iter->h))
|
||||||
|
break;
|
||||||
iter = iter->next;
|
iter = iter->next;
|
||||||
}
|
}
|
||||||
if (!iter) {
|
if (!iter) {
|
||||||
|
11
gui.h
11
gui.h
@ -135,12 +135,19 @@ struct gui_output {
|
|||||||
gui_size list_size;
|
gui_size list_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum gui_text_align {
|
||||||
|
GUI_TEXT_LEFT,
|
||||||
|
GUI_TEXT_CENTERED,
|
||||||
|
GUI_TEXT_RIGHT
|
||||||
|
};
|
||||||
|
|
||||||
struct gui_text {
|
struct gui_text {
|
||||||
gui_float x, y;
|
gui_float x, y;
|
||||||
gui_float w, h;
|
gui_float w, h;
|
||||||
gui_float pad_x, pad_y;
|
gui_float pad_x, pad_y;
|
||||||
const char *text;
|
const char *text;
|
||||||
gui_size length;
|
gui_size length;
|
||||||
|
enum gui_text_align align;
|
||||||
struct gui_color font;
|
struct gui_color font;
|
||||||
struct gui_color background;
|
struct gui_color background;
|
||||||
};
|
};
|
||||||
@ -364,8 +371,6 @@ void gui_output_end(struct gui_draw_buffer*, struct gui_draw_call_list*,
|
|||||||
/* Widgets */
|
/* Widgets */
|
||||||
void gui_widget_text(struct gui_draw_buffer*, const struct gui_text*,
|
void gui_widget_text(struct gui_draw_buffer*, const struct gui_text*,
|
||||||
const struct gui_font*);
|
const struct gui_font*);
|
||||||
gui_size gui_widget_text_wrap(struct gui_draw_buffer*, const struct gui_text*,
|
|
||||||
const struct gui_font*);
|
|
||||||
void gui_widget_image(struct gui_draw_buffer*, const struct gui_image*);
|
void gui_widget_image(struct gui_draw_buffer*, const struct gui_image*);
|
||||||
gui_bool gui_widget_button_text(struct gui_draw_buffer*, const struct gui_button*,
|
gui_bool gui_widget_button_text(struct gui_draw_buffer*, const struct gui_button*,
|
||||||
const char *text, gui_size len, const struct gui_font*,
|
const char *text, gui_size len, const struct gui_font*,
|
||||||
@ -407,7 +412,7 @@ gui_bool gui_panel_begin(struct gui_panel*, struct gui_draw_buffer*,
|
|||||||
gui_float x, gui_float y, gui_float w, gui_float h, gui_flags);
|
gui_float x, gui_float y, gui_float w, gui_float h, gui_flags);
|
||||||
void gui_panel_layout(struct gui_panel*, gui_float height, gui_size cols);
|
void gui_panel_layout(struct gui_panel*, gui_float height, gui_size cols);
|
||||||
void gui_panel_seperator(struct gui_panel*, gui_size cols);
|
void gui_panel_seperator(struct gui_panel*, gui_size cols);
|
||||||
void gui_panel_text(struct gui_panel*, const char *str, gui_size len);
|
void gui_panel_text(struct gui_panel*, const char *str, gui_size len, enum gui_text_align);
|
||||||
gui_bool gui_panel_check(struct gui_panel*, const char*, gui_bool active);
|
gui_bool gui_panel_check(struct gui_panel*, const char*, gui_bool active);
|
||||||
gui_bool gui_panel_option(struct gui_panel*, const char*, gui_bool active);
|
gui_bool gui_panel_option(struct gui_panel*, const char*, gui_bool active);
|
||||||
gui_bool gui_panel_button_text(struct gui_panel*, const char*, enum gui_button_behavior);
|
gui_bool gui_panel_button_text(struct gui_panel*, const char*, enum gui_button_behavior);
|
||||||
|
Loading…
Reference in New Issue
Block a user