1use gpui::{div, px, App, IntoElement, ParentElement, RenderOnce, Styled, Window};
4
5use crate::alignment::VerticalAlignment;
6use crate::modifier::Modifier;
7
8#[derive(IntoElement)]
23pub struct HStack {
24 spacing: f32,
25 alignment: VerticalAlignment,
26 children: Vec<gpui::AnyElement>,
27}
28
29impl HStack {
30 pub fn new() -> Self {
32 Self {
33 spacing: 8.0,
34 alignment: VerticalAlignment::Center, children: Vec::new(),
36 }
37 }
38
39 pub fn spacing(mut self, spacing: f32) -> Self {
41 self.spacing = spacing;
42 self
43 }
44
45 pub fn alignment(mut self, alignment: VerticalAlignment) -> Self {
47 self.alignment = alignment;
48 self
49 }
50
51 impl_child_methods!();
52}
53
54impl Default for HStack {
55 fn default() -> Self {
56 Self::new()
57 }
58}
59
60impl Modifier for HStack {}
61
62impl RenderOnce for HStack {
63 fn render(self, _window: &mut Window, _cx: &mut App) -> impl IntoElement {
64 let container = div().flex().flex_row().gap(px(self.spacing));
65 self.alignment
66 .apply_as_items(container)
67 .children(self.children)
68 }
69}