cranpose_ui/widgets/
row.rs1#![allow(non_snake_case)]
4
5use cranpose_core::NodeId;
6use cranpose_ui_layout::{LinearArrangement, VerticalAlignment};
7
8use super::layout::Layout;
9use crate::{composable, layout::policies::FlexMeasurePolicy, modifier::Modifier};
10
11#[derive(Clone, Copy, Debug, PartialEq)]
13pub struct RowSpec {
14 pub horizontal_arrangement: LinearArrangement,
15 pub vertical_alignment: VerticalAlignment,
16}
17
18impl RowSpec {
19 pub fn new() -> Self {
20 Self::default()
21 }
22
23 pub fn horizontal_arrangement(mut self, arrangement: LinearArrangement) -> Self {
24 self.horizontal_arrangement = arrangement;
25 self
26 }
27
28 pub fn vertical_alignment(mut self, alignment: VerticalAlignment) -> Self {
29 self.vertical_alignment = alignment;
30 self
31 }
32}
33
34impl Default for RowSpec {
35 fn default() -> Self {
36 Self {
37 horizontal_arrangement: LinearArrangement::Start,
38 vertical_alignment: VerticalAlignment::CenterVertically,
39 }
40 }
41}
42
43#[composable]
67pub fn Row<F>(modifier: Modifier, spec: RowSpec, content: F) -> NodeId
68where
69 F: FnMut() + 'static,
70{
71 let policy = FlexMeasurePolicy::row(spec.horizontal_arrangement, spec.vertical_alignment);
72 Layout(modifier, policy, content)
73}