1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
MAX_POPUP_LEVES :: 10;
UI_Popup_Manager :: struct {
#as using base_parent : UI_Parent = .{type = .POPUP_MANAGER, box_type = .NONE};
layers : [MAX_POPUP_LEVES]UI_Popup;
layers_count := 0;
}
set_background :: (using ui_popup_manager : *UI_Popup_Manager, scene : UI_Scene) {
assert(layers_count == 0);
layers[0] = .{root = scene.root, entry = scene.entry};
scene.root.parent = xx ui_popup_manager;
layers_count = 1;
}
handle_key_popup_manager :: (ui_elem : *UI_Elem, key : Key) -> handled:bool {
using ui_popup_manager := cast(*UI_Popup_Manager) ui_elem;
assert(layers_count > 0, "0 layers in popup manager");
if !handle_key(active_element, key) {
if key == .ESCAPE && layers_count > 1 {
pop(ui_popup_manager);
return true;
} else {
return false;
}
} else {
return true;
}
}
c_draw_popup_manager :: (canvas : *Canvas, ui_elem : *UI_Elem, zone : Ibox2, style : *UI_Style) -> bool {
using ui_popup_manager := cast(*UI_Popup_Manager) ui_elem;
assert(layers_count > 0, "0 layers in popup manager");
for i : 0..layers_count-1 {
popup_zone := zone;
ok : bool;
if layers[i].size != .{-1, -1} then {
popup_zone, ok = fit_in_center(zone, layers[i].size);
if !ok return false;
}
if !c_draw(canvas, layers[i].root, popup_zone, style) return false;
}
return true;
}
pop :: (using ui_popup_manager : *UI_Popup_Manager) {
assert(layers_count > 1, "can't pop background");
layers_count -= 1;
unset_active_recursive(__last_set);
layers[layers_count].root.parent = null;
set_active_recursive(layers[layers_count - 1].entry);
}
push :: (using ui_popup_manager : *UI_Popup_Manager, scene : UI_Popup) {
assert(layers_count < MAX_POPUP_LEVES, "too much popup layers");
unset_active_recursive(__last_set);
layers[layers_count] = scene;
scene.root.parent = xx ui_popup_manager;
set_active_recursive(layers[layers_count].entry);
layers_count += 1;
}
|