aboutsummaryrefslogtreecommitdiff
path: root/kscurses/ui/popup_manager.jai
diff options
context:
space:
mode:
authordam <dam@gudinoff>2023-08-17 20:28:47 +0100
committerdam <dam@gudinoff>2023-08-17 20:28:47 +0100
commit709879ee56d31fe543a0ad882713bd4e3d17d2d2 (patch)
tree12a35282bdd0f1f8a2159ade147944c89254db24 /kscurses/ui/popup_manager.jai
parentfa1b8ea54646f1a0f3eadef33e3a660b875cc1ff (diff)
downloadtask-time-tracker-709879ee56d31fe543a0ad882713bd4e3d17d2d2.tar.zst
task-time-tracker-709879ee56d31fe543a0ad882713bd4e3d17d2d2.zip
Added kscurses and testing program.
Diffstat (limited to 'kscurses/ui/popup_manager.jai')
-rw-r--r--kscurses/ui/popup_manager.jai65
1 files changed, 65 insertions, 0 deletions
diff --git a/kscurses/ui/popup_manager.jai b/kscurses/ui/popup_manager.jai
new file mode 100644
index 0000000..704ad49
--- /dev/null
+++ b/kscurses/ui/popup_manager.jai
@@ -0,0 +1,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;
+} \ No newline at end of file