pub struct RelLimits(/* private fields */);
Implementations§
Source§impl RelLimits
impl RelLimits
Sourcepub const fn new(min: Vec2, max: Vec2) -> Self
pub const fn new(min: Vec2, max: Vec2) -> Self
Examples found in repository?
examples/grid-rs.rs (lines 213-216)
110 fn call(
111 &mut self,
112 mut store: Self::Store,
113 args: &CounterState,
114 ) -> (Self::Store, im::HashMap<Arc<SourceID>, Option<Window>>) {
115 if store.0 != *args {
116 let button = {
117 let text = Text::<FixedData> {
118 id: gen_id!(),
119 props: FixedData {
120 area: feather_ui::URect {
121 abs: AbsRect::new(10.0, 15.0, 10.0, 15.0),
122 rel: RelRect::new(0.0, 0.0, UNSIZED_AXIS, UNSIZED_AXIS),
123 }
124 .into(),
125 anchor: feather_ui::RelPoint(Vec2 { x: 0.0, y: 0.0 }).into(),
126 ..Default::default()
127 }
128 .into(),
129 text: format!("Boxes: {}", args.count),
130 font_size: 40.0,
131 line_height: 56.0,
132 ..Default::default()
133 };
134
135 let rect = Shape::<DRect, { ShapeKind::RoundRect as u8 }>::new(
136 gen_id!(),
137 feather_ui::FILL_DRECT.into(),
138 0.0,
139 0.0,
140 Vec4::broadcast(10.0),
141 sRGB::new(0.2, 0.7, 0.4, 1.0),
142 sRGB::transparent(),
143 );
144
145 Button::<FixedData>::new(
146 gen_id!(),
147 FixedData {
148 area: feather_ui::URect {
149 abs: AbsRect::new(0.0, 20.0, 0.0, 0.0),
150 rel: RelRect::new(0.5, 0.0, UNSIZED_AXIS, UNSIZED_AXIS),
151 }
152 .into(),
153 anchor: feather_ui::RelPoint(Vec2 { x: 0.5, y: 0.0 }).into(),
154 zindex: 0,
155 },
156 Slot(feather_ui::APP_SOURCE_ID.into(), 0),
157 feather_ui::children![fixed::Prop, rect, text],
158 )
159 };
160
161 const NUM_COLUMNS: usize = 5;
162 let rectgrid = {
163 let mut children: im::Vector<Option<Box<ChildOf<dyn grid::Prop>>>> =
164 im::Vector::new();
165 let grid_id = gen_id!();
166 for i in 0..args.count {
167 children.push_back(Some(Box::new(Shape::<
168 GridChild,
169 { ShapeKind::RoundRect as u8 },
170 >::new(
171 grid_id.child(DataID::Int(i as i64)),
172 GridChild {
173 area: FILL_DRECT,
174 x: i % NUM_COLUMNS,
175 y: i / NUM_COLUMNS,
176 }
177 .into(),
178 0.0,
179 0.0,
180 Vec4::broadcast(4.0),
181 sRGB::new(
182 (0.1 * i as f32) % 1.0,
183 (0.65 * i as f32) % 1.0,
184 (0.2 * i as f32) % 1.0,
185 1.0,
186 ),
187 sRGB::transparent(),
188 ))));
189
190 /*children.push_back(Some(Box::new(Text::<GridChild> {
191 id: gen_id!(),
192 props: GridChild {
193 area: FILL_DRECT,
194 x: i % NUM_COLUMNS,
195 y: i / NUM_COLUMNS,
196 }
197 .into(),
198 text: format!("Cell: {}", i),
199 font_size: 20.0,
200 line_height: 22.0,
201 ..Default::default()
202 })));*/
203 }
204
205 GridBox::<GridData>::new(
206 gen_id!(),
207 GridData {
208 area: feather_ui::URect {
209 abs: AbsRect::new(0.0, 200.0, 0.0, 0.0),
210 rel: RelRect::new(0.0, 0.0, UNSIZED_AXIS, 1.0),
211 }
212 .into(),
213 rlimits: feather_ui::RelLimits::new(
214 ZERO_POINT,
215 Vec2::new(1.0, f32::INFINITY),
216 ),
217 direction: feather_ui::RowDirection::BottomToTop,
218 rows: [40.0, 20.0, 40.0, 20.0, 40.0, 20.0, 10.0]
219 .map(DValue::from)
220 .to_vec(),
221 columns: [80.0, 40.0, 80.0, 40.0, 80.0].map(DValue::from).to_vec(),
222 spacing: DPoint::from(Vec2::new(4.0, 4.0)),
223 padding: AbsRect::new(8.0, 8.0, 8.0, 8.0).into(),
224 }
225 .into(),
226 children,
227 )
228 };
229
230 let region = Region::new(
231 gen_id!(),
232 FixedData {
233 area: FILL_DRECT,
234 zindex: 0,
235 ..Default::default()
236 }
237 .into(),
238 feather_ui::children![fixed::Prop, button, rectgrid],
239 );
240 let window = Window::new(
241 gen_id!(),
242 winit::window::Window::default_attributes()
243 .with_title(env!("CARGO_CRATE_NAME"))
244 .with_resizable(true),
245 Box::new(region),
246 );
247
248 store.1 = im::HashMap::new();
249 store.1.insert(window.id.clone(), Some(window));
250 store.0 = args.clone();
251 }
252 let windows = store.1.clone();
253 (store, windows)
254 }
More examples
examples/basic-rs.rs (lines 109-112)
50 fn call(
51 &mut self,
52 mut store: Self::Store,
53 args: &CounterState,
54 ) -> (Self::Store, im::HashMap<Arc<SourceID>, Option<Window>>) {
55 if store.0 != *args {
56 let button = {
57 let text = Text::<FixedData> {
58 id: gen_id!(),
59 props: Rc::new(FixedData {
60 area: URect {
61 abs: AbsRect::new(8.0, 0.0, 8.0, 0.0),
62 rel: RelRect::new(0.0, 0.5, UNSIZED_AXIS, UNSIZED_AXIS),
63 }
64 .into(),
65 anchor: feather_ui::RelPoint(Vec2 { x: 0.0, y: 0.5 }).into(),
66 ..Default::default()
67 }),
68 text: format!("Clicks: {}", args.count),
69 font_size: 40.0,
70 line_height: 56.0,
71 ..Default::default()
72 };
73
74 let rect = Shape::<DRect, { ShapeKind::RoundRect as u8 }>::new(
75 gen_id!(),
76 feather_ui::FILL_DRECT.into(),
77 0.0,
78 0.0,
79 Vec4::broadcast(10.0),
80 sRGB::new(0.2, 0.7, 0.4, 1.0),
81 sRGB::transparent(),
82 );
83
84 Button::<FixedData>::new(
85 gen_id!(),
86 FixedData {
87 area: URect {
88 abs: AbsRect::new(45.0, 45.0, 0.0, 0.0),
89 rel: RelRect::new(0.0, 0.0, UNSIZED_AXIS, 1.0),
90 }
91 .into(),
92 ..Default::default()
93 },
94 Slot(feather_ui::APP_SOURCE_ID.into(), 0),
95 feather_ui::children![fixed::Prop, rect, text],
96 )
97 };
98
99 let fakebutton = {
100 let text = Text::<FixedData> {
101 id: gen_id!(),
102 props: Rc::new(FixedData {
103 area: RelRect::new(0.5, 0.0, UNSIZED_AXIS, UNSIZED_AXIS).into(),
104 limits: feather_ui::AbsLimits::new(
105 Vec2::new(f32::NEG_INFINITY, 10.0),
106 Vec2::new(f32::INFINITY, 200.0),
107 )
108 .into(),
109 rlimits: feather_ui::RelLimits::new(
110 Vec2::new(f32::NEG_INFINITY, f32::NEG_INFINITY),
111 Vec2::new(1.0, f32::INFINITY),
112 ),
113 anchor: feather_ui::RelPoint(Vec2 { x: 0.5, y: 0.0 }).into(),
114 padding: AbsRect::new(8.0, 8.0, 8.0, 8.0).into(),
115 ..Default::default()
116 }),
117 text: (0..args.count).map(|_| "█").collect::<String>(),
118 font_size: 40.0,
119 line_height: 56.0,
120 wrap: feather_ui::cosmic_text::Wrap::WordOrGlyph,
121 ..Default::default()
122 };
123
124 let rect = Shape::<DRect, { ShapeKind::RoundRect as u8 }>::new(
125 gen_id!(),
126 feather_ui::FILL_DRECT.into(),
127 0.0,
128 0.0,
129 Vec4::broadcast(10.0),
130 sRGB::new(0.7, 0.2, 0.4, 1.0),
131 sRGB::transparent(),
132 );
133
134 Button::<FixedData>::new(
135 gen_id!(),
136 FixedData {
137 area: URect {
138 abs: AbsRect::new(45.0, 245.0, 0.0, 0.0),
139 rel: RelRect::new(0.0, 0.0, UNSIZED_AXIS, UNSIZED_AXIS),
140 }
141 .into(),
142 limits: feather_ui::AbsLimits::new(
143 Vec2::new(100.0, f32::NEG_INFINITY),
144 Vec2::new(300.0, f32::INFINITY),
145 )
146 .into(),
147 ..Default::default()
148 },
149 Slot(feather_ui::APP_SOURCE_ID.into(), 0),
150 feather_ui::children![fixed::Prop, rect, text],
151 )
152 };
153
154 let pixel = Shape::<DRect, { ShapeKind::RoundRect as u8 }>::new(
155 gen_id!(),
156 Rc::new(DRect {
157 px: AbsRect::new(1.0, 1.0, 2.0, 2.0),
158 dp: ZERO_RECT,
159 rel: ZERO_RELRECT,
160 }),
161 0.0,
162 0.0,
163 Vec4::broadcast(0.0),
164 sRGB::new(1.0, 1.0, 1.0, 1.0),
165 sRGB::transparent(),
166 );
167
168 let region = Region::new(
169 gen_id!(),
170 FixedData {
171 area: URect {
172 abs: AbsRect::new(90.0, 90.0, 0.0, 200.0),
173 rel: RelRect::new(0.0, 0.0, UNSIZED_AXIS, 0.0),
174 }
175 .into(),
176 zindex: 0,
177 ..Default::default()
178 }
179 .into(),
180 feather_ui::children![fixed::Prop, button, fakebutton, pixel],
181 );
182 let window = Window::new(
183 gen_id!(),
184 winit::window::Window::default_attributes()
185 .with_title(env!("CARGO_CRATE_NAME"))
186 .with_resizable(true),
187 Box::new(region),
188 );
189
190 store.1 = im::HashMap::new();
191 store.1.insert(window.id.clone(), Some(window));
192 store.0 = args.clone();
193 }
194 let windows = store.1.clone();
195 (store, windows)
196 }
examples/list-rs.rs (lines 214-217)
125 fn call(
126 &mut self,
127 mut store: Self::Store,
128 args: &CounterState,
129 ) -> (Self::Store, im::HashMap<Arc<SourceID>, Option<Window>>) {
130 if store.0 != *args {
131 let button = {
132 let text = Text::<FixedData> {
133 id: gen_id!(),
134 props: FixedData {
135 area: feather_ui::URect {
136 abs: AbsRect::new(10.0, 15.0, 10.0, 15.0),
137 rel: RelRect::new(0.0, 0.0, UNSIZED_AXIS, UNSIZED_AXIS),
138 }
139 .into(),
140 anchor: feather_ui::RelPoint(Vec2 { x: 0.0, y: 0.0 }).into(),
141 ..Default::default()
142 }
143 .into(),
144 text: format!("Boxes: {}", args.count),
145 font_size: 40.0,
146 line_height: 56.0,
147 ..Default::default()
148 };
149
150 let rect = Shape::<DRect, { ShapeKind::RoundRect as u8 }>::new(
151 gen_id!(),
152 feather_ui::FILL_DRECT.into(),
153 0.0,
154 0.0,
155 Vec4::broadcast(10.0),
156 sRGB::new(0.2, 0.7, 0.4, 1.0),
157 sRGB::transparent(),
158 );
159
160 Button::<FixedData>::new(
161 gen_id!(),
162 FixedData {
163 area: feather_ui::URect {
164 abs: AbsRect::new(0.0, 20.0, 0.0, 0.0),
165 rel: RelRect::new(0.5, 0.0, UNSIZED_AXIS, UNSIZED_AXIS),
166 }
167 .into(),
168 anchor: feather_ui::RelPoint(Vec2 { x: 0.5, y: 0.0 }).into(),
169 zindex: 0,
170 },
171 Slot(feather_ui::APP_SOURCE_ID.into(), 0),
172 feather_ui::children![fixed::Prop, rect, text],
173 )
174 };
175
176 let rectlist = {
177 let mut children: im::Vector<Option<Box<ChildOf<dyn list::Prop>>>> =
178 im::Vector::new();
179
180 let rect_id = gen_id!();
181
182 for i in 0..args.count {
183 children.push_back(Some(Box::new(Shape::<
184 ListChild,
185 { ShapeKind::RoundRect as u8 },
186 >::new(
187 rect_id.child(DataID::Int(i as i64)),
188 ListChild {
189 area: AbsRect::new(0.0, 0.0, 40.0, 40.0).into(),
190 margin: AbsRect::new(8.0, 8.0, 4.0, 4.0).into(),
191 }
192 .into(),
193 0.0,
194 0.0,
195 Vec4::broadcast(8.0),
196 sRGB::new(
197 (0.1 * i as f32) % 1.0,
198 (0.65 * i as f32) % 1.0,
199 (0.2 * i as f32) % 1.0,
200 1.0,
201 ),
202 sRGB::transparent(),
203 ))));
204 }
205
206 ListBox::<ListData>::new(
207 gen_id!(),
208 ListData {
209 area: feather_ui::URect {
210 abs: AbsRect::new(0.0, 200.0, 0.0, 0.0),
211 rel: RelRect::new(0.0, 0.0, UNSIZED_AXIS, 1.0),
212 }
213 .into(),
214 rlimits: feather_ui::RelLimits::new(
215 ZERO_POINT,
216 Vec2::new(1.0, f32::INFINITY),
217 ),
218 direction: feather_ui::RowDirection::BottomToTop,
219 }
220 .into(),
221 children,
222 )
223 };
224
225 let flexlist = {
226 let mut children: im::Vector<Option<Box<ChildOf<dyn flex::Prop>>>> =
227 im::Vector::new();
228
229 let box_id = gen_id!();
230 for i in 0..args.count {
231 children.push_back(Some(Box::new(Shape::<
232 FlexChild,
233 { ShapeKind::RoundRect as u8 },
234 >::new(
235 box_id.child(DataID::Int(i as i64)),
236 FlexChild {
237 area: feather_ui::URect {
238 abs: AbsRect::new(0.0, 0.0, 0.0, 40.0),
239 rel: RelRect::new(0.0, 0.0, 1.0, 0.0),
240 }
241 .into(),
242 margin: AbsRect::new(8.0, 8.0, 4.0, 4.0).into(),
243 basis: 40.0.into(),
244 grow: 0.0,
245 shrink: 0.0,
246 }
247 .into(),
248 0.0,
249 0.0,
250 Vec4::broadcast(8.0),
251 sRGB::new(
252 (0.1 * i as f32) % 1.0,
253 (0.65 * i as f32) % 1.0,
254 (0.2 * i as f32) % 1.0,
255 1.0,
256 ),
257 sRGB::transparent(),
258 ))));
259 }
260
261 FlexBox::<MinimalFlex>::new(
262 gen_id!(),
263 MinimalFlex {
264 area: (AbsRect::new(40.0, 40.0, 0.0, 200.0)
265 + RelRect::new(0.0, 0.0, 1.0, 0.0))
266 .into(),
267 }
268 .into(),
269 children,
270 )
271 };
272
273 let region = Region::new(
274 gen_id!(),
275 FixedData {
276 area: FILL_DRECT,
277 zindex: 0,
278 ..Default::default()
279 }
280 .into(),
281 feather_ui::children![fixed::Prop, button, flexlist, rectlist],
282 );
283 let window = Window::new(
284 gen_id!(),
285 feather_ui::winit::window::Window::default_attributes()
286 .with_title(env!("CARGO_CRATE_NAME"))
287 .with_resizable(true),
288 Box::new(region),
289 );
290
291 store.1 = im::HashMap::new();
292 store.1.insert(window.id.clone(), Some(window));
293 store.0 = args.clone();
294 }
295 let windows = store.1.clone();
296 (store, windows)
297 }
pub fn min(&self) -> RelPoint
pub fn max(&self) -> RelPoint
Trait Implementations§
impl Copy for RelLimits
Auto Trait Implementations§
impl Freeze for RelLimits
impl RefUnwindSafe for RelLimits
impl Send for RelLimits
impl Sync for RelLimits
impl Unpin for RelLimits
impl UnwindSafe for RelLimits
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more