annotate examples/example-ui.c @ 151:b19d076856d2

ui: cleanup theme module, closes #2498
author David Demelier <markand@malikania.fr>
date Thu, 15 Oct 2020 14:01:24 +0200
parents
children 1008a796a9e7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
151
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * example-action.c -- example on how to use automatic actions
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <core/clock.h>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <core/event.h>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <core/panic.h>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <core/painter.h>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <core/sys.h>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <core/util.h>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <core/window.h>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <ui/button.h>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include <ui/checkbox.h>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include <ui/frame.h>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #include <ui/label.h>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include <ui/theme.h>
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 #define W (1280)
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #define H (720)
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 static struct frame frame = {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 .x = 10,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 .y = 10,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 .w = 400,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 .h = 200
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 };
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
42
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 static struct label title = {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 .text = "Preferences",
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 .x = 10,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 .y = 10,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 .w = 400,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 .h = 200,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 .flags = LABEL_FLAGS_SHADOW,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 .align = ALIGN_TOP_LEFT
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 };
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 static struct {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 struct checkbox cb;
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 struct label label;
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 } autosave = {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 .cb = {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 .x = 20,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 .y = 60,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 .w = 20,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 .h = 20
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 },
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 .label = {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 .text = "Auto save game",
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 .x = 20 + 20,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 .y = 60,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 .w = 200,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 .h = 20,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 .align = ALIGN_LEFT,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 .flags = LABEL_FLAGS_SHADOW
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 }
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 };
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 static struct button btquit = {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 .text = "Quit",
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 .w = 50,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 .h = 20
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 };
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 static void
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 init(void)
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 if (!sys_init() ||
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 !window_init("Example - UI", W, H) ||
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 !theme_init())
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 panic();
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 }
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
88
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 static void
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 run(void)
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 struct clock clock = {0};
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
93
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 clock_start(&clock);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
95
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 for (;;) {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 unsigned int elapsed = clock_elapsed(&clock);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 clock_start(&clock);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 for (union event ev; event_poll(&ev); ) {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 switch (ev.type) {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 case EVENT_QUIT:
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 return;
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 default:
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 checkbox_handle(&autosave.cb, &ev);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 button_handle(&btquit, &ev);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 if (btquit.state == BUTTON_STATE_ACTIVATED)
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 return;
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
111
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 break;
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 }
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 }
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 /* Compute button position at runtime. */
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 align(ALIGN_BOTTOM_RIGHT, &btquit.x, &btquit.y, btquit.w, btquit.h,
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 frame.x, frame.y, frame.w, frame.h);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 btquit.x -= theme_default()->padding;
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 btquit.y -= theme_default()->padding;
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
122
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 painter_set_color(0xffffffff);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 painter_clear();
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 frame_draw(&frame);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 label_draw(&title);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 checkbox_draw(&autosave.cb);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 label_draw(&autosave.label);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 button_draw(&btquit);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 painter_present();
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 if ((elapsed = clock_elapsed(&clock)) < 20)
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 delay(20 - elapsed);
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 }
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 }
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 static void
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 quit(void)
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 theme_finish();
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 window_finish();
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 sys_finish();
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 }
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
144
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 int
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 main(int argc, char **argv)
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 {
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 (void)argc;
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 (void)argv;
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 init();
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 run();
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 quit();
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
154
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 return 0;
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 }
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents:
diff changeset
157