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