diff --git a/demo/common/overview.c b/demo/common/overview.c index dff9796..d4c90b1 100644 --- a/demo/common/overview.c +++ b/demo/common/overview.c @@ -142,7 +142,7 @@ overview(struct nk_context *ctx) { enum options {A,B,C}; static int checkbox_left_text_left; - static int checkbox_left_text_right; + static int checkbox_centered_text_right; static int checkbox_right_text_right; static int checkbox_right_text_left; static int option_left; @@ -213,10 +213,10 @@ overview(struct nk_context *ctx) static const float ratio[] = {120, 150}; nk_layout_row_dynamic(ctx, 0, 1); - nk_checkbox_label(ctx, "Checkbox Left Text Left", &checkbox_left_text_left, NK_WIDGET_LEFT, NK_TEXT_LEFT); - nk_checkbox_label(ctx, "Checkbox Left Text Right", &checkbox_left_text_right, NK_WIDGET_LEFT, NK_TEXT_RIGHT); - nk_checkbox_label(ctx, "Checkbox Right Text Right", &checkbox_right_text_right, NK_WIDGET_RIGHT, NK_TEXT_RIGHT); - nk_checkbox_label(ctx, "Checkbox Right Text Left", &checkbox_right_text_left, NK_WIDGET_RIGHT, NK_TEXT_LEFT); + nk_checkbox_label(ctx, "CheckLeft TextLeft", &checkbox_left_text_left, NK_WIDGET_LEFT, NK_TEXT_LEFT); + nk_checkbox_label(ctx, "CheckCenter TextRight", &checkbox_centered_text_right, NK_WIDGET_ALIGN_CENTERED | NK_WIDGET_ALIGN_MIDDLE, NK_TEXT_RIGHT); + nk_checkbox_label(ctx, "CheckRight TextRight", &checkbox_right_text_right, NK_WIDGET_LEFT, NK_TEXT_RIGHT); + nk_checkbox_label(ctx, "CheckRight TextLeft", &checkbox_right_text_left, NK_WIDGET_RIGHT, NK_TEXT_LEFT); nk_layout_row_static(ctx, 30, 80, 3); option_left = nk_option_label(ctx, "optionA", option_left == A, NK_WIDGET_LEFT, NK_TEXT_LEFT) ? A : option_left; diff --git a/nuklear.h b/nuklear.h index 12696cb..4a93bae 100644 --- a/nuklear.h +++ b/nuklear.h @@ -24811,7 +24811,6 @@ nk_do_toggle(nk_flags *state, const struct nk_user_font *font, nk_flags widget_alignment, nk_flags text_alignment) { int was_active; - struct nk_rect allocated_space; struct nk_rect bounds; struct nk_rect select; struct nk_rect cursor; @@ -24826,13 +24825,6 @@ nk_do_toggle(nk_flags *state, r.w = NK_MAX(r.w, font->height + 2 * style->padding.x); r.h = NK_MAX(r.h, font->height + 2 * style->padding.y); - allocated_space = r; - - if (widget_alignment & NK_WIDGET_ALIGN_RIGHT) { - r.x = r.x + r.w - font->height - style->padding.x; - r.w = font->height; - } - /* add additional touch padding for touch screen devices */ bounds.x = r.x - style->touch_padding.x; bounds.y = r.y - style->touch_padding.y; @@ -24842,8 +24834,37 @@ nk_do_toggle(nk_flags *state, /* calculate the selector space */ select.w = font->height; select.h = select.w; - select.y = r.y + r.h/2.0f - select.h/2.0f; - select.x = r.x; + + if (widget_alignment & NK_WIDGET_ALIGN_RIGHT) { + select.x = r.x + r.w - font->height; + + /* label in front of the selector */ + label.x = r.x; + label.w = r.w - select.w - style->spacing * 2; + } else if (widget_alignment & NK_WIDGET_ALIGN_CENTERED) { + select.x = (r.x + r.w) / 2; + + /* label in front of selector */ + label.x = r.x; + label.w = r.w / 2 - select.w - style->spacing * 2; + } else { /* Default: NK_WIDGET_ALIGN_LEFT */ + select.x = r.x; + + /* label behind the selector */ + label.x = select.x + select.w + style->spacing; + label.w = NK_MAX(r.x + r.w, label.x) - label.x; + } + + if (widget_alignment & NK_WIDGET_ALIGN_TOP) { + select.y = r.y; + } else if (widget_alignment & NK_WIDGET_ALIGN_BOTTOM) { + select.y = r.y + r.h - select.h - 2 * style->padding.y; + } else { /* Default: NK_WIDGET_ALIGN_MIDDLE */ + select.y = r.y + r.h/2.0f - select.h/2.0f; + } + + label.y = select.y; + label.h = select.w; /* calculate the bounds of the cursor inside the selector */ cursor.x = select.x + style->padding.x + style->border; @@ -24851,18 +24872,6 @@ nk_do_toggle(nk_flags *state, cursor.w = select.w - (2 * style->padding.x + 2 * style->border); cursor.h = select.h - (2 * style->padding.y + 2 * style->border); - label.y = select.y; - label.h = select.w; - if (widget_alignment & NK_WIDGET_ALIGN_RIGHT) { - /* label in front of the selector */ - label.x = allocated_space.x; - label.w = allocated_space.w - select.w - style->spacing * 2; - } else { - /* label behind the selector */ - label.x = select.x + select.w + style->spacing; - label.w = NK_MAX(r.x + r.w, label.x) - label.x; - } - /* update selector */ was_active = *active; *active = nk_toggle_behavior(in, bounds, state, *active); @@ -30013,6 +30022,8 @@ nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args) /// - [y]: Minor version with non-breaking API and library changes /// - [z]: Patch version with no direct changes to the API /// +/// - 2023/11/26 (5.0.0) - BREAKING CHANGE: Added alignment to check boxes and radio buttons. They +/// all now require a widget and text alignment parameter. /// - 2023/10/11 (4.11.0) - Added nk_widget_disable_begin() and nk_widget_disable_end() /// - 2022/12/23 (4.10.6) - Fix incorrect glyph index in nk_font_bake() /// - 2022/12/17 (4.10.5) - Fix nk_font_bake_pack() using TTC font offset incorrectly diff --git a/src/nuklear_toggle.c b/src/nuklear_toggle.c index 9985925..c4b8159 100644 --- a/src/nuklear_toggle.c +++ b/src/nuklear_toggle.c @@ -115,7 +115,6 @@ nk_do_toggle(nk_flags *state, const struct nk_user_font *font, nk_flags widget_alignment, nk_flags text_alignment) { int was_active; - struct nk_rect allocated_space; struct nk_rect bounds; struct nk_rect select; struct nk_rect cursor; @@ -130,13 +129,6 @@ nk_do_toggle(nk_flags *state, r.w = NK_MAX(r.w, font->height + 2 * style->padding.x); r.h = NK_MAX(r.h, font->height + 2 * style->padding.y); - allocated_space = r; - - if (widget_alignment & NK_WIDGET_ALIGN_RIGHT) { - r.x = r.x + r.w - font->height - style->padding.x; - r.w = font->height; - } - /* add additional touch padding for touch screen devices */ bounds.x = r.x - style->touch_padding.x; bounds.y = r.y - style->touch_padding.y; @@ -146,8 +138,37 @@ nk_do_toggle(nk_flags *state, /* calculate the selector space */ select.w = font->height; select.h = select.w; - select.y = r.y + r.h/2.0f - select.h/2.0f; - select.x = r.x; + + if (widget_alignment & NK_WIDGET_ALIGN_RIGHT) { + select.x = r.x + r.w - font->height; + + /* label in front of the selector */ + label.x = r.x; + label.w = r.w - select.w - style->spacing * 2; + } else if (widget_alignment & NK_WIDGET_ALIGN_CENTERED) { + select.x = (r.x + r.w) / 2; + + /* label in front of selector */ + label.x = r.x; + label.w = r.w / 2 - select.w - style->spacing * 2; + } else { /* Default: NK_WIDGET_ALIGN_LEFT */ + select.x = r.x; + + /* label behind the selector */ + label.x = select.x + select.w + style->spacing; + label.w = NK_MAX(r.x + r.w, label.x) - label.x; + } + + if (widget_alignment & NK_WIDGET_ALIGN_TOP) { + select.y = r.y; + } else if (widget_alignment & NK_WIDGET_ALIGN_BOTTOM) { + select.y = r.y + r.h - select.h - 2 * style->padding.y; + } else { /* Default: NK_WIDGET_ALIGN_MIDDLE */ + select.y = r.y + r.h/2.0f - select.h/2.0f; + } + + label.y = select.y; + label.h = select.w; /* calculate the bounds of the cursor inside the selector */ cursor.x = select.x + style->padding.x + style->border; @@ -155,18 +176,6 @@ nk_do_toggle(nk_flags *state, cursor.w = select.w - (2 * style->padding.x + 2 * style->border); cursor.h = select.h - (2 * style->padding.y + 2 * style->border); - label.y = select.y; - label.h = select.w; - if (widget_alignment & NK_WIDGET_ALIGN_RIGHT) { - /* label in front of the selector */ - label.x = allocated_space.x; - label.w = allocated_space.w - select.w - style->spacing * 2; - } else { - /* label behind the selector */ - label.x = select.x + select.w + style->spacing; - label.w = NK_MAX(r.x + r.w, label.x) - label.x; - } - /* update selector */ was_active = *active; *active = nk_toggle_behavior(in, bounds, state, *active);