1use gpui::{
2 color::Color, geometry::rect::RectF, scene::Shadow, AnyElement, App, Element, Entity, Quad,
3 View,
4};
5use log::LevelFilter;
6use pathfinder_geometry::vector::vec2f;
7use simplelog::SimpleLogger;
8
9fn main() {
10 SimpleLogger::init(LevelFilter::Info, Default::default()).expect("could not initialize logger");
11
12 App::new(()).unwrap().run(|cx| {
13 cx.platform().activate(true);
14 cx.add_window(Default::default(), |_| CornersView);
15 });
16}
17
18struct CornersView;
19
20impl Entity for CornersView {
21 type Event = ();
22}
23
24impl View for CornersView {
25 fn ui_name() -> &'static str {
26 "CornersView"
27 }
28
29 fn render(&mut self, _: &mut gpui::ViewContext<Self>) -> AnyElement<CornersView> {
30 CornersElement.into_any()
31 }
32}
33
34struct CornersElement;
35
36impl<V: View> gpui::Element<V> for CornersElement {
37 type LayoutState = ();
38
39 type PaintState = ();
40
41 fn layout(
42 &mut self,
43 constraint: gpui::SizeConstraint,
44 _: &mut V,
45 _: &mut gpui::ViewContext<V>,
46 ) -> (gpui::geometry::vector::Vector2F, Self::LayoutState) {
47 (constraint.max, ())
48 }
49
50 fn paint(
51 &mut self,
52 bounds: pathfinder_geometry::rect::RectF,
53 _: pathfinder_geometry::rect::RectF,
54 _: &mut Self::LayoutState,
55 _: &mut V,
56 cx: &mut gpui::ViewContext<V>,
57 ) -> Self::PaintState {
58 cx.scene().push_quad(Quad {
59 bounds,
60 background: Some(Color::white()),
61 ..Default::default()
62 });
63
64 cx.scene().push_layer(None);
65
66 cx.scene().push_quad(Quad {
67 bounds: RectF::new(vec2f(100., 100.), vec2f(100., 100.)),
68 background: Some(Color::red()),
69 border: Default::default(),
70 corner_radii: gpui::scene::CornerRadii {
71 top_left: 20.,
72 ..Default::default()
73 },
74 });
75
76 cx.scene().push_quad(Quad {
77 bounds: RectF::new(vec2f(200., 100.), vec2f(100., 100.)),
78 background: Some(Color::green()),
79 border: Default::default(),
80 corner_radii: gpui::scene::CornerRadii {
81 top_right: 20.,
82 ..Default::default()
83 },
84 });
85
86 cx.scene().push_quad(Quad {
87 bounds: RectF::new(vec2f(100., 200.), vec2f(100., 100.)),
88 background: Some(Color::blue()),
89 border: Default::default(),
90 corner_radii: gpui::scene::CornerRadii {
91 bottom_left: 20.,
92 ..Default::default()
93 },
94 });
95
96 cx.scene().push_quad(Quad {
97 bounds: RectF::new(vec2f(200., 200.), vec2f(100., 100.)),
98 background: Some(Color::yellow()),
99 border: Default::default(),
100 corner_radii: gpui::scene::CornerRadii {
101 bottom_right: 20.,
102 ..Default::default()
103 },
104 });
105
106 cx.scene().push_shadow(Shadow {
107 bounds: RectF::new(vec2f(400., 100.), vec2f(100., 100.)),
108 corner_radii: gpui::scene::CornerRadii {
109 bottom_right: 20.,
110 ..Default::default()
111 },
112 sigma: 20.0,
113 color: Color::black(),
114 });
115
116 cx.scene().push_layer(None);
117 cx.scene().push_quad(Quad {
118 bounds: RectF::new(vec2f(400., 100.), vec2f(100., 100.)),
119 background: Some(Color::red()),
120 border: Default::default(),
121 corner_radii: gpui::scene::CornerRadii {
122 bottom_right: 20.,
123 ..Default::default()
124 },
125 });
126
127 cx.scene().pop_layer();
128 cx.scene().pop_layer();
129 }
130
131 fn rect_for_text_range(
132 &self,
133 _: std::ops::Range<usize>,
134 _: pathfinder_geometry::rect::RectF,
135 _: pathfinder_geometry::rect::RectF,
136 _: &Self::LayoutState,
137 _: &Self::PaintState,
138 _: &V,
139 _: &gpui::ViewContext<V>,
140 ) -> Option<pathfinder_geometry::rect::RectF> {
141 unimplemented!()
142 }
143
144 fn debug(
145 &self,
146 _: pathfinder_geometry::rect::RectF,
147 _: &Self::LayoutState,
148 _: &Self::PaintState,
149 _: &V,
150 _: &gpui::ViewContext<V>,
151 ) -> serde_json::Value {
152 unimplemented!()
153 }
154}