pub struct Button<T: Prop + 'static> {
pub id: Arc<SourceID>,
/* private fields */
}
Fields§
§id: Arc<SourceID>
Implementations§
Source§impl<T: Prop + 'static> Button<T>
impl<T: Prop + 'static> Button<T>
Sourcepub fn new(
id: Arc<SourceID>,
props: T,
onclick: Slot,
children: Vector<Option<Box<ChildOf<dyn Prop>>>>,
) -> Self
pub fn new( id: Arc<SourceID>, props: T, onclick: Slot, children: Vector<Option<Box<ChildOf<dyn Prop>>>>, ) -> Self
Examples found in repository?
examples/grid-rs.rs (lines 145-158)
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 84-96)
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 160-173)
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 }
Trait Implementations§
Auto Trait Implementations§
impl<T> Freeze for Button<T>
impl<T> !RefUnwindSafe for Button<T>
impl<T> !Send for Button<T>
impl<T> !Sync for Button<T>
impl<T> Unpin for Button<T>
impl<T> !UnwindSafe for Button<T>
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<U, C> ComponentWrap<U> for C
impl<U, C> ComponentWrap<U> for C
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> 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