Mercurial > molko
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 |
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 | 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 | 155 |
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 | 179 msg->elapsed = 0; |
180 } | |
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 | 189 msg->elapsed = 0; |
190 } | |
191 | |
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 | 200 msg->elapsed = 0; |
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 | 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 | 224 if ((err = mlk_texture_new(&tex, msg->w, msg->h)) < 0) |
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 } |