aboutsummaryrefslogtreecommitdiff
path: root/kscurses/ui/popup_manager.jai
blob: 704ad49c60cfb3dcc47e831772670180eef77a1d (plain)
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;
}