Mercurial > molko
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