diff options
Diffstat (limited to 'kscurses/ui/popup_manager.jai')
| -rw-r--r-- | kscurses/ui/popup_manager.jai | 65 |
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 |
