annotate libmlk-rpg/mlk/rpg/message.c @ 546:b7da58230a66

cmake: fix for RHEL
author David Demelier <markand@malikania.fr>
date Mon, 06 Mar 2023 20:01:00 +0100
parents 7d6a879901e0
children c7664b679a95
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
431
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
23 #include <mlk/core/event.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
24 #include <mlk/core/font.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
25 #include <mlk/core/maths.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
26 #include <mlk/core/painter.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
27 #include <mlk/core/panic.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
28 #include <mlk/core/sprite.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
29 #include <mlk/core/trace.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
30 #include <mlk/core/util.h>
148
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
31
433
862b15c3a3ae ui: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 431
diff changeset
32 #include <mlk/ui/align.h>
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
33 #include <mlk/ui/ui.h>
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
34 #include <mlk/ui/ui_p.h>
148
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 146
diff changeset
35
28
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
36 #include "message.h"
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
38 static inline struct mlk_font *
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
39 style_font(const struct mlk_message *message)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
40 {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
41 const struct mlk_message_style *style = MLK__STYLE(message, mlk_message_style);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
42
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
43 if (style->text_font)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
44 return style->text_font;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
45
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
46 return mlk_ui_fonts[MLK_UI_FONT_INTERFACE];
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
47 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
48
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
49 static unsigned int
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
50 min_width(const struct mlk_message *msg)
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
51 {
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
52 assert(msg);
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
53
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
54 const struct mlk_message_style *style = MLK__STYLE(msg, mlk_message_style);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
55 struct mlk_font *font;
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
56 unsigned int maxw = 0, w = 0;
486
d6757c30658e core: rework errors
David Demelier <markand@malikania.fr>
parents: 483
diff changeset
57 int err;
158
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
58
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
59 font = style_font(msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
60
391
9334b420c975 rpg: don't use fixed size messages
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
61 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
62 if (!msg->lines[i])
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
63 continue;
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
64 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
65 return err;
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
66 if (w > maxw)
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
67 maxw = w;
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
68 }
158
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
69
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
70 return (style->padding * 2) + maxw;
158
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
71 }
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
72
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
73 static unsigned int
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
74 min_height(const struct mlk_message *msg)
158
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
75 {
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
76 assert(msg);
158
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
77
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
78 const struct mlk_message_style *style = MLK__STYLE(msg, mlk_message_style);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
79 struct mlk_font *font;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
80 unsigned int lh;
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
81
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
82 font = style_font(msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
83 lh = mlk_font_height(font);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
84
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
85 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
86 }
e8d2740703df ui: make message auto-spacing lines
David Demelier <markand@malikania.fr>
parents: 157
diff changeset
87
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
88 static void
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
89 draw_frame(const struct mlk_message *msg)
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
90 {
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
91 const struct mlk_message_style *style = MLK__STYLE(msg, mlk_message_style);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
92
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
93 mlk_painter_set_color(style->border_color);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
94 mlk_painter_draw_rectangle(0, 0, msg->w, msg->h);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
95 mlk_painter_set_color(style->bg_color);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
96 mlk_painter_draw_rectangle(
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
97 style->border_size,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
98 style->border_size,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
99 msg->w - (style->border_size * 2),
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
100 msg->h - (style->border_size * 2)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
101 );
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
102 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
103
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
104 static void
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
105 draw_lines(const struct mlk_message *msg)
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 const struct mlk_message_style *style;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
108 struct mlk_font *font;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
109 struct mlk_texture texture;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
110 unsigned long color;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
111 int err, x, y;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
112
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
113 style = MLK__STYLE(msg, mlk_message_style);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
114 font = style_font(msg);
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
115
391
9334b420c975 rpg: don't use fixed size messages
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
116 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
117 if (!msg->lines[i])
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
118 continue;
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
119
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
120 if ((msg->flags & MLK_MESSAGE_FLAGS_QUESTION) && msg->index == (unsigned int)i)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
121 color = style->selected_color;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
122 else
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
123 color = style->text_color;
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
124
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
125 if ((err = mlk_font_render(font, &texture, msg->lines[i], color)) < 0) {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
126 mlk_tracef("%s", mlk_err_string(err));
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
127 continue;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
128 }
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
129
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
130 x = style->padding;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
131 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
132
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
133 if (x + texture.w > msg->w)
473
02b16dd49b54 core: trace -> mlk_trace
David Demelier <markand@malikania.fr>
parents: 472
diff changeset
134 mlk_tracef("message width too small: %u < %u", msg->w, min_width(msg));
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
135 if (y + texture.h > msg->h)
473
02b16dd49b54 core: trace -> mlk_trace
David Demelier <markand@malikania.fr>
parents: 472
diff changeset
136 mlk_tracef("message height too small: %u < %u", msg->h, min_height(msg));
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
137
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
138 mlk_texture_draw(&texture, x, y);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
139 mlk_texture_finish(&texture);
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
140 }
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
141 }
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 static int
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
144 delegate_query(struct mlk_message_delegate *self,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
145 const struct mlk_message *msg,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
146 unsigned int *w,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
147 unsigned int *h)
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 {
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
149 (void)self;
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
150
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
151 if (w)
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
152 *w = min_width(msg);
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
153 if (h)
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
154 *h = min_height(msg);
535
7d6a879901e0 misc: fix
David Demelier <markand@malikania.fr>
parents: 534
diff changeset
155
7d6a879901e0 misc: fix
David Demelier <markand@malikania.fr>
parents: 534
diff changeset
156 return 0;
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
157 }
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
158
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
159 static void
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
160 delegate_update(struct mlk_message_delegate *self,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
161 struct mlk_message *msg,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
162 unsigned int ticks)
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
163 {
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
164 (void)self;
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
165
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
166 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
167
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 msg->elapsed += ticks;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
169
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 switch (msg->state) {
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
171 case MLK_MESSAGE_STATE_OPENING:
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
172 msg->scale = (double)msg->elapsed / (double)style->delay;
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
173
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
174 if (msg->scale > 1)
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
175 msg->scale = 1;
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
176
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
177 if (msg->elapsed >= style->delay) {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
178 msg->state = MLK_MESSAGE_STATE_SHOWING;
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
179 msg->elapsed = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
180 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
181
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 break;
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
183 case MLK_MESSAGE_STATE_SHOWING:
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 /* Do automatically switch state if requested by the user. */
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
185 if (msg->flags & MLK_MESSAGE_FLAGS_AUTOMATIC && msg->elapsed >= style->duration) {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
186 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
187 ? MLK_MESSAGE_STATE_HIDING
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
188 : MLK_MESSAGE_STATE_NONE;
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
189 msg->elapsed = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
190 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
191
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
192 break;
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
193 case MLK_MESSAGE_STATE_HIDING:
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
194 msg->scale = 1 - (double)msg->elapsed / (double)style->delay;
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
195
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
196 if (msg->scale < 0)
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
197 msg->scale = 0;
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
198 if (msg->elapsed >= style->delay) {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
199 msg->state = MLK_MESSAGE_STATE_NONE;
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
200 msg->elapsed = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
201 }
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
202
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 break;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 default:
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 break;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 }
60
7266c750b649 core: simplify message
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
207
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
208 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
209
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
210 static void
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
211 delegate_draw(struct mlk_message_delegate *self, const struct mlk_message *msg)
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 {
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
213 (void)self;
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
214
472
bc5483849614 core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents: 465
diff changeset
215 struct mlk_texture tex;
486
d6757c30658e core: rework errors
David Demelier <markand@malikania.fr>
parents: 483
diff changeset
216 int x, y, err;
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
217 unsigned int w, h;
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
218
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
219 if (msg->w == 0 || msg->h == 0) {
473
02b16dd49b54 core: trace -> mlk_trace
David Demelier <markand@malikania.fr>
parents: 472
diff changeset
220 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
221 return;
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
222 }
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
223
486
d6757c30658e core: rework errors
David Demelier <markand@malikania.fr>
parents: 483
diff changeset
224 if ((err = mlk_texture_new(&tex, msg->w, msg->h)) < 0)
d6757c30658e core: rework errors
David Demelier <markand@malikania.fr>
parents: 483
diff changeset
225 mlk_panic(err);
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
226
457
04797b35565c core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
227 MLK_PAINTER_BEGIN(&tex);
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
228 draw_frame(msg);
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
229 draw_lines(msg);
457
04797b35565c core: painter -> mlk_painter
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
230 MLK_PAINTER_END();
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
231
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
232 /* Compute scaling. */
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
233 w = msg->w * msg->scale;
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
234 h = msg->h * msg->scale;
100
ef9135c34505 message: improve rendering and add example
David Demelier <markand@malikania.fr>
parents: 99
diff changeset
235
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
236 /* Centerize within its drawing area. */
487
f2d3c5a97884 ui: align -> mlk_align
David Demelier <markand@malikania.fr>
parents: 486
diff changeset
237 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
238
140
453651d76f7c core: upgrade message in terms of customization
David Demelier <markand@malikania.fr>
parents: 136
diff changeset
239 /* Draw and clear. */
472
bc5483849614 core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents: 465
diff changeset
240 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
241 mlk_texture_finish(&tex);
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 }
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
243
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
244 struct mlk_message_style mlk_message_style = {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
245 .padding = MLK_UI_PADDING,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
246 .delay = MLK_MESSAGE_DELAY_DEFAULT,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
247 .duration = MLK_MESSAGE_DURATION_DEFAULT,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
248 .bg_color = MLK_UI_COLOR_BG,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
249 .border_color = MLK_UI_COLOR_BORDER,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
250 .border_size = MLK_UI_BORDER,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
251 .text_color = MLK_UI_COLOR_TEXT,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
252 .selected_color = MLK_UI_COLOR_SELECTED
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
253 };
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
254 struct mlk_message_delegate mlk_message_delegate = {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
255 .query = delegate_query,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
256 .update = delegate_update,
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
257 .draw = delegate_draw
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
258 };
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
259
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 void
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
261 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
262 {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
263 assert(msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
264
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
265 const struct mlk_message_style *style = MLK__STYLE(msg, mlk_message_style);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
266
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
267 if ((msg->flags & (MLK_MESSAGE_FLAGS_FADEIN | MLK_MESSAGE_FLAGS_FADEOUT)) && style->delay == 0)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
268 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
269
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
270 msg->elapsed = 0;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
271 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
272 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
273 ? MLK_MESSAGE_STATE_OPENING
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
274 : MLK_MESSAGE_STATE_SHOWING;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
275
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
276 if (msg->flags & MLK_MESSAGE_FLAGS_AUTOMATIC && style->duration == 0)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
277 mlk_tracef("message is automatic but has zero duration");
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
278 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
279
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
280 int
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
281 mlk_message_query(const 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
282 {
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 assert(msg);
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
284
534
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
285 MLK__DELEGATE_INVOKE_RET(msg->delegate, mlk_message_delegate, query, msg, w, h);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
286
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
287 if (w)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
288 *w = 0;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
289 if (h)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
290 *h = 0;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
291
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
292 return MLK_ERR_NO_SUPPORT;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
293 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
294
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
295 void
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
296 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
297 {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
298 assert(msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
299 assert(ev);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
300
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
301 /* 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
302 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
303 return;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
304
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
305 /* Only keyboard event are valid. */
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
306 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
307 return;
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 switch (ev->key.key) {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
310 case MLK_KEY_UP:
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
311 if (msg->index > 0)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
312 msg->index--;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
313 break;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
314 case MLK_KEY_DOWN:
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
315 if (msg->index + 1 < msg->linesz && msg->lines[msg->index + 1])
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
316 msg->index++;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
317 break;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
318 case MLK_KEY_ENTER:
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
319 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
320 ? MLK_MESSAGE_STATE_HIDING
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
321 : MLK_MESSAGE_STATE_NONE;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
322 msg->elapsed = 0;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
323 break;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
324 default:
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
325 break;
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
326 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
327 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
328
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
329 int
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
330 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
331 {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
332 assert(msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
333
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
334 MLK__DELEGATE_INVOKE(msg->delegate, mlk_message_delegate, update, msg, ticks);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
335
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
336 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
337 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
338
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
339 void
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
340 mlk_message_draw(const struct mlk_message *msg)
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
341 {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
342 assert(msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
343
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
344 MLK__DELEGATE_INVOKE(msg->delegate, mlk_message_delegate, draw, msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
345 }
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
346
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
347 void
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
348 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
349 {
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
350 assert(msg);
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
351
88e9bd420a28 rpg: add delegate/style support to mlk_message
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
352 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
353 msg->elapsed = 0;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 }