43 lines
1.5 KiB
Odin
43 lines
1.5 KiB
Odin
package main
|
|
|
|
import engine "../zephr"
|
|
|
|
// Explicitly scoped containers.
|
|
//
|
|
// engine.ui_row/ui_column/ui_scroll_column carry @(deferred_none=pop_parent),
|
|
// so they pop when the *calling scope* ends. That is fine when a container and
|
|
// all its children sit in one proc, but it makes them unusable for anything
|
|
// opened in one proc and closed in another -- a begin/end pair, or a container
|
|
// that must close before a sibling is drawn. In those cases the row pops the
|
|
// instant the helper returns and the children land in the wrong parent.
|
|
//
|
|
// These push explicitly, with no deferred pop, so the caller controls the scope.
|
|
// caller is threaded through because box identity is hashed from it: wrapping
|
|
// ui_create_box_with_id without it would give every call site the same id.
|
|
|
|
open_row :: proc(id: engine.Id = 0, caller := #caller_location) -> ^engine.Box {
|
|
engine.set_next_layout_axis(.X)
|
|
b := engine.ui_create_box_with_id({}, id, caller)
|
|
engine.push_parent(b)
|
|
return b
|
|
}
|
|
|
|
open_column :: proc(id: engine.Id = 0, caller := #caller_location) -> ^engine.Box {
|
|
engine.set_next_layout_axis(.Y)
|
|
b := engine.ui_create_box_with_id({}, id, caller)
|
|
engine.push_parent(b)
|
|
return b
|
|
}
|
|
|
|
open_scroll_column :: proc(id: engine.Id = 0, caller := #caller_location) -> ^engine.Box {
|
|
engine.set_next_layout_axis(.Y)
|
|
engine.ui_set_next_flags({.ClipToBounds, .ScrollableY})
|
|
b := engine.ui_create_box_with_id({}, id, caller)
|
|
engine.push_parent(b)
|
|
return b
|
|
}
|
|
|
|
close_box :: proc() {
|
|
engine.pop_parent()
|
|
}
|