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