Skip to main content

cranpose_ui/widgets/
row.rs

1//! Row widget implementation
2
3#![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::{LinearArrangement, VerticalAlignment};
11
12/// Specification for Row layout behavior.
13#[derive(Clone, Copy, Debug, PartialEq)]
14pub struct RowSpec {
15    pub horizontal_arrangement: LinearArrangement,
16    pub vertical_alignment: VerticalAlignment,
17}
18
19impl RowSpec {
20    pub fn new() -> Self {
21        Self::default()
22    }
23
24    pub fn horizontal_arrangement(mut self, arrangement: LinearArrangement) -> Self {
25        self.horizontal_arrangement = arrangement;
26        self
27    }
28
29    pub fn vertical_alignment(mut self, alignment: VerticalAlignment) -> Self {
30        self.vertical_alignment = alignment;
31        self
32    }
33}
34
35impl Default for RowSpec {
36    fn default() -> Self {
37        Self {
38            horizontal_arrangement: LinearArrangement::Start,
39            vertical_alignment: VerticalAlignment::CenterVertically,
40        }
41    }
42}
43
44#[composable]
45pub fn Row<F>(modifier: Modifier, spec: RowSpec, content: F) -> NodeId
46where
47    F: FnMut() + 'static,
48{
49    let policy = FlexMeasurePolicy::row(spec.horizontal_arrangement, spec.vertical_alignment);
50    Layout(modifier, policy, content)
51}