annotate libui/ui/theme.c @ 149:a43e79d489ea

ui: allow custom position of labels
author David Demelier <markand@malikania.fr>
date Thu, 15 Oct 2020 10:45:40 +0200
parents c577c15df07f
children 9733d379be89
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>
146
7d7ea7a9cf50 core: add theme_shallow function
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
21 #include <string.h>
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
148
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
23 #include <core/font.h>
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
24 #include <core/maths.h>
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
25 #include <core/painter.h>
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
26 #include <core/panic.h>
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
27 #include <core/texture.h>
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
28 #include <core/util.h>
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
133
c46f80820b42 core: revamp debug using theme
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
30 #include <core/assets/fonts/f25-bank-printer.h>
c46f80820b42 core: revamp debug using theme
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
31 #include <core/assets/fonts/comic-neue.h>
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
32
148
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
33 #include "button.h"
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
34 #include "checkbox.h"
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
35 #include "frame.h"
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
36 #include "label.h"
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
37 #include "theme.h"
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
38
108
5e38f88cb9ab make: generate binary files during build
David Demelier <markand@malikania.fr>
parents: 107
diff changeset
39 #define THEME(t) (t ? t : &default_theme)
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
40
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
41 #define CHECKBOX_W 16
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
42 #define CHECKBOX_H 16
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
43 #define CHECKBOX_RAD 6
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
44
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 static void
105
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
46 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
47 {
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
48 /* Some basic outlines. */
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
49 painter_set_color(0x4d3533ff);
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
50
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
51 painter_draw_line(x, y, x + w, y);
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
52 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
53 painter_draw_line(x, y, x, y + h);
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
54 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
55 }
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
56
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
57 static void
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 draw_frame(struct theme *t, const struct frame *frame)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 {
135
eadfed7674ac misc: fix all warnings
David Demelier <markand@malikania.fr>
parents: 134
diff changeset
60 (void)t;
eadfed7674ac misc: fix all warnings
David Demelier <markand@malikania.fr>
parents: 134
diff changeset
61
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
62 if (frame->style == FRAME_STYLE_BOX)
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
63 painter_set_color(0x6e4c30ff);
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
64 else
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
65 painter_set_color(0xce9248ff);
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
66
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 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
68 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
69 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 static void
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 draw_label(struct theme *t, const struct label *label)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 {
145
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
74 struct font *font;
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 struct texture tex;
145
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
76 int x, y, bx, by;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
77 unsigned int tw, th, bw, bh;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
78
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
79 /* Compute real box size according to padding. */
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
80 bx = label->x + t->padding;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
81 by = label->y + t->padding;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
82 bw = label->w - (t->padding * 2);
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
83 bh = label->h - (t->padding * 2);
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
84
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
85 /* Make a shallow copy of the interface font. */
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
86 font = t->fonts[THEME_FONT_INTERFACE];
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
87
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
88 /* Compute text size. */
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
89 if (!font_box(font, label->text, &tw, &th))
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
90 panic();
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
91
145
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
92 /* Compute position according to alignment and box. */
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
93 switch (label->align) {
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
94 case LABEL_ALIGN_CENTER:
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
95 maths_centerize(&x, &y, tw, th, bx, by, bw, bh);
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
96 break;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
97 case LABEL_ALIGN_TOP_LEFT:
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
98 x = bx;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
99 y = by;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
100 break;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
101 case LABEL_ALIGN_TOP:
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
102 maths_centerize(&x, NULL, tw, th, bx, by, bw, bh);
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
103 y = by;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
104 break;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
105 case LABEL_ALIGN_TOP_RIGHT:
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
106 x = bx + bw - tw;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
107 y = by;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
108 break;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
109 case LABEL_ALIGN_RIGHT:
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
110 maths_centerize(NULL, &y, tw, th, bx, by, bw, bh);
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
111 x = bx + bw - tw;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
112 break;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
113 case LABEL_ALIGN_BOTTOM_RIGHT:
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
114 x = bx + bw - tw;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
115 y = by + bh - th;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
116 break;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
117 case LABEL_ALIGN_BOTTOM:
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
118 maths_centerize(&x, NULL, tw, th, bx, by, bw, bh);
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
119 y = by + bh - th;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
120 break;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
121 case LABEL_ALIGN_BOTTOM_LEFT:
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
122 x = bx;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
123 y = by + bh - th;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
124 break;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
125 case LABEL_ALIGN_LEFT:
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
126 maths_centerize(NULL, &y, tw, th, bx, by, bw, bh);
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
127 x = bx;
149
a43e79d489ea ui: allow custom position of labels
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
128 break;
145
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
129 default:
149
a43e79d489ea ui: allow custom position of labels
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
130 x = label->x;
a43e79d489ea ui: allow custom position of labels
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
131 y = label->y;
145
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
132 break;
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
133 }
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
134
101
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
135 /* Shadow text, only if enabled. */
145
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
136 if (label->flags & LABEL_FLAGS_SHADOW) {
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
137 font->color = t->colors[THEME_COLOR_SHADOW];
101
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
138
145
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
139 if (!font_render(font, &tex, label->text))
101
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
140 panic();
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
141
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
142 texture_draw(&tex, x + 1, y + 1);
101
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
143 texture_finish(&tex);
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
144 }
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
145
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
146 /* Normal text. */
145
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
147 font->color = t->colors[THEME_COLOR_NORMAL];
101
0bc32f70d67c label: add more customization
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
148
145
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
149 if (!font_render(font, &tex, label->text))
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 panic();
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
151
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
152 texture_draw(&tex, x, y);
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 texture_finish(&tex);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
155
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 static void
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 draw_button(struct theme *t, const struct button *button)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 {
135
eadfed7674ac misc: fix all warnings
David Demelier <markand@malikania.fr>
parents: 134
diff changeset
159 (void)t;
eadfed7674ac misc: fix all warnings
David Demelier <markand@malikania.fr>
parents: 134
diff changeset
160
102
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
161 struct label label = {
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
162 .text = button->text,
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
163 .x = button->x,
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
164 .y = button->y,
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
165 .w = button->w,
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
166 .h = button->h
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
167 };
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 painter_set_color(0xabcdefff);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 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
171
26fef20fd89d inventory_dialog: draw basic shapes
David Demelier <markand@malikania.fr>
parents: 101
diff changeset
172 label_draw(&label);
105
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
173
f6b5e2fbbc81 inventory_dialog: add basic movements
David Demelier <markand@malikania.fr>
parents: 102
diff changeset
174 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
175 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
176
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
177 static void
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
178 draw_checkbox(struct theme *t, const struct checkbox *cb)
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
179 {
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
180 box(cb->x, cb->y, CHECKBOX_W, CHECKBOX_H);
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
181
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
182 if (cb->checked)
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
183 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
184
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
185 if (cb->label) {
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
186 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
187 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
188
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
189 struct label label = {
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
190 .text = cb->label,
145
7f1af54bb35a core: rework label alignment, closes #2494 @1h
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
191 .align = LABEL_ALIGN_LEFT,
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
192 .x = x,
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
193 .y = cb->y,
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
194 .w = w,
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
195 .h = cb->h
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
196 };
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
197
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
198 draw_label(t, &label);
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
199 }
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
200 }
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
201
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 /* Default theme. */
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 static struct theme default_theme = {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 .colors = {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 [THEME_COLOR_NORMAL] = 0xffffffff,
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 [THEME_COLOR_SELECTED] = 0x006554ff,
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 [THEME_COLOR_SHADOW] = 0x000000ff
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 },
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
209 .padding = 10,
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 .draw_frame = draw_frame,
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 .draw_label = draw_label,
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
212 .draw_button = draw_button,
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
213 .draw_checkbox = draw_checkbox
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 };
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
215
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 /* Default font catalog. */
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 #define FONT(bin, size, index) \
135
eadfed7674ac misc: fix all warnings
David Demelier <markand@malikania.fr>
parents: 134
diff changeset
218 { 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
219
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 static struct font_catalog {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 const unsigned char *data;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 const size_t datasz;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 unsigned int size;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 struct font **dest;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 struct font font;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 } default_fonts[] = {
134
197374e9f0b2 cmake: prefix assets with their directory
David Demelier <markand@malikania.fr>
parents: 133
diff changeset
227 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
228 FONT(fonts_comic_neue, 20, THEME_FONT_INTERFACE)
99
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
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 bool
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 theme_init(void)
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 /* Open all fonts. */
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 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
236 struct font_catalog *fc = &default_fonts[i];
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 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
239 goto failed;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
240
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 /* Reference this font into the catalog. */
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 *default_fonts[i].dest = &default_fonts[i].font;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
244
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 return true;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
246
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 failed:
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 theme_finish();
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
249
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 return false;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
252
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 struct theme *
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 theme_default(void)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 return &default_theme;
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
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
259 unsigned int
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
260 theme_padding(const struct theme *t)
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
261 {
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
262 return THEME(t)->padding;
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
263 }
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
264
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 void
146
7d7ea7a9cf50 core: add theme_shallow function
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
266 theme_shallow(struct theme *dst, const struct theme *src)
7d7ea7a9cf50 core: add theme_shallow function
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
267 {
7d7ea7a9cf50 core: add theme_shallow function
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
268 assert(dst);
7d7ea7a9cf50 core: add theme_shallow function
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
269
7d7ea7a9cf50 core: add theme_shallow function
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
270 memcpy(dst, src ? src : &default_theme, sizeof (*src));
7d7ea7a9cf50 core: add theme_shallow function
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
271 }
7d7ea7a9cf50 core: add theme_shallow function
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
272
7d7ea7a9cf50 core: add theme_shallow function
David Demelier <markand@malikania.fr>
parents: 145
diff changeset
273 void
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 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
275 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 assert(frame);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
277
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 THEME(t)->draw_frame(THEME(t), frame);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
280
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 void
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 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
283 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 assert(label);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
285
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 THEME(t)->draw_label(THEME(t), label);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
288
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 void
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 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
291 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 assert(button);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
293
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 THEME(t)->draw_button(THEME(t), button);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
296
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 void
115
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
298 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
299 {
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
300 assert(cb);
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
301
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
302 THEME(t)->draw_checkbox(THEME(t), cb);
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
303 }
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
304
3bd0d3a39e30 core: implement checkbox, closes #2486
David Demelier <markand@malikania.fr>
parents: 108
diff changeset
305 void
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 theme_finish(void)
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 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
309 font_finish(&default_fonts[i].font);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 *default_fonts[i].dest = NULL;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 }