changeset 604:dd80b59fffaf

ui: do the same with frame
author David Demelier <markand@malikania.fr>
date Thu, 10 Aug 2023 20:08:00 +0200
parents ed1d3244ed57
children a8094fad01a1
files libmlk-ui/mlk/ui/frame.c libmlk-ui/mlk/ui/frame.h
diffstat 2 files changed, 151 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/libmlk-ui/mlk/ui/frame.c	Thu Aug 10 19:57:00 2023 +0200
+++ b/libmlk-ui/mlk/ui/frame.c	Thu Aug 10 20:08:00 2023 +0200
@@ -17,46 +17,45 @@
  */
 
 #include <assert.h>
-#include <stddef.h>
 
 #include <mlk/core/painter.h>
 
 #include "frame.h"
-#include "ui.h"
-#include "ui_p.h"
+#include "style.h"
 
 static void
-delegate_draw(struct mlk_frame_delegate *delegate, const struct mlk_frame *frame)
+draw(struct mlk_frame_delegate *self, const struct mlk_frame *frame)
 {
-	(void)delegate;
-
-	const struct mlk_frame_style *style = MLK__STYLE(frame, mlk_frame_style);
+	(void)self;
 
-	mlk_painter_set_color(style->border_color);
+	mlk_painter_set_color(frame->style->border_color);
 	mlk_painter_draw_rectangle(frame->x, frame->y, frame->w, frame->h);
-	mlk_painter_set_color(style->bg_color);
+	mlk_painter_set_color(frame->style->bg_color);
 	mlk_painter_draw_rectangle(
-		frame->x + style->border_size,
-		frame->y + style->border_size,
-		frame->w - (style->border_size * 2),
-		frame->h - (style->border_size * 2)
+		frame->x + frame->style->border_size,
+		frame->y + frame->style->border_size,
+		frame->w - (frame->style->border_size * 2),
+		frame->h - (frame->style->border_size * 2)
 	);
 }
 
-struct mlk_frame_style mlk_frame_style = {
-	.bg_color       = MLK_UI_COLOR_BG,
-	.border_color   = MLK_UI_COLOR_BORDER,
-	.border_size    = 2
+struct mlk_frame_delegate mlk_frame_delegate = {
+	.draw = draw
 };
 
-struct mlk_frame_delegate mlk_frame_delegate = {
-	.draw           = delegate_draw
-};
+void
+mlk_frame_init(struct mlk_frame *frame,
+               struct mlk_style *st,
+               struct mlk_frame_delegate *dt)
+{
+	assert(frame);
 
-int
-mlk_frame_ok(const struct mlk_frame *frame)
-{
-	return frame != NULL;
+	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;
 }
 
 void
@@ -64,7 +63,8 @@
 {
 	assert(frame);
 
-	MLK__DELEGATE_INVOKE(frame->delegate, mlk_frame_delegate, update, frame, ticks);
+	if (frame->delegate->update)
+		frame->delegate->update(frame->delegate, frame, ticks);
 }
 
 void
@@ -72,5 +72,6 @@
 {
 	assert(frame);
 
-	MLK__DELEGATE_INVOKE(frame->delegate, mlk_frame_delegate, draw, frame);
+	if (frame->delegate->draw)
+		frame->delegate->draw(frame->delegate, frame);
 }
--- a/libmlk-ui/mlk/ui/frame.h	Thu Aug 10 19:57:00 2023 +0200
+++ b/libmlk-ui/mlk/ui/frame.h	Thu Aug 10 20:08:00 2023 +0200
@@ -19,43 +19,149 @@
 #ifndef MLK_UI_FRAME_H
 #define MLK_UI_FRAME_H
 
-struct mlk_frame;
+/**
+ * \file mlk/ui/frame.h
+ * \brief GUI frame.
+ */
 
-struct mlk_frame_style {
-	unsigned long bg_color;
-	unsigned long border_color;
-	unsigned long border_size;
-};
-
-struct mlk_frame_delegate {
-	void *data;
-	void (*update)(struct mlk_frame_delegate *, struct mlk_frame *, unsigned int);
-	void (*draw)(struct mlk_frame_delegate *, const struct mlk_frame *);
-};
+struct mlk_frame;
+struct mlk_frame_delegate;
+struct mlk_style;
 
 struct mlk_frame {
-	int x, y;
-	unsigned int w, h;
-	struct mlk_frame_style *style;
+	/**
+	 * (read-write)
+	 *
+	 * Position in x.
+	 */
+	int x;
+
+	/**
+	 * (read-write)
+	 *
+	 * Position in y.
+	 */
+	int y;
+
+	/**
+	 * (read-write)
+	 *
+	 * Frame width.
+	 */
+	unsigned int w;
+
+	/**
+	 * (read-write)
+	 *
+	 * Frame height.
+	 */
+	unsigned int h;
+
+	/**
+	 * (read-write, borrowed)
+	 *
+	 * Frame style.
+	 */
+	struct mlk_style *style;
+
+	/**
+	 * (read-write, borrowed)
+	 *
+	 * Frame delegate.
+	 */
 	struct mlk_frame_delegate *delegate;
 };
 
-extern struct mlk_frame_style mlk_frame_style;
+/**
+ * \struct mlk_frame_delegate
+ * \brief Frame delegate.
+ */
+struct mlk_frame_delegate {
+	/*
+	 * (read-write, borrowed, optional)
+	 *
+	 * Arbitrary user data.
+	 */
+	void *data;
+
+	/**
+	 * (read-write, optional)
+	 *
+	 * Update the label.
+	 *
+	 * \param self this delegate
+	 * \param frame the frame to update
+	 * \param ticks number of ticks since last frame
+	 */
+	void (*update)(struct mlk_frame_delegate *self,
+	               struct mlk_frame *frame,
+	               unsigned int ticks);
+
+	/**
+	 * (read-write, optional)
+	 *
+	 * Draw this label.
+	 *
+	 * \param self this delegate
+	 * \param frame the frame to update
+	 */
+	void (*draw)(struct mlk_frame_delegate *self,
+	             const struct mlk_frame *frame);
+
+	/**
+	 * (read-write, optional)
+	 *
+	 * Cleanup this delegate associated with the label.
+	 *
+	 * \param self this delegate
+	 * \param frame the underlying frame
+	 */
+	void (*finish)(struct mlk_frame_delegate *self,
+	               struct mlk_frame *frame);
+};
+
+/**
+ * \brief Default stateless delegate for frame.
+ */
 extern struct mlk_frame_delegate mlk_frame_delegate;
 
 #if defined(__cplusplus)
 extern "C" {
 #endif
 
-int
-mlk_frame_ok(const struct mlk_frame *frame);
+/**
+ * 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.
+ */
 void
 mlk_frame_update(struct mlk_frame *frame, unsigned int ticks);
 
+/**
+ * Invoke ::mlk_frame_delegate::draw.
+ */
 void
 mlk_frame_draw(const struct mlk_frame *frame);
 
+/**
+ * Invoke ::mlk_frame_delegate::finish.
+ */
+void
+mlk_frame_finish(struct mlk_frame *frame);
+
 #if defined(__cplusplus)
 }
 #endif