-
Notifications
You must be signed in to change notification settings - Fork 0
/
button.c
109 lines (94 loc) · 2.51 KB
/
button.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
* button.c
*
* Created on: 2017年12月12日
* Author: frank
*/
#include "button.h"
#include "graphics.h"
void drawButton(rgba *p, button *b) {
fillRectangleWithRgba(p, b->x, b->y, b->width, b->height, (b->color));
}
void setButtonColorRGBA(button *b, int rgb, int alpha) {
rgba* color = &(b->release_color);
for (int i = 0; i < 3; i++) {
setRgb(color + i, rgb);
color[i].alpha = alpha;
}
}
void setButtonColorRGB(button *b, int rgb) {
rgba* color = &(b->release_color);
for (int i = 0; i < 3; i++) {
setRgb(color + i, rgb);
}
}
void setButtonAlpha(button *b, int alpha) {
rgba* color = &(b->release_color);
for (int i = 0; i < 3; i++) {
color[i].alpha = alpha;
}
}
void setActionListener(button *b, void (*actionListener)(ActionEvent *e)) {
b->actionListener = actionListener;
}
void defaultActionListener(ActionEvent *e) {
}
button* createButton(int x, int y, int width, int height, rgba release_color,
rgba hover_color, rgba press_color) {
button *b = (button *) malloc(sizeof(button));
b->x = x;
b->y = y;
b->width = width;
b->height = height;
b->release_color = release_color;
b->hover_color = hover_color;
b->press_color = press_color;
b->color = &(b->release_color);
b->state = BUTTON_STATE_RELEASED;
b->actionListener = defaultActionListener;
return b;
}
button* createDefaultButton(int x, int y, int width, int height) {
return createButton(x, y, width, height, BUTTON_DEFAULT_RELEASED_COLOR,
BUTTON_DEFAULT_HOVERED_COLOR, BUTTON_DEFAULT_PRESSED_COLOR);
}
void pressButton(button *b, InputEnent *e) {
b->state = (b->state & 0xf0) | BUTTON_STATE_PRESSED | (e->type << 4);
b->color = &(b->press_color);
}
void hoverButton(button *b, InputEnent *e) {
if (b->state == BUTTON_STATE_RELEASED) {
b->state = BUTTON_STATE_HOVERED;
b->color = &(b->hover_color);
}
}
void releaseButton(button *b, InputEnent *e) {
int type = (e->type << 4);
int result = (b->state & 0xf0) & type;
b->state &= ~type;
if (((b->state) & 0xf) == BUTTON_STATE_PRESSED) {
if (!((b->state) & 0xf0)) {
b->state = BUTTON_STATE_RELEASED;
b->color = &(b->release_color);
e->src = (void *) b;
b->actionListener((ActionEvent *) e);
}
}
}
void exitButton(button *b, InputEnent *e) {
if (b->state == BUTTON_STATE_RELEASED)
return;
b->state = BUTTON_STATE_RELEASED;
b->color = &(b->release_color);
}
bool inButton(button *b, int x, int y) {
if (x < b->x)
return false;
if (y < b->y)
return false;
if (x > b->x + b->width)
return false;
if (y > b->y + b->height)
return false;
return true;
}