Mercurial > molko
changeset 503:a55d0a29f466
ui: rework checkbox style
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 01 Mar 2023 10:51:25 +0100 |
parents | ab2816f9551c |
children | 52a305833381 |
files | libmlk-ui/mlk/ui/checkbox.c libmlk-ui/mlk/ui/checkbox.h libmlk-ui/mlk/ui/theme.c libmlk-ui/mlk/ui/theme.h |
diffstat | 4 files changed, 59 insertions(+), 43 deletions(-) [+] |
line wrap: on
line diff
--- a/libmlk-ui/mlk/ui/checkbox.c Wed Mar 01 10:34:12 2023 +0100 +++ b/libmlk-ui/mlk/ui/checkbox.c Wed Mar 01 10:51:25 2023 +0100 @@ -25,7 +25,14 @@ #include "label.h" #include "checkbox.h" -#include "theme.h" + +#define STYLE_INVOKE(s, f, ...) \ +do { \ + if (s && s->f) \ + s->f(s, __VA_ARGS__); \ + else if (mlk_checkbox_style.f) \ + mlk_checkbox_style.f(s ? s : &mlk_checkbox_style, __VA_ARGS__); \ +} while (0) static int is_boxed(const struct mlk_checkbox *cb, const struct mlk_event_click *click) @@ -36,24 +43,35 @@ return mlk_maths_is_boxed(cb->x, cb->y, cb->w, cb->h, click->x, click->y); } -void -mlk_checkbox_draw_default(const struct mlk_theme *t, const struct mlk_checkbox *cb) +static void +draw(struct mlk_checkbox_style *style, const struct mlk_checkbox *cb) { - (void)t; - - assert(cb); - - mlk_painter_set_color(0x151d28ff); + mlk_painter_set_color(style->bg_color); mlk_painter_draw_rectangle(cb->x, cb->y, cb->w, cb->h); - mlk_painter_set_color(0xd7b594ff); + mlk_painter_set_color(style->border_color); mlk_painter_draw_rectangle(cb->x + 1, cb->y + 1, cb->w - 2, cb->h - 2); if (cb->checked) { - mlk_painter_set_color(0x341c27ff); + mlk_painter_set_color(style->check_color); mlk_painter_draw_rectangle(cb->x + 5, cb->y + 5, cb->w - 10, cb->h - 10); } } +struct mlk_checkbox_style mlk_checkbox_style = { + .bg_color = 0x151d28ff, + .border_color = 0xd7b594ff, + .check_color = 0x341c27ff, + .draw = draw +}; + +void +mlk_checkbox_init(struct mlk_checkbox *cb) +{ + assert(cb); + + STYLE_INVOKE(cb->style, init, cb); +} + int mlk_checkbox_handle(struct mlk_checkbox *cb, const union mlk_event *ev) { @@ -75,5 +93,16 @@ void mlk_checkbox_draw(const struct mlk_checkbox *cb) { - mlk_theme_draw_checkbox(cb->theme, cb); + assert(cb); + + STYLE_INVOKE(cb->style, draw, cb); } + +void +mlk_checkbox_finish(struct mlk_checkbox *cb) +{ + assert(cb); + + STYLE_INVOKE(cb->style, finish, cb); + +}
--- a/libmlk-ui/mlk/ui/checkbox.h Wed Mar 01 10:34:12 2023 +0100 +++ b/libmlk-ui/mlk/ui/checkbox.h Wed Mar 01 10:51:25 2023 +0100 @@ -23,7 +23,18 @@ union mlk_event; -struct mlk_theme; +struct mlk_checkbox; + +struct mlk_checkbox_style { + void *data; + unsigned long bg_color; + unsigned long border_color; + unsigned long check_color; + void (*init)(struct mlk_checkbox_style *, struct mlk_checkbox *); + void (*update)(struct mlk_checkbox_style *, struct mlk_checkbox *, unsigned int); + void (*draw)(struct mlk_checkbox_style *, const struct mlk_checkbox *); + void (*finish)(struct mlk_checkbox_style *, struct mlk_checkbox *); +}; struct mlk_checkbox { int x; @@ -31,13 +42,15 @@ unsigned int w; unsigned int h; int checked; - const struct mlk_theme *theme; + struct mlk_checkbox_style *style; }; +extern struct mlk_checkbox_style mlk_checkbox_style; + MLK_CORE_BEGIN_DECLS void -mlk_checkbox_draw_default(const struct mlk_theme *, const struct mlk_checkbox *); +mlk_checkbox_init(struct mlk_checkbox *); int mlk_checkbox_handle(struct mlk_checkbox *, const union mlk_event *); @@ -45,6 +58,9 @@ void mlk_checkbox_draw(const struct mlk_checkbox *); +void +mlk_checkbox_finish(struct mlk_checkbox *); + MLK_CORE_END_DECLS #endif /* !MLK_UI_CHECKBOX_H */
--- a/libmlk-ui/mlk/ui/theme.c Wed Mar 01 10:34:12 2023 +0100 +++ b/libmlk-ui/mlk/ui/theme.c Wed Mar 01 10:51:25 2023 +0100 @@ -32,8 +32,6 @@ #include <assets/fonts/opensans-regular.h> #include "align.h" -#include "button.h" -#include "checkbox.h" #include "frame.h" #include "label.h" #include "theme.h" @@ -55,7 +53,6 @@ .padding = 10, .draw_frame = mlk_frame_draw_default, .draw_label = mlk_label_draw_default, - .draw_checkbox = mlk_checkbox_draw_default }; static struct font_catalog { @@ -129,22 +126,6 @@ } void -mlk_theme_draw_button(const struct mlk_theme *t, const struct mlk_button *button) -{ - assert(button); - - THEME(t)->draw_button(THEME(t), button); -} - -void -mlk_theme_draw_checkbox(const struct mlk_theme *t, const struct mlk_checkbox *cb) -{ - assert(cb); - - THEME(t)->draw_checkbox(THEME(t), cb); -} - -void mlk_theme_finish(void) { for (size_t i = 0; i < MLK_UTIL_SIZE(default_fonts); ++i) {
--- a/libmlk-ui/mlk/ui/theme.h Wed Mar 01 10:34:12 2023 +0100 +++ b/libmlk-ui/mlk/ui/theme.h Wed Mar 01 10:51:25 2023 +0100 @@ -21,8 +21,6 @@ #include <mlk/core/core.h> -struct mlk_button; -struct mlk_checkbox; struct mlk_font; struct mlk_frame; struct mlk_label; @@ -56,8 +54,6 @@ void (*draw_frame)(const struct mlk_theme *, const struct mlk_frame *); void (*draw_label)(const struct mlk_theme *, const struct mlk_label *); - void (*draw_button)(const struct mlk_theme *, const struct mlk_button *); - void (*draw_checkbox)(const struct mlk_theme *t, const struct mlk_checkbox *); }; MLK_CORE_BEGIN_DECLS @@ -78,12 +74,6 @@ mlk_theme_draw_label(const struct mlk_theme *, const struct mlk_label *); void -mlk_theme_draw_button(const struct mlk_theme *, const struct mlk_button *); - -void -mlk_theme_draw_checkbox(const struct mlk_theme *, const struct mlk_checkbox *); - -void mlk_theme_finish(void); MLK_CORE_END_DECLS