Skip to main content

PopulatedMessageReader

Struct PopulatedMessageReader 

Source
pub struct PopulatedMessageReader<'w, 's, M>(/* private fields */)
where
    M: Message;
Expand description

Reads Messages of type T in order and tracks which messages have already been read. Skips the system if there no messages.

Use MessageReader<T> to run the system even if there are no messages.

Use the on_message run condition to skip the system based on messages that it doesn’t read.

Methods from Deref<Target = MessageReader<'w, 's, M>>§

Source

pub fn read(&mut self) -> MessageIterator<'_, M> ⓘ

Iterates over the messages this MessageReader has not seen yet. This updates the MessageReader’s message counter, which means subsequent message reads will not include messages that happened before now.

Examples found in repository?
examples/input/touch_input_events.rs (line 13)
12fn touch_event_system(mut touch_inputs: MessageReader<TouchInput>) {
13    for touch_input in touch_inputs.read() {
14        info!("{:?}", touch_input);
15    }
16}
More examples
Hide additional examples
examples/input/keyboard_input_events.rs (line 14)
13fn print_keyboard_event_system(mut keyboard_inputs: MessageReader<KeyboardInput>) {
14    for keyboard_input in keyboard_inputs.read() {
15        info!("{:?}", keyboard_input);
16    }
17}
examples/app/drag_and_drop.rs (line 13)
12fn file_drag_and_drop_system(mut drag_and_drop_reader: MessageReader<FileDragAndDrop>) {
13    for drag_and_drop in drag_and_drop_reader.read() {
14        info!("{:?}", drag_and_drop);
15    }
16}
examples/2d/dynamic_mip_generation.rs (line 512)
508fn handle_window_resize_events(
509    mut events: MessageReader<WindowResized>,
510    mut regenerate_image_message_writer: MessageWriter<RegenerateImage>,
511) {
512    for _ in events.read() {
513        regenerate_image_message_writer.write(RegenerateImage);
514    }
515}
516
517/// Recreates the image, as well as all views that show the image, when a
518/// [`RegenerateImage`] message is received.
519///
520/// The views that show the image consist of the animated mesh on the left side
521/// of the window and the column of mipmap level views on the right side of the
522/// window.
523fn regenerate_image_when_requested(
524    mut commands: Commands,
525    image_views_query: Query<Entity, With<ImageView>>,
526    windows_query: Query<&Window, With<PrimaryWindow>>,
527    app_assets: Res<AppAssets>,
528    mut app_status: ResMut<AppStatus>,
529    mut images: ResMut<Assets<Image>>,
530    mut single_mip_level_materials: ResMut<Assets<SingleMipLevelMaterial>>,
531    mut color_materials: ResMut<Assets<ColorMaterial>>,
532    mut message_reader: MessageReader<RegenerateImage>,
533) {
534    // Only do this at most once per frame, or else the despawn logic below will
535    // get confused.
536    if message_reader.read().count() == 0 {
537        return;
538    }
539
540    // Despawn all entities that show the image.
541    for entity in image_views_query.iter() {
542        commands.entity(entity).despawn();
543    }
544
545    // Regenerate the image.
546    let image_handle = app_status.regenerate_mipmap_source_image(&mut commands, &mut images);
547
548    // Respawn the animated image view on the left side of the window.
549    spawn_animated_mesh(
550        &mut commands,
551        &app_status,
552        &app_assets,
553        &windows_query,
554        &mut color_materials,
555        &image_handle,
556    );
557
558    // Respawn the column of mip level views on the right side of the window.
559    spawn_mip_level_views(
560        &mut commands,
561        &app_status,
562        &app_assets,
563        &windows_query,
564        &mut single_mip_level_materials,
565        &image_handle,
566    );
567}
examples/math/cubic_splines.rs (line 300)
296fn handle_mouse_move(
297    mut cursor_moved_reader: MessageReader<CursorMoved>,
298    mut mouse_position: ResMut<MousePosition>,
299) {
300    if let Some(cursor_moved) = cursor_moved_reader.read().last() {
301        mouse_position.0 = Some(cursor_moved.position);
302    }
303}
304
305/// This system handles updating the [`MouseEditMove`] resource, orchestrating the logical part
306/// of the click-and-drag motion which actually creates new control points.
307fn handle_mouse_press(
308    mut mouse_button_input_reader: MessageReader<MouseButtonInput>,
309    mouse_position: Res<MousePosition>,
310    mut edit_move: ResMut<MouseEditMove>,
311    mut control_points: ResMut<ControlPoints>,
312    camera: Single<(&Camera, &GlobalTransform)>,
313) {
314    let Some(mouse_pos) = mouse_position.0 else {
315        return;
316    };
317
318    // Handle click and drag behavior
319    for mouse_button_input in mouse_button_input_reader.read() {
320        if mouse_button_input.button != MouseButton::Left {
321            continue;
322        }
323
324        match mouse_button_input.state {
325            ButtonState::Pressed => {
326                if edit_move.start.is_some() {
327                    // If the edit move already has a start, press event should do nothing.
328                    continue;
329                }
330                // This press represents the start of the edit move.
331                edit_move.start = Some(mouse_pos);
332            }
333
334            ButtonState::Released => {
335                // Release is only meaningful if we started an edit move.
336                let Some(start) = edit_move.start else {
337                    continue;
338                };
339
340                let (camera, camera_transform) = *camera;
341
342                // Convert the starting point and end point (current mouse pos) into world coords:
343                let Ok(point) = camera.viewport_to_world_2d(camera_transform, start) else {
344                    continue;
345                };
346                let Ok(end_point) = camera.viewport_to_world_2d(camera_transform, mouse_pos) else {
347                    continue;
348                };
349                let tangent = end_point - point;
350
351                // The start of the click-and-drag motion represents the point to add,
352                // while the difference with the current position represents the tangent.
353                control_points.points_and_tangents.push((point, tangent));
354
355                // Reset the edit move since we've consumed it.
356                edit_move.start = None;
357            }
358        }
359    }
360}
examples/window/window_resizing.rs (line 79)
75fn on_resize_system(
76    mut text: Single<&mut Text, With<ResolutionText>>,
77    mut resize_reader: MessageReader<WindowResized>,
78) {
79    for e in resize_reader.read() {
80        // When resolution is being changed
81        text.0 = format!("{:.1} x {:.1}", e.width, e.height);
82    }
83}
Source

pub fn read_with_id(&mut self) -> MessageIteratorWithId<'_, M> ⓘ

Like read, except also returning the MessageId of the messages.

Source

pub fn par_read(&mut self) -> MessageParIter<'_, M>

Available on crate feature multi_threaded only.

Returns a parallel iterator over the messages this MessageReader has not seen yet. See also for_each.

§Example

#[derive(Message)]
struct MyMessage {
    value: usize,
}

#[derive(Resource, Default)]
struct Counter(AtomicUsize);

// setup
let mut world = World::new();
world.init_resource::<Messages<MyMessage>>();
world.insert_resource(Counter::default());

let mut schedule = Schedule::default();
schedule.add_systems(|mut messages: MessageReader<MyMessage>, counter: Res<Counter>| {
    messages.par_read().for_each(|MyMessage { value }| {
        counter.0.fetch_add(*value, Ordering::Relaxed);
    });
});
for value in 0..100 {
    world.write_message(MyMessage { value });
}
schedule.run(&mut world);
let Counter(counter) = world.remove_resource::<Counter>().unwrap();
// all messages were processed
assert_eq!(counter.into_inner(), 4950);
Source

pub fn len(&self) -> usize

Determines the number of messages available to be read from this MessageReader without consuming any.

Source

pub fn is_empty(&self) -> bool

Returns true if there are no messages available to read.

§Example

The following example shows a useful pattern where some behavior is triggered if new messages are available. MessageReader::clear() is used so the same messages don’t re-trigger the behavior the next time the system runs.

#[derive(Message)]
struct Collision;

fn play_collision_sound(mut messages: MessageReader<Collision>) {
    if !messages.is_empty() {
        messages.clear();
        // Play a sound
    }
}
Examples found in repository?
examples/ecs/extraction.rs (line 124)
114fn extract_components(
115    b: Extract<Query<(RenderEntity, &B)>>,
116    c: Extract<Query<(RenderEntity, &C)>>,
117    mut reader: Extract<MessageReader<ExtractMessage>>,
118    mut commands: Commands,
119) {
120    for (entity, b) in &b {
121        commands.entity(entity).insert(b.clone());
122    }
123
124    if !reader.is_empty() {
125        for (entity, c) in &c {
126            commands.entity(entity).insert(c.clone());
127        }
128        reader.clear();
129    }
130}
More examples
Hide additional examples
examples/asset/processing/asset_processing.rs (line 254)
249fn print_text(
250    handles: Res<TextAssets>,
251    texts: Res<Assets<Text>>,
252    mut asset_events: MessageReader<AssetEvent<Text>>,
253) {
254    if !asset_events.is_empty() {
255        // This prints the current values of the assets
256        // Hot-reloading is supported, so try modifying the source assets (and their meta files)!
257        println!("Current Values:");
258        println!("  a: {:?}", texts.get(&handles.a));
259        println!("  b: {:?}", texts.get(&handles.b));
260        println!("  c: {:?}", texts.get(&handles.c));
261        println!("  d: {:?}", texts.get(&handles.d));
262        println!("  e: {:?}", texts.get(&handles.e));
263        println!("(You can modify source assets and their .meta files to hot-reload changes!)");
264        println!();
265        asset_events.clear();
266    }
267}
Source

pub fn clear(&mut self)

Consumes all available messages.

This means these messages will not appear in calls to MessageReader::read() or MessageReader::read_with_id() and MessageReader::is_empty() will return true.

For usage, see MessageReader::is_empty().

Examples found in repository?
examples/ecs/extraction.rs (line 128)
114fn extract_components(
115    b: Extract<Query<(RenderEntity, &B)>>,
116    c: Extract<Query<(RenderEntity, &C)>>,
117    mut reader: Extract<MessageReader<ExtractMessage>>,
118    mut commands: Commands,
119) {
120    for (entity, b) in &b {
121        commands.entity(entity).insert(b.clone());
122    }
123
124    if !reader.is_empty() {
125        for (entity, c) in &c {
126            commands.entity(entity).insert(c.clone());
127        }
128        reader.clear();
129    }
130}
More examples
Hide additional examples
examples/asset/processing/asset_processing.rs (line 265)
249fn print_text(
250    handles: Res<TextAssets>,
251    texts: Res<Assets<Text>>,
252    mut asset_events: MessageReader<AssetEvent<Text>>,
253) {
254    if !asset_events.is_empty() {
255        // This prints the current values of the assets
256        // Hot-reloading is supported, so try modifying the source assets (and their meta files)!
257        println!("Current Values:");
258        println!("  a: {:?}", texts.get(&handles.a));
259        println!("  b: {:?}", texts.get(&handles.b));
260        println!("  c: {:?}", texts.get(&handles.c));
261        println!("  d: {:?}", texts.get(&handles.d));
262        println!("  e: {:?}", texts.get(&handles.e));
263        println!("(You can modify source assets and their .meta files to hot-reload changes!)");
264        println!();
265        asset_events.clear();
266    }
267}
examples/camera/pan_orbit_camera_custom_input_plugin.rs (line 144)
69pub fn custom_camera_inputs(
70    pointers: Query<(&PointerId, &PointerLocation)>,
71    pointer_map: Res<CameraPointerMap>,
72    mut controller: MessageWriter<PanOrbitCameraInputMessage>,
73    mut mouse_wheel: MessageReader<MouseWheel>,
74    mouse_input: Res<ButtonInput<MouseButton>>,
75    cameras: Query<(Entity, &Camera, &RenderTarget, &PanOrbitCamera)>,
76    primary_window: Query<Entity, With<PrimaryWindow>>,
77) {
78    let orbit_start = MouseButton::Right;
79    let pan_start = MouseButton::Left;
80    let zoom_stop = 0.0;
81
82    if let Some(&camera) = pointer_map.get(&PointerId::Mouse) {
83        let camera_query = cameras.get(camera).ok();
84        let is_in_zoom_mode = camera_query
85            .map(|(.., editor_cam)| editor_cam.current_motion.is_zooming_only())
86            .unwrap_or_default();
87        let zoom_amount_abs = camera_query
88            .and_then(|(.., editor_cam)| {
89                editor_cam
90                    .current_motion
91                    .inputs()
92                    .map(|inputs| inputs.zoom_velocity_abs(editor_cam.smoothing.zoom.mul_f32(2.0)))
93            })
94            .unwrap_or(0.0);
95        let should_zoom_end = is_in_zoom_mode && zoom_amount_abs <= zoom_stop;
96
97        if mouse_input.any_just_released([orbit_start, pan_start]) || should_zoom_end {
98            controller.write(PanOrbitCameraInputMessage::End { camera });
99        }
100    }
101
102    for (&pointer, pointer_location) in pointers
103        .iter()
104        .filter_map(|(id, loc)| loc.location().map(|loc| (id, loc)))
105    {
106        match pointer {
107            PointerId::Mouse => {
108                let Some((camera, ..)) = cameras.iter().find(|(_, camera, render_target, _)| {
109                    pointer_location.is_in_viewport(camera, render_target, &primary_window)
110                }) else {
111                    continue; // Pointer must be in viewport to start a motion.
112                };
113
114                if mouse_input.just_pressed(orbit_start) {
115                    controller.write(PanOrbitCameraInputMessage::Start {
116                        kind: MotionKind::OrbitZoom,
117                        camera,
118                        pointer,
119                    });
120                } else if mouse_input.just_pressed(pan_start) {
121                    controller.write(PanOrbitCameraInputMessage::Start {
122                        kind: MotionKind::PanZoom,
123                        camera,
124                        pointer,
125                    });
126                } else if mouse_wheel.read().map(|mw| mw.y.abs()).sum::<f32>() > 0.0 {
127                    // Note we can't just check if the mouse wheel inputs are empty, we need to
128                    // check if the y value abs greater than zero, otherwise we get a bunch of false
129                    // positives, which can cause issues with figuring out what the user is trying
130                    // to do.
131                    controller.write(PanOrbitCameraInputMessage::Start {
132                        kind: MotionKind::Zoom,
133                        camera,
134                        pointer,
135                    });
136                }
137            }
138            PointerId::Touch(_) | PointerId::Custom(_) => continue,
139        }
140    }
141
142    // This must be cleared manually because reading these inputs is conditional - we are not
143    // guaranteed to be flushing the events every frame.
144    mouse_wheel.clear();
145}
146
147/// Maps pointers to the camera they are currently controlling.
148///
149/// This is needed so we can automatically track pointer movements and update camera movement after
150/// a [`PanOrbitCameraInputMessage::Start`] has been received.
151#[derive(Debug, Clone, Default, Deref, DerefMut, Resource)]
152pub struct CameraPointerMap(HashMap<PointerId, Entity>);
153
154/// Messages used when implementing input systems for the [`PanOrbitCamera`].
155#[derive(Debug, Clone, Message)]
156pub enum PanOrbitCameraInputMessage {
157    /// Send this event to start moving the camera. The anchor and inputs will be computed
158    /// automatically until the [`PanOrbitCameraInputMessage::End`] event is received.
159    Start {
160        /// The kind of camera movement that is being started.
161        kind: MotionKind,
162        /// The camera to move.
163        camera: Entity,
164        /// The pointer that will be controlling the camera. The rotation anchor point in the world
165        /// will be automatically computed using picking backends.
166        pointer: PointerId,
167    },
168    /// Send this event when a user's input ends, e.g. the button is released.
169    End {
170        /// The entity of the camera that should end its current input motion.
171        camera: Entity,
172    },
173}
174
175impl PanOrbitCameraInputMessage {
176    /// Get the camera entity associated with this event.
177    pub fn camera(&self) -> Entity {
178        match self {
179            PanOrbitCameraInputMessage::Start { camera, .. }
180            | PanOrbitCameraInputMessage::End { camera } => *camera,
181        }
182    }
183
184    /// Receive [`PanOrbitCameraInputMessage`]s, and use these to start and end moves on the [`PanOrbitCamera`].
185    pub fn receive_messages(
186        mut events: MessageReader<Self>,
187        mut controllers: Query<(&mut PanOrbitCamera, &GlobalTransform)>,
188        mut camera_map: ResMut<CameraPointerMap>,
189        pointer_map: Res<PointerMap>,
190        pointer_interactions: Query<&PointerInteraction>,
191        pointer_locations: Query<&PointerLocation>,
192        cameras: Query<(&Camera, &Projection)>,
193        windows: Query<&Window>,
194    ) {
195        for event in events.read() {
196            let Ok((mut controller, cam_transform)) = controllers.get_mut(event.camera()) else {
197                continue;
198            };
199
200            match event {
201                PanOrbitCameraInputMessage::Start { kind, pointer, .. } => {
202                    if controller.is_actively_controlled() {
203                        continue;
204                    }
205                    let anchor = pointer_map
206                        .get_entity(*pointer)
207                        .and_then(|entity| pointer_interactions.get(entity).ok())
208                        .and_then(|interaction| interaction.get_nearest_hit())
209                        // Since `bevy` 0.17.3:
210                        //
211                        // If the current hit is on a window, we cannot use the `hit.position` as an anchor
212                        // as the `hit.position` is in viewport coordinates.
213                        .filter(|(entity, _hit)| !windows.contains(*entity))
214                        .and_then(|(_, hit)| hit.position)
215                        .map(|world_space_hit| {
216                            // Convert the world space hit to view (camera) space
217                            cam_transform
218                                .to_matrix()
219                                .as_dmat4()
220                                .inverse()
221                                .transform_point3(world_space_hit.into())
222                        })
223                        .filter(|p| {
224                            #[cfg(debug_assertions)]
225                            if !p.is_finite() {
226                                bevy::log::warn!(
227                                    "Non-finite input fed to camera controller: {p:?}"
228                                );
229                            }
230                            p.is_finite()
231                        })
232                        .or_else(|| {
233                            let camera = cameras.get(event.camera()).ok();
234                            let pointer_location = pointer_map
235                                .get_entity(*pointer)
236                                .and_then(|entity| pointer_locations.get(entity).ok())
237                                .and_then(|l| l.location());
238                            if let Some(((camera, proj), pointer_location)) =
239                                camera.zip(pointer_location)
240                            {
241                                screen_to_view_space(
242                                    camera,
243                                    proj,
244                                    &controller,
245                                    pointer_location.position,
246                                )
247                            } else {
248                                None
249                            }
250                        })
251                        .filter(|p| p.is_finite());
252
253                    match kind {
254                        MotionKind::OrbitZoom => controller.start_orbit(anchor),
255                        MotionKind::PanZoom => controller.start_pan(anchor),
256                        MotionKind::Zoom => controller.start_zoom(anchor),
257                    }
258                    camera_map.insert(*pointer, event.camera());
259                }
260                PanOrbitCameraInputMessage::End { .. } => {
261                    controller.end_move();
262                    if let Some(pointer) = camera_map
263                        .iter()
264                        .find(|(.., camera)| **camera == event.camera())
265                        .map(|(&pointer, ..)| pointer)
266                    {
267                        camera_map.remove(&pointer);
268                    }
269                }
270            }
271        }
272    }
273
274    /// While a camera motion is active, this system will take care of sending new pointer motion to
275    /// the camera controller. The camera controller assumes that pan and orbit movements are tied
276    /// to screen space pointer motion.
277    ///
278    /// This is because some of the pixel-perfect features of the controller require that data be
279    /// passed in as screen space deltas, to compute perfect first-order control. This is also
280    /// because the plugin uses pointer information to know which camera is being controlled.
281    ///
282    /// If you want to control the camera with different inputs, you will need to replace this
283    /// system with one that tracks other input methods, and sends the required zoom and screenspace
284    /// movement information.
285    pub fn send_pointer_inputs(
286        camera_map: Res<CameraPointerMap>,
287        mut camera_controllers: Query<&mut PanOrbitCamera>,
288        mut mouse_wheel: MessageReader<MouseWheel>,
289        mut moves: MessageReader<PointerInput>,
290    ) {
291        let moves_list: Vec<_> = moves.read().collect();
292        for (pointer, camera) in camera_map.iter() {
293            let Ok(mut camera_controller) = camera_controllers.get_mut(*camera) else {
294                continue;
295            };
296
297            let screenspace_input = moves_list
298                .iter()
299                .filter(|m| m.pointer_id.eq(pointer))
300                .filter_map(|m| match m.action {
301                    PointerAction::Move { delta } => Some(delta),
302                    _ => None,
303                })
304                .sum();
305
306            let zoom_amount = match pointer {
307                // TODO: add pinch zoom support
308                PointerId::Mouse => mouse_wheel
309                    .read()
310                    .map(|mw| {
311                        let scroll_multiplier = match mw.unit {
312                            MouseScrollUnit::Line => 150.0,
313                            MouseScrollUnit::Pixel => 1.0,
314                        };
315                        mw.y * scroll_multiplier
316                    })
317                    .sum::<f32>(),
318                _ => 0.0,
319            };
320
321            camera_controller.send_screenspace_input(screenspace_input);
322            camera_controller.send_zoom_input(zoom_amount);
323        }
324        // This must be cleared manually because reading these inputs is conditional - we are not
325        // guaranteed to be flushing the events every frame.
326        mouse_wheel.clear();
327    }

Trait Implementations§

Source§

impl<'w, 's, M> Debug for PopulatedMessageReader<'w, 's, M>
where M: Debug + Message,

Source§

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

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

impl<'w, 's, M> Deref for PopulatedMessageReader<'w, 's, M>
where M: Message,

Source§

type Target = MessageReader<'w, 's, M>

The resulting type after dereferencing.
Source§

fn deref(&self) -> &<PopulatedMessageReader<'w, 's, M> as Deref>::Target

Dereferences the value.
Source§

impl<'w, 's, M> DerefMut for PopulatedMessageReader<'w, 's, M>
where M: Message,

Source§

fn deref_mut( &mut self, ) -> &mut <PopulatedMessageReader<'w, 's, M> as Deref>::Target

Mutably dereferences the value.
Source§

impl<M> ReadOnlySystemParam for PopulatedMessageReader<'_, '_, M>
where M: Message,

Source§

impl<'w, 's, M> SystemParam for PopulatedMessageReader<'w, 's, M>
where M: Message,

Source§

type State = <MessageReader<'w, 's, M> as SystemParam>::State

Used to store data which persists across invocations of a system.
Source§

type Item<'world, 'state> = PopulatedMessageReader<'world, 'state, M>

The item type returned when constructing this system param. The value of this associated type should be Self, instantiated with new lifetimes. Read more
Source§

fn init_state( world: &mut World, ) -> <PopulatedMessageReader<'w, 's, M> as SystemParam>::State

Creates a new instance of this param’s State.
Source§

fn init_access( state: &<PopulatedMessageReader<'w, 's, M> as SystemParam>::State, system_meta: &mut SystemMeta, system_access: &mut SystemAccess, world: &mut World, )

Registers any World access used by this SystemParam. Read more
Source§

unsafe fn get_param<'world, 'state>( state: &'state mut <PopulatedMessageReader<'w, 's, M> as SystemParam>::State, system_meta: &SystemMeta, world: UnsafeWorldCell<'world>, change_tick: Tick, ) -> Result<<PopulatedMessageReader<'w, 's, M> as SystemParam>::Item<'world, 'state>, SystemParamValidationError>

Creates a parameter to be passed into a SystemParamFunction. Read more
Source§

fn apply(state: &mut Self::State, system_meta: &SystemMeta, world: &mut World)

Applies any deferred mutations stored in this SystemParam’s state. This is used to apply Commands during ApplyDeferred.
Source§

fn queue( state: &mut Self::State, system_meta: &SystemMeta, world: DeferredWorld<'_>, )

Queues any deferred mutations to be applied at the next ApplyDeferred.

Auto Trait Implementations§

§

impl<'w, 's, M> !UnwindSafe for PopulatedMessageReader<'w, 's, M>

§

impl<'w, 's, M> Freeze for PopulatedMessageReader<'w, 's, M>
where MessageReader<'w, 's, M>: Freeze,

§

impl<'w, 's, M> RefUnwindSafe for PopulatedMessageReader<'w, 's, M>
where MessageReader<'w, 's, M>: RefUnwindSafe,

§

impl<'w, 's, M> Send for PopulatedMessageReader<'w, 's, M>
where MessageReader<'w, 's, M>: Send,

§

impl<'w, 's, M> Sync for PopulatedMessageReader<'w, 's, M>
where MessageReader<'w, 's, M>: Sync,

§

impl<'w, 's, M> Unpin for PopulatedMessageReader<'w, 's, M>
where MessageReader<'w, 's, M>: Unpin,

§

impl<'w, 's, M> UnsafeUnpin for PopulatedMessageReader<'w, 's, M>
where MessageReader<'w, 's, M>: UnsafeUnpin,

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, U> AsBindGroupShaderType<U> for T
where U: ShaderType, &'a T: for<'a> Into<U>,

Source§

fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U

Return the T ShaderType for self. When used in AsBindGroup derives, it is safe to assume that all images in self exist.
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

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

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

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

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &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)

Converts &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> 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> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

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

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<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<S> FromSample<S> for S

Source§

fn from_sample_(s: S) -> S

Source§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

Source§

const WITNESS: W = W::MAKE

A constant of the type witness
Source§

impl<T> HitDataExtra for T
where T: Send + Sync + Debug + Any + 'static,

Source§

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

Source§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
Source§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
Source§

impl<T> InitializeFromFunction<T> for T

Source§

fn initialize_from_function(f: fn() -> T) -> T

Create an instance of this type from an initialization function
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> IntoResult<T> for T

Source§

fn into_result(self) -> Result<T, RunSystemError>

Converts this type into the system output type.
Source§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

Source§

fn into_sample(self) -> T

Source§

impl<A> Is for A
where A: Any,

Source§

fn is<T>() -> bool
where T: Any,

Checks if the current type “is” another type, using a TypeId equality comparison. This is most useful in the context of generic logic. Read more
Source§

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

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Settings for T
where T: 'static + Send + Sync,

Source§

impl<Ret> SpawnIfAsync<(), Ret> for Ret

Source§

fn spawn(self) -> Ret

Spawn the value into the dioxus runtime if it is an async block
Source§

impl<T, O> SuperFrom<T> for O
where O: From<T>,

Source§

fn super_from(input: T) -> O

Convert from a type to another type.
Source§

impl<T, O, M> SuperInto<O, M> for T
where O: SuperFrom<T, M>,

Source§

fn super_into(self) -> O

Convert from a type to another type.
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

Source§

fn to_sample_(self) -> U

Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

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

Source§

impl<T> WasmNotSendSync for T

Source§

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

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