13 #include "../../gfx.h"
15 #if GFX_USE_GWIN && GWIN_NEED_BUTTON
17 #include "gwin_class.h"
20 #define BTN_CNR_SIZE 5
21 #define BTN_ARROWHEAD_DIV 0
22 #define BTN_ARROWBODY_DIV 2
23 #define BTN_TOP_FADE 50
24 #define BTN_BOTTOM_FADE 25
40 #if !GWIN_BUTTON_LAZY_RELEASE
50 #if GINPUT_NEED_KEYBOARD || GWIN_NEED_KEYBOARD
51 static void ButtonKeyboard(
GWidgetObject* gw, GEventKeyboard* pke)
54 if (pke->c[0] == GKEY_ENTER || pke->c[0] == GKEY_SPACE) {
61 if (!(pke->keystate & GKEYSTATE_KEYUP))
68 #if GINPUT_NEED_TOGGLE
85 static void ButtonToggleAssign(
GWidgetObject *gw, gU16 role, gU16 instance) {
106 #if GINPUT_NEED_MOUSE
113 #if GINPUT_NEED_KEYBOARD || GWIN_NEED_KEYBOARD
118 #if GINPUT_NEED_TOGGLE
138 if (!(gw = (
GButtonObject *)_gwidgetCreate(g, &gw->w, pInit, &buttonVMT)))
141 #if GINPUT_NEED_TOGGLE
142 gw->toggle = GWIDGET_NO_INSTANCE;
165 #if GWIN_FLAT_STYLING
172 pcol = getButtonColors(gw);
179 _gwidgetDrawFocusRect(gw, 1, 1, gw->
g.
width-2, gw->
g.
height-2);
192 pcol = getButtonColors(gw);
198 for(alpha = 0, i = 0; i < gw->
g.
height; i++, alpha += dalpha)
206 _gwidgetDrawFocusRect(gw, 0, 0, gw->
g.
width-1, gw->
g.
height-1);
217 pcol = getButtonColors(gw);
220 if (gw->
g.
width >= 2*BTN_CNR_SIZE+10) {
231 #if GDISP_NEED_ELLIPSE
238 pcol = getButtonColors(gw);
247 #if GDISP_NEED_CONVEX_POLYGON
255 pcol = getButtonColors(gw);
261 #if BTN_ARROWHEAD_DIV == 0
262 if (gw->
g.
height <= arw[0].x) {
264 arw[1].
x = arw[0].
x+arw[3].
y;
266 arw[4].
x = arw[0].
x-arw[3].
y;
270 arw[1].
x = arw[0].
x << 1;
271 arw[2].
x = arw[0].
x + arw[0].
x/BTN_ARROWBODY_DIV;
272 arw[4].
x = arw[0].
x - arw[0].
x/BTN_ARROWBODY_DIV;
276 arw[1].
y = gw->
g.
height/BTN_ARROWHEAD_DIV;
277 arw[1].
x = arw[0].
x << 1;
278 arw[2].
x = arw[0].
x + arw[0].
x/BTN_ARROWBODY_DIV;
279 arw[4].
x = arw[0].
x - arw[0].
x/BTN_ARROWBODY_DIV;
289 arw[5].
x = arw[4].
x; arw[5].
y = arw[1].
y;
306 pcol = getButtonColors(gw);
312 #if BTN_ARROWHEAD_DIV == 0
313 if (gw->
g.
height <= arw[0].x) {
315 arw[1].
x = arw[0].
x+arw[0].
y;
317 arw[4].
x = arw[0].
x-arw[0].
y;
320 arw[1].
y = arw[0].
y - arw[0].
x;
321 arw[1].
x = arw[0].
x << 1;
322 arw[2].
x = arw[0].
x + arw[0].
x/BTN_ARROWBODY_DIV;
323 arw[4].
x = arw[0].
x - arw[0].
x/BTN_ARROWBODY_DIV;
327 arw[1].
y = arw[0].
y - gw->
g.
height/BTN_ARROWHEAD_DIV;
328 arw[1].
x = arw[0].
x << 1;
329 arw[2].
x = arw[0].
x + arw[0].
x/BTN_ARROWBODY_DIV;
330 arw[4].
x = arw[0].
x - arw[0].
x/BTN_ARROWBODY_DIV;
340 arw[5].
x = arw[4].
x; arw[5].
y = arw[1].
y;
357 pcol = getButtonColors(gw);
363 #if BTN_ARROWHEAD_DIV == 0
364 if (gw->
g.
width <= arw[0].y) {
366 arw[1].
y = arw[0].
y+arw[3].
x;
368 arw[4].
y = arw[0].
y-arw[3].
x;
372 arw[1].
y = arw[0].
y << 1;
373 arw[2].
y = arw[0].
y + arw[0].
y/BTN_ARROWBODY_DIV;
374 arw[4].
y = arw[0].
y - arw[0].
y/BTN_ARROWBODY_DIV;
378 arw[1].
x = gw->
g.
width/BTN_ARROWHEAD_DIV;
379 arw[1].
y = arw[0].
y << 1;
380 arw[2].
y = arw[0].
y + arw[0].
y/BTN_ARROWBODY_DIV;
381 arw[4].
y = arw[0].
y - arw[0].
y/BTN_ARROWBODY_DIV;
391 arw[5].
x = arw[1].
x; arw[5].
y = arw[4].
y;
408 pcol = getButtonColors(gw);
414 #if BTN_ARROWHEAD_DIV == 0
415 if (gw->
g.
width <= arw[0].y) {
417 arw[1].
y = arw[0].
y+arw[0].
x;
419 arw[4].
y = arw[0].
y-arw[0].
x;
422 arw[1].
x = arw[0].
x - arw[0].
y;
423 arw[1].
y = arw[0].
y << 1;
424 arw[2].
y = arw[0].
y + arw[0].
y/BTN_ARROWBODY_DIV;
425 arw[4].
y = arw[0].
y - arw[0].
y/BTN_ARROWBODY_DIV;
429 arw[1].
x = arw[0].
x - gw->
g.
width/BTN_ARROWHEAD_DIV;
430 arw[1].
y = arw[0].
y << 1;
431 arw[2].
y = arw[0].
y + arw[0].
y/BTN_ARROWBODY_DIV;
432 arw[4].
y = arw[0].
y - arw[0].
y/BTN_ARROWBODY_DIV;
442 arw[5].
x = arw[1].
x; arw[5].
y = arw[4].
y;
453 #if GDISP_NEED_IMAGE || defined(__DOXYGEN__)
459 pcol = getButtonColors(gw);
461 if (!(gw->
g.
flags & GWIN_FLG_SYSENABLED)) {
COLOR_TYPE gColor
The color type definition.
gColor gdispBlendColor(gColor fg, gColor bg, gU8 alpha)
Blend 2 colors according to the alpha.
void gdispGDrawPoly(GDisplay *g, gCoord tx, gCoord ty, const gPoint *pntarray, unsigned cnt, gColor color)
Draw an enclosed polygon (convex, non-convex or complex).
void gdispGDrawStringBox(GDisplay *g, gCoord x, gCoord y, gCoord cx, gCoord cy, const char *str, gFont font, gColor color, gJustify justify)
Draw a text string vertically centered within the specified box.
void gdispGDrawRoundedBox(GDisplay *g, gCoord x, gCoord y, gCoord cx, gCoord cy, gCoord radius, gColor color)
Draw a rectangular box with rounded corners.
void gdispGDrawEllipse(GDisplay *g, gCoord x, gCoord y, gCoord a, gCoord b, gColor color)
Draw an ellipse.
void gdispGFillEllipse(GDisplay *g, gCoord x, gCoord y, gCoord a, gCoord b, gColor color)
Draw a filled ellipse.
void gdispGFillArea(GDisplay *g, gCoord x, gCoord y, gCoord cx, gCoord cy, gColor color)
Fill an area with a color.
void gdispGDrawLine(GDisplay *g, gCoord x0, gCoord y0, gCoord x1, gCoord y1, gColor color)
Draw a line.
void gdispGFillRoundedBox(GDisplay *g, gCoord x, gCoord y, gCoord cx, gCoord cy, gCoord radius, gColor color)
Draw a filled rectangular box with rounded corners.
void gdispGFillStringBox(GDisplay *g, gCoord x, gCoord y, gCoord cx, gCoord cy, const char *str, gFont font, gColor color, gColor bgColor, gJustify justify)
Draw a text string vertically centered within the specified box. The box background is filled with th...
gI16 gCoord
The type for a coordinate or length on the screen.
void gdispGFillConvexPoly(GDisplay *g, gCoord tx, gCoord ty, const gPoint *pntarray, unsigned cnt, gColor color)
Fill a convex polygon.
void gdispGDrawBox(GDisplay *g, gCoord x, gCoord y, gCoord cx, gCoord cy, gColor color)
Draw a rectangular box.
gI32 fixed
The type for a fixed point type.
#define FIXED(x)
Macros to convert to and from a fixed point.
gdispImageError gdispGImageDraw(GDisplay *g, gImage *img, gCoord x, gCoord y, gCoord cx, gCoord cy, gCoord sx, gCoord sy)
Draw the image.
void gwinSetVisible(GHandle gh, gBool visible)
Sets whether a window is visible or not.
A window object structure.
const struct gwinVMT * vmt
The structure for an image.
Type for a 2D point on the screen.
The Virtual Method Table for a GWIN window.