---
d2tk/base.h | 24 +++++++++++++++++
meson_options.txt | 4 +--
src/base_button.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 95 insertions(+), 2 deletions(-)
diff --git a/d2tk/base.h b/d2tk/base.h
index e9b434457..8f90664ab 100644
--- a/d2tk/base.h
+++ b/d2tk/base.h
@@ -24,6 +24,7 @@ typedef struct _d2tk_pos_t d2tk_pos_t;
typedef struct _d2tk_style_t d2tk_style_t;
typedef struct _d2tk_table_t d2tk_table_t;
typedef struct _d2tk_frame_t d2tk_frame_t;
+typedef struct _d2tk_button_t d2tk_button_t;
typedef struct _d2tk_layout_t d2tk_layout_t;
typedef struct _d2tk_scrollbar_t d2tk_scrollbar_t;
typedef struct _d2tk_flowmatrix_t d2tk_flowmatrix_t;
@@ -165,6 +166,7 @@ typedef enum _d2tk_flag_t {
extern const size_t d2tk_table_sz;
extern const size_t d2tk_frame_sz;
+extern const size_t d2tk_button_sz;
extern const size_t d2tk_layout_sz;
extern const size_t d2tk_scrollbar_sz;
extern const size_t d2tk_flowmatrix_sz;
@@ -400,6 +402,28 @@ d2tk_base_button_image(d2tk_base_t *base, d2tk_id_t id, ssize_t path_len,
#define d2tk_base_button_image_is_changed(...) \
d2tk_state_is_changed(d2tk_base_button_image(__VA_ARGS__))
+D2TK_API d2tk_button_t *
+d2tk_button_begin(d2tk_base_t *base, d2tk_id_t id, const d2tk_rect_t *rect,
+ d2tk_button_t *btn);
+
+D2TK_API bool
+d2tk_button_not_end(d2tk_button_t *btn);
+
+D2TK_API d2tk_button_t *
+d2tk_button_next(d2tk_button_t *btn);
+
+D2TK_API const d2tk_rect_t *
+d2tk_button_get_rect(d2tk_button_t *btn);
+
+D2TK_API d2tk_state_t
+d2tk_button_get_state(d2tk_button_t *btn);
+
+#define D2TK_BASE_BUTTON(BASE, ID, RECT, BTN) \
+ for(d2tk_button_t *(BTN) = d2tk_button_begin((BASE), (ID), (RECT), \
+ alloca(d2tk_button_sz)); \
+ d2tk_button_not_end((BTN)); \
+ (BTN) = d2tk_button_next((BTN)))
+
D2TK_API const d2tk_style_t *
d2tk_base_get_default_style();
diff --git a/meson_options.txt b/meson_options.txt
index d7b5a9036..ce6cdde18 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -26,7 +26,6 @@ option('use-backend-nanovg',
type : 'feature',
value : 'disabled',
yield : true)
-option('use-gles-version',
type : 'integer',
min : 2,
max : 3,
@@ -54,4 +53,5 @@ option('use-fontconfig',
type : 'feature',
value : 'disabled',
yield : true)
-option('version', type : 'string', value : '0.1.1289')
+option('version', type : 'string', value : '
+0.1.1293')
diff --git a/src/base_button.c b/src/base_button.c
index 0724f2919..4f94177a3 100644
--- a/src/base_button.c
+++ b/src/base_button.c
@@ -202,3 +202,72 @@ d2tk_base_toggle(d2tk_base_t *base, d2tk_id_t id, const d2tk_rect_t *rect,
return d2tk_base_toggle_label(base, id, 0, NULL,
D2TK_ALIGN_NONE, rect, value);
}
+
+struct _d2tk_button_t {
+ d2tk_state_t state;
+ d2tk_rect_t rect;
+};
+
+const size_t d2tk_button_sz = sizeof(d2tk_button_t);
+
+D2TK_API d2tk_button_t *
+d2tk_button_begin(d2tk_base_t *base, d2tk_id_t id, const d2tk_rect_t *rect,
+ d2tk_button_t *btn)
+{
+ const d2tk_style_t *style = d2tk_base_get_style(base);
+ d2tk_state_t state = d2tk_base_is_active_hot(base, id, rect, D2TK_FLAG_NONE);
+
+ if(d2tk_state_is_down(state) || d2tk_state_is_enter(state))
+ {
+ state |= D2TK_STATE_CHANGED;
+ }
+
+ d2tk_triple_t triple = D2TK_TRIPLE_NONE;
+
+ if(d2tk_state_is_active(state))
+ {
+ triple |= D2TK_TRIPLE_ACTIVE;
+ }
+
+ if(d2tk_state_is_hot(state))
+ {
+ triple |= D2TK_TRIPLE_HOT;
+ }
+
+ if(d2tk_state_is_focused(state))
+ {
+ triple |= D2TK_TRIPLE_FOCUS;
+ }
+
+ _d2tk_base_draw_button(base->core, 0, NULL, D2TK_ALIGN_NONE, 0, NULL,
+ rect, triple, style);
+
+ btn->state = state;
+ d2tk_rect_shrink(&btn->rect, rect, style->padding);
+
+ return btn;
+}
+
+D2TK_API bool
+d2tk_button_not_end(d2tk_button_t *btn)
+{
+ return btn ? true : false;
+}
+
+D2TK_API d2tk_button_t *
+d2tk_button_next(d2tk_button_t *btn __attribute__((unused)))
+{
+ return NULL;
+}
+
+D2TK_API const d2tk_rect_t *
+d2tk_button_get_rect(d2tk_button_t *btn)
+{
+ return &btn->rect;
+}
+
+D2TK_API d2tk_state_t
+d2tk_button_get_state(d2tk_button_t *btn)
+{
+ return btn->state;
+}
--
2.40.0