7
7
#include " game/game.h"
8
8
#include " graphics/boilerplate.h"
9
9
10
+ #include < stack>
11
+
10
12
namespace ui {
11
13
struct state {
12
- vec2i offset ;
14
+ std::stack< vec2i> _offset ;
13
15
std::vector<generic_button> buttons;
14
16
std::vector<image_button> img_buttons;
17
+
18
+ inline const vec2i offset () { return _offset.empty () ? vec2i{0 , 0 } : _offset.top (); }
15
19
};
16
20
17
21
state g_state;
18
22
generic_button dummy;
19
23
}
20
24
21
- void ui::begin_window (vec2i offset) {
22
- g_state.offset = offset ;
25
+ void ui::begin_widget (vec2i offset) {
26
+ g_state._offset . push ( offset) ;
23
27
g_state.buttons .clear ();
24
28
g_state.img_buttons .clear ();
25
29
}
26
30
31
+ void ui::end_widget () {
32
+ if (!g_state._offset .empty ()) {
33
+ g_state._offset .pop ();
34
+ }
35
+ }
36
+
27
37
bool ui::handle_mouse (const mouse *m) {
28
38
bool handle = false ;
29
39
int tmp_btn = 0 ;
30
- handle |= !!generic_buttons_handle_mouse (m, g_state.offset , g_state.buttons , tmp_btn);
31
- handle |= image_buttons_handle_mouse (m, g_state.offset , g_state.img_buttons , tmp_btn);
40
+ handle |= !!generic_buttons_handle_mouse (m, g_state.offset () , g_state.buttons , tmp_btn);
41
+ handle |= image_buttons_handle_mouse (m, g_state.offset () , g_state.img_buttons , tmp_btn);
32
42
33
43
return handle;
34
44
}
35
45
36
46
int ui::button_hover (const mouse *m) {
37
47
for (auto &btn : g_state.buttons ) {
38
- if (is_button_hover (btn, g_state.offset )) {
48
+ if (is_button_hover (btn, g_state.offset () )) {
39
49
return (std::distance (&g_state.buttons .front (), &btn) + 1 );
40
50
}
41
51
}
@@ -44,7 +54,7 @@ int ui::button_hover(const mouse *m) {
44
54
}
45
55
46
56
generic_button &ui::button (pcstr label, vec2i pos, vec2i size) {
47
- const vec2i offset = g_state.offset ;
57
+ const vec2i offset = g_state.offset () ;
48
58
49
59
g_state.buttons .push_back ({pos.x , pos.y , size.x + 4 , size.y + 4 , button_none, button_none, 0 , 0 });
50
60
int focused = is_button_hover (g_state.buttons .back (), offset);
@@ -60,7 +70,7 @@ generic_button &ui::button(uint32_t id) {
60
70
}
61
71
62
72
image_button &ui::img_button (uint32_t group, uint32_t id, vec2i pos, vec2i size, int offset) {
63
- const vec2i img_offset = g_state.offset ;
73
+ const vec2i img_offset = g_state.offset () ;
64
74
const mouse *m = mouse_get ();
65
75
66
76
g_state.img_buttons .push_back ({pos.x , pos.y , size.x + 4 , size.y + 4 , IB_NORMAL, group, id, offset, button_none, button_none, 0 , 0 , true });
@@ -72,22 +82,35 @@ image_button &ui::img_button(uint32_t group, uint32_t id, vec2i pos, vec2i size,
72
82
return g_state.img_buttons .back ();
73
83
}
74
84
75
- void ui::label (int group, int number, vec2i pos, int box_width, font_t font, UiFlags_ flags) {
76
- const vec2i offset = g_state.offset ;
85
+ int ui::label (int group, int number, vec2i pos, font_t font, UiFlags_ flags, int box_width ) {
86
+ const vec2i offset = g_state.offset () ;
77
87
if (!!(flags & UiFlags_LabelCentered)) {
78
88
lang_text_draw_centered (group, number, offset.x + pos.x , offset.y + pos.y , box_width, font);
89
+ return box_width;
90
+ } else {
91
+ return lang_text_draw (group, number, offset + pos, font);
79
92
}
80
93
}
81
94
95
+ int ui::label_num (int group, int number, int amount, vec2i pos, font_t font, pcstr postfix) {
96
+ const vec2i offset = g_state.offset ();
97
+ return lang_text_draw_amount (group, number, amount, offset.x + pos.x , offset.y + pos.y , font, postfix);
98
+ }
99
+
100
+ int ui::label_percent (int amount, vec2i pos, font_t font) {
101
+ const vec2i offset = g_state.offset ();
102
+ return text_draw_percentage (amount, offset.x + pos.x , offset.y + pos.y , font);
103
+ }
104
+
82
105
void ui::panel (vec2i pos, vec2i size, UiFlags_ flags) {
83
- const vec2i offset = g_state.offset ;
106
+ const vec2i offset = g_state.offset () ;
84
107
if (!!(flags & UiFlags_PanelOuter)) {
85
108
outer_panel_draw (offset + pos, size.x , size.y );
86
109
}
87
110
}
88
111
89
112
void ui::icon (vec2i pos, e_resource img) {
90
- const vec2i offset = g_state.offset ;
113
+ const vec2i offset = g_state.offset () ;
91
114
painter ctx = game.painter ();
92
115
ImageDraw::img_generic (ctx, image_id_resource_icon (RESOURCE_DEBEN), offset.x + pos.x , offset.y + pos.y );
93
116
}
0 commit comments