Struct SourceID

Source
pub struct SourceID { /* private fields */ }

Implementations§

Source§

impl SourceID

Source

pub const fn new(id: DataID) -> Self

Source

pub fn child(self: &Arc<Self>, id: DataID) -> Arc<Self>

Creates a new SourceID out of the given DataID, with ourselves as its parent

Examples found in repository?
examples/graph-rs.rs (line 121)
66    fn call(
67        &mut self,
68        mut store: Self::Store,
69        args: &GraphState,
70    ) -> (Self::Store, im::HashMap<Arc<SourceID>, Option<Window>>) {
71        if store.0 != *args {
72            let mut children: im::Vector<Option<Box<ChildOf<dyn fixed::Prop>>>> = im::Vector::new();
73            let domain: Arc<CrossReferenceDomain> = Default::default();
74
75            let mut node_ids: Vec<Arc<SourceID>> = Vec::new();
76
77            for i in 0..args.nodes.len() {
78                let node = args.nodes[i];
79                const BASE: sRGB = sRGB::new(0.2, 0.7, 0.4, 1.0);
80
81                let point = DomainPoint::new(gen_id!(), domain.clone());
82                node_ids.push(point.id.clone());
83
84                let circle = Shape::<DRect, { ShapeKind::Circle as u8 }>::new(
85                    gen_id!(),
86                    FILL_DRECT.into(),
87                    0.0,
88                    0.0,
89                    Vec2::new(0.0, 20.0),
90                    if args.selected == Some(i) {
91                        sRGB::new(0.7, 1.0, 0.8, 1.0)
92                    } else {
93                        BASE
94                    },
95                    BASE,
96                );
97
98                let bag = Region::<MinimalArea>::new(
99                    gen_id!(gen_id!(), i),
100                    MinimalArea {
101                        area: AbsRect::new(
102                            node.x - NODE_RADIUS,
103                            node.y - NODE_RADIUS,
104                            node.x + NODE_RADIUS,
105                            node.y + NODE_RADIUS,
106                        )
107                        .into(),
108                    }
109                    .into(),
110                    feather_ui::children![fixed::Prop, point, circle],
111                );
112
113                children.push_back(Some(Box::new(bag)));
114            }
115
116            let edge_id = gen_id!();
117
118            for (a, b) in &args.edges {
119                let line = DomainLine::<()> {
120                    id: edge_id
121                        .child(DataID::Int(*a as i64))
122                        .child(DataID::Int(*b as i64)),
123                    fill: sRGB::white(),
124                    domain: domain.clone(),
125                    start: node_ids[*a].clone(),
126                    end: node_ids[*b].clone(),
127                    props: ().into(),
128                };
129
130                children.push_back(Some(Box::new(line)));
131            }
132
133            let subregion = Region::new(
134                gen_id!(),
135                MinimalArea {
136                    area: AbsRect::new(
137                        args.offset.x,
138                        args.offset.y,
139                        args.offset.x + 10000.0,
140                        args.offset.y + 10000.0,
141                    )
142                    .into(),
143                }
144                .into(),
145                children,
146            );
147
148            let mousearea: MouseArea<MinimalArea> = MouseArea::new(
149                gen_id!(),
150                MinimalArea { area: FILL_DRECT },
151                Some(4.0),
152                [
153                    Some(Slot(feather_ui::APP_SOURCE_ID.into(), 0)),
154                    Some(Slot(feather_ui::APP_SOURCE_ID.into(), 0)),
155                    Some(Slot(feather_ui::APP_SOURCE_ID.into(), 0)),
156                    None,
157                    None,
158                    None,
159                ],
160            );
161
162            let region = Region::new(
163                gen_id!(),
164                MinimalArea { area: FILL_DRECT }.into(),
165                feather_ui::children![fixed::Prop, subregion, mousearea],
166            );
167
168            let window = Window::new(
169                gen_id!(),
170                feather_ui::winit::window::Window::default_attributes()
171                    .with_title(env!("CARGO_CRATE_NAME"))
172                    .with_resizable(true),
173                Box::new(region),
174            );
175
176            store.1 = im::HashMap::new();
177            store.1.insert(window.id.clone(), Some(window));
178            store.0 = args.clone();
179        }
180        let windows = store.1.clone();
181        (store, windows)
182    }
More examples
Hide additional examples
examples/grid-rs.rs (line 171)
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    }
examples/list-rs.rs (line 187)
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    }
Source

pub fn duplicate(self: &Arc<Self>) -> Arc<Self>

Creates a new, unique duplicate ID using this as the parent and the strong count of this Rc as the child DataID.

Trait Implementations§

Source§

impl Clone for SourceID

Source§

fn clone(&self) -> SourceID

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SourceID

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SourceID

Source§

fn default() -> SourceID

Returns the “default value” for a type. Read more
Source§

impl Display for SourceID

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromLua for SourceID

Source§

fn from_lua(value: Value, _: &Lua) -> Result<Self>

Performs the conversion.
Source§

impl Hash for SourceID

Source§

fn hash<H: Hasher>(&self, state: &mut H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for SourceID

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl UserData for SourceID

Source§

fn add_fields<F>(fields: &mut F)
where F: UserDataFields<Self>,

Adds custom fields specific to this userdata.
Source§

fn add_methods<M>(methods: &mut M)
where M: UserDataMethods<Self>,

Adds custom methods and operators specific to this userdata.
Source§

fn register(registry: &mut UserDataRegistry<Self>)

Registers this type for use in Lua. Read more
Source§

impl Eq for SourceID

Source§

impl Send for SourceID

Source§

impl Sync for SourceID

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> Downcast for T
where T: Any,

Source§

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>

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)

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)

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
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<H> DynHashEq for H
where H: Hash + PartialEq + Eq + 'static + Clone + Debug,

Source§

fn dyn_hash(&self, state: &mut dyn Hasher)

Source§

fn dyn_eq(&self, other: &(dyn Any + 'static)) -> bool

Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromLuaMulti for T
where T: FromLua,

Source§

fn from_lua_multi(values: MultiValue, lua: &Lua) -> Result<T, Error>

Performs the conversion. Read more
Source§

fn from_lua_args( args: MultiValue, i: usize, to: Option<&str>, lua: &Lua, ) -> Result<T, Error>

Source§

unsafe fn from_stack_multi(nvals: i32, lua: &RawLua) -> Result<T, Error>

Source§

unsafe fn from_stack_args( nargs: i32, i: usize, to: Option<&str>, lua: &RawLua, ) -> Result<T, Error>

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
Source§

impl<T> IntoLua for T
where T: UserData + MaybeSend + 'static,

Source§

fn into_lua(self, lua: &Lua) -> Result<Value, Error>

Performs the conversion.
Source§

impl<T> IntoLuaMulti for T
where T: IntoLua,

Source§

fn into_lua_multi(self, lua: &Lua) -> Result<MultiValue, Error>

Performs the conversion.
Source§

unsafe fn push_into_stack_multi(self, lua: &RawLua) -> Result<i32, Error>

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToSmolStr for T
where T: Display + ?Sized,

Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> MaybeSend for T

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,