annotate libmlk-rpg/mlk/rpg/message.c @ 646:7e1eb7f6c049 default tip @

misc: remove .clang
author David Demelier <markand@malikania.fr>
date Sun, 04 Feb 2024 15:24:37 +0100
parents e16808365d42
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * message.c -- message dialog
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
445
773a082f0b91 misc: update copyright years
David Demelier <markand@malikania.fr>
parents: 441
diff changeset
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr>
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
67
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
20 #include <stdlib.h>
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
21 #include <string.h>
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
585
76ce31b0151f misc: minor edits
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
23 #include <mlk/core/err.h>
431
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
24 #include <mlk/core/event.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
25 #include <mlk/core/font.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
26 #include <mlk/core/maths.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
27 #include <mlk/core/painter.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
28 #include <mlk/core/panic.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
29 #include <mlk/core/sprite.h>
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
30 #include <mlk/core/texture.h>
431
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
31 #include <mlk/core/trace.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
32 #include <mlk/core/util.h>
148
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
33
433
862b15c3a3ae ui: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 431
diff changeset
34 #include <mlk/ui/align.h>
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
35 #include <mlk/ui/ui.h>
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
36 #include <mlk/ui/ui_p.h>
148
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
37
28
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
38 #include "message.h"
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
635
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
40 static inline int
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
41 is_selectable(const struct mlk_message *msg, size_t n)
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
42 {
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
43 return msg->lines[n] && ((msg->selectable >> n) & 0x1) == 1;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
44 }
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
45
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
46 static inline struct mlk_message_style *
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
47 get_style(struct mlk_message *msg)
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
48 {
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
49 return msg->style ? msg->style : mlk_message_style;
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
50 }
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
51
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
52 static inline struct mlk_font *
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
53 get_font(struct mlk_message *msg)
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
54 {
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
55 return MLK__STYLE_FONT(get_style(msg)->font, MLK_UI_FONT_INTERFACE);
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
56 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
57
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
58 static unsigned int
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
59 min_width(struct mlk_message_style *style, struct mlk_message *msg)
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
60 {
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
61 struct mlk_font *font;
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
62 unsigned int maxw = 0, w = 0;
486
d6757c30658e core: rework errors
David Demelier <markand@malikania.fr>
parents: 483
diff changeset
63 int err;
158
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
64
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
65 font = MLK__STYLE_FONT(style->font, MLK_UI_FONT_INTERFACE);
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
66
391
9334b420c975 rpg: don't use fixed size messages
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
67 for (size_t i = 0; i < msg->linesz; ++i) {
9334b420c975 rpg: don't use fixed size messages
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
68 if (!msg->lines[i])
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
69 continue;
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
70 if ((err = mlk_font_query(font, msg->lines[i], &w, NULL)) < 0)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
71 return err;
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
72 if (w > maxw)
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
73 maxw = w;
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
74 }
158
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
75
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
76 return (style->padding * 2) + maxw;
158
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
77 }
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
78
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
79 static unsigned int
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
80 min_height(struct mlk_message_style *style, struct mlk_message *msg)
158
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
81 {
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
82 assert(msg);
158
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
83
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
84 struct mlk_font *font;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
85 unsigned int lh;
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
86
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
87 font = MLK__STYLE_FONT(style->font, MLK_UI_FONT_INTERFACE);
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
88 lh = mlk_font_height(font);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
89
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
90 return (style->padding * 2) + (msg->linesz * lh) + ((msg->linesz - 1) * style->padding);
158
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
91 }
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
92
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
93 static void
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
94 draw_frame(struct mlk_message *msg)
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
95 {
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
96 struct mlk_message_style *style = get_style(msg);
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
97
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
98 mlk_painter_set_color(style->border);
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
99 mlk_painter_draw_rectangle(0, 0, msg->w, msg->h);
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
100 mlk_painter_set_color(style->background);
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
101 mlk_painter_draw_rectangle(
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
102 style->border_size,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
103 style->border_size,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
104 msg->w - (style->border_size * 2),
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
105 msg->h - (style->border_size * 2)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
106 );
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
107 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
108
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
109 static void
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
110 draw_lines(struct mlk_message *msg)
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
111 {
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
112 struct mlk_message_style *style;
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
113 struct mlk_font *font;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
114 struct mlk_texture texture;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
115 unsigned long color;
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 535
diff changeset
116 int x, y;
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
117
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
118 style = get_style(msg);
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
119 font = get_font(msg);
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
120
391
9334b420c975 rpg: don't use fixed size messages
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
121 for (size_t i = 0; i < msg->linesz; ++i) {
9334b420c975 rpg: don't use fixed size messages
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
122 if (!msg->lines[i])
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
123 continue;
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
124
635
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
125 if (msg->selectable && msg->selected == i && is_selectable(msg, i))
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
126 color = style->color_selected;
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
127 else
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
128 color = style->color;
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
129
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 535
diff changeset
130 if (mlk_font_render(font, &texture, msg->lines[i], color) < 0) {
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 535
diff changeset
131 mlk_tracef("unable to render message text", mlk_err());
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
132 continue;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
133 }
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
134
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
135 x = style->padding;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
136 y = style->padding + (i * (texture.h + style->padding));
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
137
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
138 if (x + texture.w > msg->w)
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
139 mlk_tracef("message width too small: %u < %u", msg->w, min_width(style, msg));
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
140 if (y + texture.h > msg->h)
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
141 mlk_tracef("message height too small: %u < %u", msg->h, min_height(style, msg));
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
142
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
143 mlk_texture_draw(&texture, x, y);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
144 mlk_texture_finish(&texture);
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
145 }
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
146 }
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
147
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
148 static int
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
149 query(struct mlk_message_style *self,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
150 struct mlk_message *msg,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
151 unsigned int *w,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
152 unsigned int *h)
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 {
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
154 if (w)
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
155 *w = min_width(self, msg);
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
156 if (h)
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
157 *h = min_height(self, msg);
535
7d6a879901e0 misc: fix
David Demelier <markand@malikania.fr>
parents: 534
diff changeset
158
7d6a879901e0 misc: fix
David Demelier <markand@malikania.fr>
parents: 534
diff changeset
159 return 0;
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
160 }
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
161
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
162 static void
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
163 update(struct mlk_message_style *self,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
164 struct mlk_message *msg,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
165 unsigned int ticks)
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
166 {
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
167 (void)self;
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
168
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
169 const struct mlk_message_style *style = MLK__STYLE(msg, mlk_message_style);
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 msg->elapsed += ticks;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
172
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 switch (msg->state) {
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
174 case MLK_MESSAGE_STATE_OPENING:
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
175 msg->scale = (double)msg->elapsed / (double)style->speed;
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
176
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
177 if (msg->scale > 1)
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
178 msg->scale = 1;
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
179
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
180 if (msg->elapsed >= style->speed) {
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
181 msg->state = MLK_MESSAGE_STATE_SHOWING;
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
182 msg->elapsed = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
183 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
184
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 break;
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
186 case MLK_MESSAGE_STATE_SHOWING:
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 /* Do automatically switch state if requested by the user. */
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
188 if (msg->flags & MLK_MESSAGE_FLAGS_AUTOMATIC && msg->elapsed >= style->timeout) {
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
189 msg->state = msg->flags & MLK_MESSAGE_FLAGS_FADEOUT
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
190 ? MLK_MESSAGE_STATE_HIDING
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
191 : MLK_MESSAGE_STATE_NONE;
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
192 msg->elapsed = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
193 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
194
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
195 break;
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
196 case MLK_MESSAGE_STATE_HIDING:
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
197 msg->scale = 1 - (double)msg->elapsed / (double)style->speed;
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
198
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
199 if (msg->scale < 0)
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
200 msg->scale = 0;
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
201 if (msg->elapsed >= style->speed) {
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
202 msg->state = MLK_MESSAGE_STATE_NONE;
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
203 msg->elapsed = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
204 }
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 break;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 default:
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 break;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 }
60
7266c750b649 core: simplify message
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
210
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
211 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
212
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
213 static void
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
214 draw(struct mlk_message_style *self, struct mlk_message *msg)
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 {
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
216 (void)self;
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
472
bc5483849614 core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents: 465
diff changeset
218 struct mlk_texture tex;
638
e16808365d42 core: s/mlk_texture_new/mlk_texture_init/g
David Demelier <markand@malikania.fr>
parents: 635
diff changeset
219 int x, y;
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
220 unsigned int w, h;
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
221
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
222 if (msg->w == 0 || msg->h == 0) {
473
02b16dd49b54 core: trace -> mlk_trace
David Demelier <markand@malikania.fr>
parents: 472
diff changeset
223 mlk_tracef("message has null dimensions");
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
224 return;
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
225 }
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
226
638
e16808365d42 core: s/mlk_texture_new/mlk_texture_init/g
David Demelier <markand@malikania.fr>
parents: 635
diff changeset
227 if (mlk_texture_init(&tex, msg->w, msg->h) < 0)
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 535
diff changeset
228 mlk_panic();
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
229
457
04797b35565c core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
230 MLK_PAINTER_BEGIN(&tex);
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
231 draw_frame(msg);
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
232 draw_lines(msg);
457
04797b35565c core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
233 MLK_PAINTER_END();
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
234
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
235 /* Compute scaling. */
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
236 w = msg->w * msg->scale;
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
237 h = msg->h * msg->scale;
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
238
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
239 /* Centerize within its drawing area. */
487
f2d3c5a97884 ui: align -> mlk_align
David Demelier <markand@malikania.fr>
parents: 486
diff changeset
240 mlk_align(MLK_ALIGN_CENTER, &x, &y, w, h, msg->x, msg->y, msg->w, msg->h);
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
241
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
242 /* Draw and clear. */
472
bc5483849614 core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents: 465
diff changeset
243 mlk_texture_scale(&tex, 0, 0, msg->w, msg->h, x, y, w, h, 0);
bc5483849614 core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents: 465
diff changeset
244 mlk_texture_finish(&tex);
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 }
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
246
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
247 // TODO: add dark variant.
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
248 struct mlk_message_style mlk_message_style_dark = {
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
249 .background = MLK_UI_COLOR_BG,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
250 .border = MLK_UI_COLOR_BORDER,
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
251 .border_size = MLK_UI_BORDER,
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
252 .color = MLK_UI_COLOR_TEXT,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
253 .color_selected = MLK_UI_COLOR_SELECTED,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
254 .padding = MLK_UI_PADDING,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
255 .timeout = MLK_MESSAGE_TIMEOUT_DEFAULT,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
256 .speed = MLK_MESSAGE_SPEED_DEFAULT,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
257 .query = query,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
258 .update = update,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
259 .draw = draw
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
260 };
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
261
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
262 struct mlk_message_style mlk_message_style_light = {
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
263 .background = MLK_UI_COLOR_BG,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
264 .border = MLK_UI_COLOR_BORDER,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
265 .border_size = MLK_UI_BORDER,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
266 .color = MLK_UI_COLOR_TEXT,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
267 .color_selected = MLK_UI_COLOR_SELECTED,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
268 .padding = MLK_UI_PADDING,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
269 .timeout = MLK_MESSAGE_TIMEOUT_DEFAULT,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
270 .speed = MLK_MESSAGE_SPEED_DEFAULT,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
271 .query = query,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
272 .update = update,
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
273 .draw = draw
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
274 };
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
275
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
276 struct mlk_message_style *mlk_message_style = &mlk_message_style_light;
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
277
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 void
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
279 mlk_message_start(struct mlk_message *msg)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
280 {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
281 assert(msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
282
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
283 struct mlk_message_style *style = MLK__STYLE(msg, mlk_message_style);
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
284
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
285 if ((msg->flags & (MLK_MESSAGE_FLAGS_FADEIN | MLK_MESSAGE_FLAGS_FADEOUT)) && style->speed == 0)
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
286 mlk_tracef("message has animation but zero delay");
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
287
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
288 msg->elapsed = 0;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
289 msg->scale = msg->flags & MLK_MESSAGE_FLAGS_FADEIN ? 0.0 : 1.0;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
290 msg->state = msg->flags & MLK_MESSAGE_FLAGS_FADEIN
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
291 ? MLK_MESSAGE_STATE_OPENING
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
292 : MLK_MESSAGE_STATE_SHOWING;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
293
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
294 if (msg->flags & MLK_MESSAGE_FLAGS_AUTOMATIC && style->timeout == 0)
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
295 mlk_tracef("message is automatic but has zero timeout");
635
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
296
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
297 /*
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
298 * Make sure selected index goes in the range of the lines and that it
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
299 * starts on a proper selectable line.
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
300 */
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
301 if (msg->selectable) {
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
302 if (msg->selected >= msg->linesz || !is_selectable(msg, msg->selected))
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
303 msg->selected = 0;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
304
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
305 while (!is_selectable(msg, msg->selected))
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
306 msg->selected++;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
307 }
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
308 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
309
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
310 int
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
311 mlk_message_query(struct mlk_message *msg, unsigned int *w, unsigned int *h)
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 {
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 assert(msg);
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
314
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
315 return MLK__STYLE_CALL(msg->style, mlk_message_style, query, msg, w, h);
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
316 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
317
635
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
318 static inline size_t
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
319 first(const struct mlk_message *msg)
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
320 {
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
321 size_t ret = -1;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
322
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
323 for (size_t i = 0; i < msg->linesz; ++i) {
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
324 if (is_selectable(msg, i)) {
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
325 ret = i;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
326 break;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
327 }
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
328 }
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
329
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
330 return ret;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
331 }
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
332
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
333 static inline size_t
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
334 last(const struct mlk_message *msg)
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
335 {
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
336 size_t ret = -1;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
337
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
338 for (size_t i = msg->linesz; i >= 0; --i) {
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
339 if (is_selectable(msg, i)) {
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
340 ret = i;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
341 break;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
342 }
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
343 }
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
344
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
345 return ret;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
346 }
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
347
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
348 static inline size_t
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
349 previous(const struct mlk_message *msg)
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
350 {
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
351 size_t ret;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
352
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
353 /* wrap */
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
354 if (msg->selected == first(msg))
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
355 ret = last(msg);
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
356 else {
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
357 ret = msg->selected - 1;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
358
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
359 while (ret > 0 && !is_selectable(msg, ret))
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
360 ret--;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
361 }
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
362
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
363 return ret;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
364 }
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
365
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
366 static inline size_t
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
367 next(const struct mlk_message *msg)
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
368 {
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
369 size_t ret;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
370
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
371 /* wrap */
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
372 if (msg->selected == last(msg))
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
373 ret = first(msg);
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
374 else {
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
375 ret = msg->selected + 1;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
376
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
377 while (ret < msg->linesz && !is_selectable(msg, ret))
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
378 ret++;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
379 }
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
380
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
381 return ret;
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
382 }
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
383
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
384 void
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
385 mlk_message_handle(struct mlk_message *msg, const union mlk_event *ev)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
386 {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
387 assert(msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
388 assert(ev);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
389
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
390 /* Skip if the message animation hasn't complete. */
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
391 if (msg->state != MLK_MESSAGE_STATE_SHOWING)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
392 return;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
393
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
394 /* Only keyboard event are valid. */
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
395 if (ev->type != MLK_EVENT_KEYDOWN || msg->state == MLK_MESSAGE_STATE_NONE)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
396 return;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
397
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
398 switch (ev->key.key) {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
399 case MLK_KEY_UP:
635
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
400 if (msg->selectable && msg->linesz)
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
401 msg->selected = previous(msg);
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
402 break;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
403 case MLK_KEY_DOWN:
635
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
404 if (msg->selectable && msg->linesz)
3cb1860d9f11 rpg: improve message selectable lines
David Demelier <markand@malikania.fr>
parents: 622
diff changeset
405 msg->selected = next(msg);
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
406 break;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
407 case MLK_KEY_ENTER:
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
408 msg->state = msg->flags & MLK_MESSAGE_FLAGS_FADEOUT
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
409 ? MLK_MESSAGE_STATE_HIDING
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
410 : MLK_MESSAGE_STATE_NONE;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
411 msg->elapsed = 0;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
412 break;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
413 default:
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
414 break;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
415 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
416 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
417
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
418 int
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
419 mlk_message_update(struct mlk_message *msg, unsigned int ticks)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
420 {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
421 assert(msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
422
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
423 MLK__STYLE_CALL(msg->style, mlk_message_style, update, msg, ticks);
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
424
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
425 return msg->state == MLK_MESSAGE_STATE_NONE;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
426 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
427
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
428 void
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
429 mlk_message_draw(struct mlk_message *msg)
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
430 {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
431 assert(msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
432
622
ec334c61bb81 rpg: simplify message
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
433 MLK__STYLE_CALL(msg->style, mlk_message_style, draw, msg);
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
434 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
435
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
436 void
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
437 mlk_message_hide(struct mlk_message *msg)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
438 {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
439 assert(msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
440
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
441 msg->state = MLK_MESSAGE_STATE_HIDING;
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
442 msg->elapsed = 0;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
443 }