annotate libcore/core/theme.c @ 135:eadfed7674ac

misc: fix all warnings
author David Demelier <markand@malikania.fr>
date Sun, 11 Oct 2020 15:01:26 +0200
parents 197374e9f0b2
children 7f1af54bb35a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * theme.c -- abstract theming
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stddef.h>
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include "button.h"
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
23 #include "checkbox.h"
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include "font.h"
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include "frame.h"
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include "label.h"
107
62aeb864093f molko-bcc: initial import
David Demelier <markand@malikania.fr>
parents: 106
diff changeset
27 #include "maths.h"
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include "painter.h"
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include "panic.h"
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #include "texture.h"
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include "theme.h"
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include "util.h"
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
133
c46f80820b42 core: revamp debug using theme
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
34 #include <core/assets/fonts/f25-bank-printer.h>
c46f80820b42 core: revamp debug using theme
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
35 #include <core/assets/fonts/comic-neue.h>
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
36
108
5e38f88cb9ab make: generate binary files during build
David Demelier <markand@malikania.fr>
parents: 107
diff changeset
37 #define THEME(t) (t ? t : &default_theme)
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
38
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
39 #define CHECKBOX_W 16
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
40 #define CHECKBOX_H 16
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
41 #define CHECKBOX_RAD 6
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
42
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 static void
105
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
44 box(int x, int y, unsigned int w, unsigned int h)
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
45 {
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
46 /* Some basic outlines. */
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
47 painter_set_color(0x4d3533ff);
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
48
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
49 painter_draw_line(x, y, x + w, y);
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
50 painter_draw_line(x, y + h, x + w, y + h);
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
51 painter_draw_line(x, y, x, y + h);
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
52 painter_draw_line(x + w, y, x + w, y + h);
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
53 }
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
54
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
55 static void
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 draw_frame(struct theme *t, const struct frame *frame)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 {
135
eadfed7674ac misc: fix all warnings
David Demelier <markand@malikania.fr>
parents: 134
diff changeset
58 (void)t;
eadfed7674ac misc: fix all warnings
David Demelier <markand@malikania.fr>
parents: 134
diff changeset
59
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
60 if (frame->style == FRAME_STYLE_BOX)
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
61 painter_set_color(0x6e4c30ff);
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
62 else
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
63 painter_set_color(0xce9248ff);
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
64
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 painter_draw_rectangle(frame->x, frame->y, frame->w, frame->h);
105
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
66 box(frame->x, frame->y, frame->w, frame->h);
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
68
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 static void
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 draw_label(struct theme *t, const struct label *label)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 struct texture tex;
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
73 int x = label->x, y = label->y;
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
74 int *px = &x, *py = &y;
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
75
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
76 if (label->flags & LABEL_NO_HCENTER)
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
77 px = NULL;
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
78 if (label->flags & LABEL_NO_VCENTER)
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
79 py = NULL;
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
101
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
81 /* Shadow text, only if enabled. */
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
82 if (!(label->flags & LABEL_NO_SHADOW)) {
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
83 t->fonts[THEME_FONT_INTERFACE]->color = t->colors[THEME_COLOR_SHADOW];
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
84
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
85 if (!font_render(t->fonts[THEME_FONT_INTERFACE], &tex, label->text))
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
86 panic();
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
87
106
ed1a6bb02a78 inventory_dialog: use a small circle as test
David Demelier <markand@malikania.fr>
parents: 105
diff changeset
88 maths_centerize(px, py, tex.w, tex.h,
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
89 label->x, label->y, label->w, label->h);
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
90
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
91 texture_draw(&tex, x + 1, y + 1);
101
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
92 texture_finish(&tex);
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
93 }
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
94
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
95 /* Normal text. */
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
96 t->fonts[THEME_FONT_INTERFACE]->color = label->color
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
97 ? label->color
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
98 : t->colors[THEME_COLOR_NORMAL];
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
99
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 if (!font_render(t->fonts[THEME_FONT_INTERFACE], &tex, label->text))
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 panic();
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
102
106
ed1a6bb02a78 inventory_dialog: use a small circle as test
David Demelier <markand@malikania.fr>
parents: 105
diff changeset
103 maths_centerize(px, py, tex.w, tex.h,
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
104 label->x, label->y, label->w, label->h);
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
105
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
106 texture_draw(&tex, x, y);
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 texture_finish(&tex);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 static void
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 draw_button(struct theme *t, const struct button *button)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 {
135
eadfed7674ac misc: fix all warnings
David Demelier <markand@malikania.fr>
parents: 134
diff changeset
113 (void)t;
eadfed7674ac misc: fix all warnings
David Demelier <markand@malikania.fr>
parents: 134
diff changeset
114
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
115 struct label label = {
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
116 .text = button->text,
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
117 .x = button->x,
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
118 .y = button->y,
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
119 .w = button->w,
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
120 .h = button->h
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
121 };
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
122
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 painter_set_color(0xabcdefff);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 painter_draw_rectangle(button->x, button->y, button->w, button->h);
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
125
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
126 label_draw(&label);
105
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
127
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
128 box(button->x, button->y, button->w, button->h);
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
130
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
131 static void
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
132 draw_checkbox(struct theme *t, const struct checkbox *cb)
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
133 {
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
134 box(cb->x, cb->y, CHECKBOX_W, CHECKBOX_H);
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
135
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
136 if (cb->checked)
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
137 painter_draw_rectangle(cb->x + 5, cb->y + 5, CHECKBOX_W - 9, CHECKBOX_H - 9);
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
138
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
139 if (cb->label) {
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
140 const unsigned int w = cb->w - (t->padding * 2) - CHECKBOX_W;
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
141 const int x = cb->x + (t->padding * 2) + CHECKBOX_W;
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
142
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
143 struct label label = {
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
144 .text = cb->label,
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
145 .flags = LABEL_NO_HCENTER,
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
146 .x = x,
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
147 .y = cb->y,
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
148 .w = w,
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
149 .h = cb->h
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
150 };
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
151
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
152 draw_label(t, &label);
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
153 }
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
154 }
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
155
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 /* Default theme. */
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 static struct theme default_theme = {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 .colors = {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 [THEME_COLOR_NORMAL] = 0xffffffff,
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 [THEME_COLOR_SELECTED] = 0x006554ff,
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 [THEME_COLOR_SHADOW] = 0x000000ff
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 },
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
163 .padding = 10,
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 .draw_frame = draw_frame,
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 .draw_label = draw_label,
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
166 .draw_button = draw_button,
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
167 .draw_checkbox = draw_checkbox
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 };
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
169
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 /* Default font catalog. */
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 #define FONT(bin, size, index) \
135
eadfed7674ac misc: fix all warnings
David Demelier <markand@malikania.fr>
parents: 134
diff changeset
172 { bin, sizeof (bin), size, &default_theme.fonts[index], {0} }
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
173
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 static struct font_catalog {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 const unsigned char *data;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 const size_t datasz;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 unsigned int size;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 struct font **dest;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 struct font font;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 } default_fonts[] = {
134
197374e9f0b2 cmake: prefix assets with their directory
David Demelier <markand@malikania.fr>
parents: 133
diff changeset
181 FONT(fonts_f25_bank_printer, 10, THEME_FONT_DEBUG),
197374e9f0b2 cmake: prefix assets with their directory
David Demelier <markand@malikania.fr>
parents: 133
diff changeset
182 FONT(fonts_comic_neue, 20, THEME_FONT_INTERFACE)
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 };
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
184
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 bool
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 theme_init(void)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 /* Open all fonts. */
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 for (size_t i = 0; i < NELEM(default_fonts); ++i) {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 struct font_catalog *fc = &default_fonts[i];
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
191
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 if (!font_openmem(&fc->font, fc->data, fc->datasz, fc->size))
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 goto failed;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
194
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 /* Reference this font into the catalog. */
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 *default_fonts[i].dest = &default_fonts[i].font;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 return true;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
200
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 failed:
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 theme_finish();
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
203
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 return false;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
206
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 struct theme *
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 theme_default(void)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 return &default_theme;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
212
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
213 unsigned int
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
214 theme_padding(const struct theme *t)
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
215 {
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
216 return THEME(t)->padding;
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
217 }
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
218
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 void
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 theme_draw_frame(struct theme *t, const struct frame *frame)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 assert(frame);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
223
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 THEME(t)->draw_frame(THEME(t), frame);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
226
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 void
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 theme_draw_label(struct theme *t, const struct label *label)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 assert(label);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
231
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 THEME(t)->draw_label(THEME(t), label);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
234
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 void
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 theme_draw_button(struct theme *t, const struct button *button)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 assert(button);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
239
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 THEME(t)->draw_button(THEME(t), button);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
242
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 void
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
244 theme_draw_checkbox(struct theme *t, const struct checkbox *cb)
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
245 {
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
246 assert(cb);
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
247
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
248 THEME(t)->draw_checkbox(THEME(t), cb);
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
249 }
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
250
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
251 void
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 theme_finish(void)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 for (size_t i = 0; i < NELEM(default_fonts); ++i) {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 font_finish(&default_fonts[i].font);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 *default_fonts[i].dest = NULL;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 }