changeset 616:dae4cdc6a984

ui: simplify frame
author David Demelier <markand@malikania.fr>
date Mon, 21 Aug 2023 20:15:53 +0200
parents ade3030f29f0
children 19b195954ec3
files examples/example-ui/example-ui.c libmlk-ui/mlk/ui/frame.c libmlk-ui/mlk/ui/frame.h libmlk-ui/mlk/ui/gridmenu.c libmlk-ui/mlk/ui/ui.c
diffstat 5 files changed, 62 insertions(+), 106 deletions(-) [+]
line wrap: on
line diff
--- a/examples/example-ui/example-ui.c	Mon Aug 21 07:43:18 2023 +0200
+++ b/examples/example-ui/example-ui.c	Mon Aug 21 20:15:53 2023 +0200
@@ -108,9 +108,7 @@
 			.x = FRAME_ORIGIN_X,
 			.y = FRAME_ORIGIN_Y,
 			.w = FRAME_WIDTH,
-			.h = FRAME_HEIGHT,
-			.delegate = &mlk_frame_delegate,
-			.style = &mlk_style
+			.h = FRAME_HEIGHT
 		}
 	},
 	.header = {
--- a/libmlk-ui/mlk/ui/frame.c	Mon Aug 21 07:43:18 2023 +0200
+++ b/libmlk-ui/mlk/ui/frame.c	Mon Aug 21 20:15:53 2023 +0200
@@ -21,68 +21,51 @@
 #include <mlk/core/painter.h>
 
 #include "frame.h"
-#include "style.h"
+#include "ui_p.h"
 
 static void
-draw(struct mlk_frame_delegate *self, const struct mlk_frame *frame)
+draw(struct mlk_frame_style *self, struct mlk_frame *frame)
 {
-	(void)self;
-
-	const struct mlk_style_attr *attr = &frame->style->normal;
-
-	mlk_painter_set_color(attr->color.border);
+	mlk_painter_set_color(self->border);
 	mlk_painter_draw_rectangle(frame->x, frame->y, frame->w, frame->h);
-	mlk_painter_set_color(attr->color.bg);
+	mlk_painter_set_color(self->background);
 	mlk_painter_draw_rectangle(
-		frame->x + attr->geo.border,
-		frame->y + attr->geo.border,
-		frame->w - (attr->geo.border * 2),
-		frame->h - (attr->geo.border * 2)
+		frame->x + self->border_size,
+		frame->y + self->border_size,
+		frame->w - (self->border_size * 2),
+		frame->h - (self->border_size * 2)
 	);
 }
 
-struct mlk_frame_delegate mlk_frame_delegate = {
+
+struct mlk_frame_style mlk_frame_style_dark = {
+	.background = 0x222323ff,
+	.border = 0x141414ff,
+	.border_size = 2,
 	.draw = draw
 };
 
-void
-mlk_frame_init(struct mlk_frame *frame,
-               struct mlk_style *st,
-               struct mlk_frame_delegate *dt)
-{
-	assert(frame);
+struct mlk_frame_style mlk_frame_style_light = {
+	.background = 0xf5f7faff,
+	.border = 0xcdd2daff,
+	.border_size = 2,
+	.draw = draw
+};
 
-	frame->x = 0;
-	frame->y = 0;
-	frame->w = 0;
-	frame->h = 0;
-	frame->style = st ? st : &mlk_style;
-	frame->delegate = dt ? dt : &mlk_frame_delegate;
-}
+struct mlk_frame_style *mlk_frame_style = &mlk_frame_style_light;
 
 void
 mlk_frame_update(struct mlk_frame *frame, unsigned int ticks)
 {
 	assert(frame);
 
-	if (frame->delegate->update)
-		frame->delegate->update(frame->delegate, frame, ticks);
+	MLK__STYLE_CALL(frame->style, mlk_frame_style, update, frame, ticks);
 }
 
 void
-mlk_frame_draw(const struct mlk_frame *frame)
+mlk_frame_draw(struct mlk_frame *frame)
 {
 	assert(frame);
 
-	if (frame->delegate->draw)
-		frame->delegate->draw(frame->delegate, frame);
+	MLK__STYLE_CALL(frame->style, mlk_frame_style, draw, frame);
 }
-
-void
-mlk_frame_finish(struct mlk_frame *frame)
-{
-	assert(frame);
-
-	if (frame->delegate->finish)
-		frame->delegate->finish(frame->delegate, frame);
-}
--- a/libmlk-ui/mlk/ui/frame.h	Mon Aug 21 07:43:18 2023 +0200
+++ b/libmlk-ui/mlk/ui/frame.h	Mon Aug 21 20:15:53 2023 +0200
@@ -25,8 +25,7 @@
  */
 
 struct mlk_frame;
-struct mlk_frame_delegate;
-struct mlk_style;
+struct mlk_frame_style;
 
 struct mlk_frame {
 	/**
@@ -62,21 +61,18 @@
 	 *
 	 * Frame style.
 	 */
-	struct mlk_style *style;
-
-	/**
-	 * (read-write, borrowed)
-	 *
-	 * Frame delegate.
-	 */
-	struct mlk_frame_delegate *delegate;
+	struct mlk_frame_style *style;
 };
 
 /**
- * \struct mlk_frame_delegate
- * \brief Frame delegate.
+ * \struct mlk_frame_style
+ * \brief Frame style.
  */
-struct mlk_frame_delegate {
+struct mlk_frame_style {
+	unsigned long background;
+	unsigned long border;
+	unsigned int border_size;
+
 	/*
 	 * (read-write, borrowed, optional)
 	 *
@@ -89,11 +85,11 @@
 	 *
 	 * Update the label.
 	 *
-	 * \param self this delegate
+	 * \param self this style
 	 * \param frame the frame to update
 	 * \param ticks number of ticks since last frame
 	 */
-	void (*update)(struct mlk_frame_delegate *self,
+	void (*update)(struct mlk_frame_style *self,
 	               struct mlk_frame *frame,
 	               unsigned int ticks);
 
@@ -102,65 +98,43 @@
 	 *
 	 * Draw this frame.
 	 *
-	 * \param self this delegate
+	 * \param self this style
 	 * \param frame the frame to draw
 	 */
-	void (*draw)(struct mlk_frame_delegate *self,
-	             const struct mlk_frame *frame);
-
-	/**
-	 * (read-write, optional)
-	 *
-	 * Cleanup this delegate associated with the frame.
-	 *
-	 * \param self this delegate
-	 * \param frame the underlying frame
-	 */
-	void (*finish)(struct mlk_frame_delegate *self,
-	               struct mlk_frame *frame);
+	void (*draw)(struct mlk_frame_style *self,
+	             struct mlk_frame *frame);
 };
 
 /**
- * \brief Default stateless delegate for frame.
+ * \brief Dark default style for frame.
+ */
+extern struct mlk_frame_style mlk_frame_style_dark;
+
+/**
+ * \brief Light default style for frame.
  */
-extern struct mlk_frame_delegate mlk_frame_delegate;
+extern struct mlk_frame_style mlk_frame_style_light;
+
+/**
+ * \brief Default style for all frames.
+ */
+extern struct mlk_frame_style *mlk_frame_style;
 
 #if defined(__cplusplus)
 extern "C" {
 #endif
 
 /**
- * Initialize the frame with default values.
- *
- * This is not required if you use designated initializers.
- *
- * \pre frame != NULL
- * \param frame the frame to default initialize
- * \param st style to use (or NULL to use a default)
- * \param dt delegate to use (or NULL to use a default)
- */
-void
-mlk_frame_init(struct mlk_frame *frame,
-               struct mlk_style *st,
-               struct mlk_frame_delegate *dt);
-
-/**
- * Invoke ::mlk_frame_delegate::update.
+ * Invoke ::mlk_frame_style::update.
  */
 void
 mlk_frame_update(struct mlk_frame *frame, unsigned int ticks);
 
 /**
- * Invoke ::mlk_frame_delegate::draw.
+ * Invoke ::mlk_frame_style::draw.
  */
 void
-mlk_frame_draw(const struct mlk_frame *frame);
-
-/**
- * Invoke ::mlk_frame_delegate::finish.
- */
-void
-mlk_frame_finish(struct mlk_frame *frame);
+mlk_frame_draw(struct mlk_frame *frame);
 
 #if defined(__cplusplus)
 }
--- a/libmlk-ui/mlk/ui/gridmenu.c	Mon Aug 21 07:43:18 2023 +0200
+++ b/libmlk-ui/mlk/ui/gridmenu.c	Mon Aug 21 20:15:53 2023 +0200
@@ -190,16 +190,14 @@
 {
 	(void)self;
 
-	struct mlk_frame frame;
-
-	mlk_frame_init(&frame, menu->style, &mlk_frame_delegate);
-	frame.x = menu->x;
-	frame.y = menu->y;
-	frame.w = menu->w;
-	frame.h = menu->h;
+	struct mlk_frame frame = {
+		.x = menu->x,
+		.y = menu->y,
+		.w = menu->w,
+		.h = menu->h
+	};
 
 	mlk_frame_draw(&frame);
-	mlk_frame_finish(&frame);
 }
 
 static void
--- a/libmlk-ui/mlk/ui/ui.c	Mon Aug 21 07:43:18 2023 +0200
+++ b/libmlk-ui/mlk/ui/ui.c	Mon Aug 21 20:15:53 2023 +0200
@@ -37,6 +37,7 @@
 #include <assets/fonts/opensans-regular.h>
 
 #include "align.h"
+#include "frame.h"
 #include "label.h"
 #include "ui.h"
 #include "ui_p.h"
@@ -96,8 +97,10 @@
 {
 	if (theme == MLK_WINDOW_THEME_DARK) {
 		mlk_label_style = &mlk_label_style_dark;
+		mlk_frame_style = &mlk_frame_style_dark;
 	} else {
 		mlk_label_style = &mlk_label_style_light;
+		mlk_frame_style = &mlk_frame_style_light;
 	}
 }