added basic implementation of checkboxes (functional)
This commit is contained in:
parent
d0f5d9c7f9
commit
0fe42a94b1
1 changed files with 171 additions and 0 deletions
171
src/gwin/checkbox.c
Normal file
171
src/gwin/checkbox.c
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
/*
|
||||||
|
* This file is subject to the terms of the GFX License, v1.0. If a copy of
|
||||||
|
* the license was not distributed with this file, you can obtain one at:
|
||||||
|
*
|
||||||
|
* http://chibios-gfx.com/license.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file src/gwin/checkbox.c
|
||||||
|
* @brief GWIN sub-system button code.
|
||||||
|
*
|
||||||
|
* @defgroup Checkbox Checkbox
|
||||||
|
* @ingroup GWIN
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "gfx.h"
|
||||||
|
|
||||||
|
#if (GFX_USE_GWIN && GWIN_NEED_CHECKBOX) || defined(__DOXYGEN__)
|
||||||
|
|
||||||
|
static const GCheckboxDrawStyle GCheckboxDefaultStyleSelected = {
|
||||||
|
Green
|
||||||
|
};
|
||||||
|
|
||||||
|
static const GCheckboxDrawStyle GCheckboxDefaultStyleUnselected = {
|
||||||
|
Red
|
||||||
|
};
|
||||||
|
|
||||||
|
/* process an event callback */
|
||||||
|
static void gwinCheckboxCallback(void *param, GEvent *pe) {
|
||||||
|
GSourceListener *psl;
|
||||||
|
#define gh ((GHandle)param)
|
||||||
|
#define gbw ((GCheckboxObject *)param)
|
||||||
|
#define gsh ((GSourceHandle)param)
|
||||||
|
#define pme ((GEventMouse *)pe)
|
||||||
|
#define pte ((GEventTouch *)pe)
|
||||||
|
#define pxe ((GEventToggle *)pe)
|
||||||
|
#define pbe ((GEventGWinCheckbox *)pe)
|
||||||
|
|
||||||
|
/* check if checkbox is disabled */
|
||||||
|
if (!gh->enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (pe->type) {
|
||||||
|
#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE
|
||||||
|
case GEVENT_MOUSE:
|
||||||
|
case GEVENT_TOUCH:
|
||||||
|
|
||||||
|
// Ignore anything other than the primary mouse button going up or down
|
||||||
|
if (!((pme->current_buttons ^ pme->last_buttons) & GINPUT_MOUSE_BTN_LEFT))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((pme->current_buttons & GINPUT_MOUSE_BTN_LEFT)
|
||||||
|
&& pme->x >= gbw->gwin.x && pme->x < gbw->gwin.x + gbw->gwin.width
|
||||||
|
&& pme->y >= gbw->gwin.y && pme->y < gbw->gwin.y + gbw->gwin.height) {
|
||||||
|
|
||||||
|
gbw->state = !gbw->state;
|
||||||
|
|
||||||
|
gwinCheckboxDraw((GHandle)param);
|
||||||
|
}
|
||||||
|
#endif /* GFX_USE_GINPUT && GINPUT_NEED_MOUSE */
|
||||||
|
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef gh
|
||||||
|
#undef pbe
|
||||||
|
#undef pme
|
||||||
|
#undef pte
|
||||||
|
#undef pxe
|
||||||
|
#undef gsh
|
||||||
|
#undef gbw
|
||||||
|
}
|
||||||
|
|
||||||
|
GHandle gwinCheckboxCreate(GCheckboxObject *gb, coord_t x, coord_t y, coord_t width, coord_t height) {
|
||||||
|
if (!(gb = (GCheckboxObject *)_gwinInit((GWindowObject *)gb, x, y, width, height, sizeof(GCheckboxObject))))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
gb->gwin.type = GW_CHECKBOX;
|
||||||
|
gb->fn = 0;
|
||||||
|
gb->param = 0;
|
||||||
|
gb->state = GCHBX_UNSET;
|
||||||
|
|
||||||
|
gwinCheckboxSetStyle(&gb->gwin, GCHBX_NORMAL, &GCheckboxDefaultStyleSelected, &GCheckboxDefaultStyleUnselected);
|
||||||
|
geventListenerInit(&gb->listener);
|
||||||
|
geventRegisterCallback(&gb->listener, gwinCheckboxCallback, gb);
|
||||||
|
|
||||||
|
// checkboxes are enabled by default
|
||||||
|
gb->gwin.enabled = TRUE;
|
||||||
|
|
||||||
|
return (GHandle)gb;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gwinCheckboxSetStyle(GHandle gh, GCheckboxShape shape, const GCheckboxDrawStyle *pSelected, const GCheckboxDrawStyle *pUnselected) {
|
||||||
|
#define gcw ((GCheckboxObject *)gh)
|
||||||
|
|
||||||
|
if (gh->type != GW_CHECKBOX)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (shape) {
|
||||||
|
case GCHBX_NORMAL:
|
||||||
|
gcw->fn = gwinCheckboxDraw_Normal;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
gcw->fn = gwinCheckboxDraw_Normal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pSelected) {
|
||||||
|
gcw->set.color = pSelected->color;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pUnselected) {
|
||||||
|
gcw->unset.color = pSelected->color;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef gcw
|
||||||
|
}
|
||||||
|
|
||||||
|
void gwinCheckboxSetEnabled(GHandle gh, bool_t enabled) {
|
||||||
|
if (gh->type != GW_CHECKBOX)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gh->enabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gwinCheckboxDraw(GHandle gh) {
|
||||||
|
#define gcw ((GCheckboxObject *)gh)
|
||||||
|
|
||||||
|
if (gh->type != GW_CHECKBOX)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#if GDISP_NEED_CLIP
|
||||||
|
gdispSetClip(gh->x, gh->y, gh->width, gh->height);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
gcw->fn(gh,
|
||||||
|
gcw->gwin.enabled,
|
||||||
|
gcw->state,
|
||||||
|
gcw->param);
|
||||||
|
|
||||||
|
#undef gcw
|
||||||
|
}
|
||||||
|
|
||||||
|
void gwinCheckboxDraw_Normal(GHandle gh, bool_t enabled, bool_t state, void* param) {
|
||||||
|
(void) enabled;
|
||||||
|
(void) param;
|
||||||
|
|
||||||
|
if (state)
|
||||||
|
gdispClear(Green);
|
||||||
|
else
|
||||||
|
gdispClear(Red);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE
|
||||||
|
bool_t gwinCheckboxAttachMouse(GHandle gh, uint16_t instance) {
|
||||||
|
GSourceHandle gsh;
|
||||||
|
|
||||||
|
if (gh->type != GW_CHECKBOX || !(gsh = ginputGetMouse(instance)))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return geventAttachSource(&((GCheckboxObject *)gh)->listener, gsh, GLISTEN_MOUSEMETA);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* (GFX_USE_GWIN && GWIN_NEED_CHECKBOX) */
|
||||||
|
/** @} */
|
||||||
|
|
Loading…
Add table
Reference in a new issue