rts/src/gui/src/button.c

89 lines
2.0 KiB
C

#include <gui.h>
#include <gui/button.h>
#include <gui_button_private.h>
#include <gui_private.h>
#include <camera.h>
#include <gfx.h>
#include <input.h>
#include <mouse.h>
#include <pad.h>
#include <peripheral.h>
static int render(const struct gui_common *const g)
{
static int (*const f[])(const struct gui_button *) =
{
[GUI_BUTTON_TYPE_1] = gui_button_render_type1,
[GUI_BUTTON_TYPE_SPRITE] = gui_button_render_sprite
};
const struct gui_button *const b = (const struct gui_button *)g;
return f[b->type](b);
}
static void get_dim(const struct gui_common *const g,
short *const w, short *const h)
{
static void (*const f[])(const struct gui_button *, short *, short *) =
{
[GUI_BUTTON_TYPE_1] = gui_button_get_dim_type1,
[GUI_BUTTON_TYPE_SPRITE] = gui_button_get_dim_sprite
};
const struct gui_button *const b = (const struct gui_button *)g;
f[b->type](b, w, h);
}
static bool pressed(const struct gui_button *const b,
const union peripheral *const p,
const struct camera *const cam,
const struct input *const in)
{
short w, h;
get_dim(&b->common, &w, &h);
return gui_pressed(&b->common, in, p, cam, w, h);
}
static int update(struct gui_common *const g,
const union peripheral *const p, const struct camera *const c,
struct input *const in)
{
struct gui_button *const b = (struct gui_button *)g;
if (pressed(b, p, c, in) && b->on_pressed)
b->on_pressed(b->arg);
return 0;
}
void gui_button_init(struct gui_button *const b, const enum gui_button_type t)
{
static const struct gui_common_cb cb =
{
.get_dim = get_dim,
.update = update,
.render = render
};
*b = (const struct gui_button)
{
.common =
{
.cb = &cb
},
.type = t
};
static void (*const f[])(struct gui_button *) =
{
[GUI_BUTTON_TYPE_1] = gui_button_init_type1,
[GUI_BUTTON_TYPE_SPRITE] = gui_button_init_sprite
};
f[b->type](b);
}