~hp/patches

Hanspeter Portner: 1
 Add base button

 3 files changed, 95 insertions(+), 2 deletions(-)
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.open-music-kontrollers.ch/~hp/patches/patches/1/mbox | git am -3
Learn more about email & git

[PATCH] Add base button Export this patch

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