cranpose_ui/widgets/
column.rs1use cranpose_core::NodeId;
4use cranpose_ui_layout::{HorizontalAlignment, LinearArrangement};
5
6use super::layout::{LayoutEnvironment, compose_layout};
7use crate::{composable, layout::policies::FlexMeasurePolicy, modifier::Modifier};
8
9#[derive(Clone, Copy, Debug, PartialEq)]
11pub struct ColumnSpec {
12 pub vertical_arrangement: LinearArrangement,
14 pub horizontal_alignment: HorizontalAlignment,
16}
17
18impl ColumnSpec {
19 pub fn new() -> Self {
21 Self::default()
22 }
23
24 pub fn vertical_arrangement(mut self, arrangement: LinearArrangement) -> Self {
26 self.vertical_arrangement = arrangement;
27 self
28 }
29
30 pub fn horizontal_alignment(mut self, alignment: HorizontalAlignment) -> Self {
32 self.horizontal_alignment = alignment;
33 self
34 }
35}
36
37impl Default for ColumnSpec {
38 fn default() -> Self {
39 Self {
40 vertical_arrangement: LinearArrangement::Start,
41 horizontal_alignment: HorizontalAlignment::Start,
42 }
43 }
44}
45
46#[composable(no_skip)]
69pub fn Column<F>(modifier: Modifier, spec: ColumnSpec, content: F) -> NodeId
70where
71 F: FnMut() + 'static,
72{
73 let environment = LayoutEnvironment::current();
74 let mut policy = FlexMeasurePolicy::column(
75 spec.vertical_arrangement,
76 spec.horizontal_alignment,
77 environment.density.density(),
78 );
79 policy.layout_direction = environment.direction;
80 compose_layout(modifier, policy, environment, content)
81}