cranpose_ui/widgets/
column.rs1use cranpose_core::NodeId;
4use cranpose_ui_layout::{HorizontalAlignment, LinearArrangement};
5
6use super::layout::Layout;
7use crate::{composable, layout::policies::FlexMeasurePolicy, modifier::Modifier};
8
9#[derive(Clone, Copy, Debug, PartialEq)]
11pub struct ColumnSpec {
12 pub vertical_arrangement: LinearArrangement,
13 pub horizontal_alignment: HorizontalAlignment,
14}
15
16impl ColumnSpec {
17 pub fn new() -> Self {
18 Self::default()
19 }
20
21 pub fn vertical_arrangement(mut self, arrangement: LinearArrangement) -> Self {
22 self.vertical_arrangement = arrangement;
23 self
24 }
25
26 pub fn horizontal_alignment(mut self, alignment: HorizontalAlignment) -> Self {
27 self.horizontal_alignment = alignment;
28 self
29 }
30}
31
32impl Default for ColumnSpec {
33 fn default() -> Self {
34 Self {
35 vertical_arrangement: LinearArrangement::Start,
36 horizontal_alignment: HorizontalAlignment::Start,
37 }
38 }
39}
40
41#[composable]
65pub fn Column<F>(modifier: Modifier, spec: ColumnSpec, content: F) -> NodeId
66where
67 F: FnMut() + 'static,
68{
69 let policy = FlexMeasurePolicy::column(spec.vertical_arrangement, spec.horizontal_alignment);
70 Layout(modifier, policy, content)
71}