fission_core/ui/widgets/
align.rs1use crate::internal::InternalLower;
2use crate::lowering::{InternalIrBuilder, InternalLoweringCx};
3use crate::ui::Widget;
4use fission_ir::{LayoutOp, Op, WidgetId};
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct Align {
19 pub id: Option<WidgetId>,
21 pub child: Widget,
23}
24
25impl Align {
26 pub fn new(child: impl Into<Widget>) -> Self {
27 Self {
28 child: child.into(),
29 id: None,
30 }
31 }
32}
33
34impl InternalLower for Align {
35 fn lower(&self, cx: &mut InternalLoweringCx) -> WidgetId {
36 let id = self.id.map(Into::into).unwrap_or_else(|| cx.next_node_id());
37 cx.push_scope(id);
38 let child_id = self.child.lower(cx);
39 cx.pop_scope();
40
41 let mut builder = InternalIrBuilder::new(id, Op::Layout(LayoutOp::Align));
42 builder.add_child(child_id);
43 builder.build(cx)
44 }
45}