Skip to main content

ButtonInput

Struct ButtonInput 

Source
pub struct ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static,
{ /* private fields */ }
Expand description

A “press-able” input of type T.

§Usage

This type can be used as a resource to keep the current state of an input, by reacting to events from the input. For a given input value:

§Multiple systems

In case multiple systems are checking for ButtonInput::just_pressed or ButtonInput::just_released but only one should react, for example when modifying a Resource, you should consider clearing the input state, either by:

§Performance

For all operations, the following conventions are used:

  • n is the number of stored inputs.
  • m is the number of input arguments passed to the method.
  • *-suffix denotes an amortized cost.
  • ~-suffix denotes an expected cost.

See Rust’s std::collections doc on performance for more details on the conventions used here.

§Window focus

ButtonInput<KeyCode> is tied to window focus. For example, if the user holds a button while the window loses focus, ButtonInput::just_released will be triggered. Similarly if the window regains focus, ButtonInput::just_pressed will be triggered.

ButtonInput<GamepadButton> is independent of window focus.

§Examples

Reading and checking against the current set of pressed buttons:


fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(
            Update,
            print_mouse.run_if(resource_changed::<ButtonInput<MouseButton>>),
        )
        .add_systems(
            Update,
            print_keyboard.run_if(resource_changed::<ButtonInput<KeyCode>>),
        )
        .run();
}

fn print_mouse(mouse: Res<ButtonInput<MouseButton>>) {
    println!("Mouse: {:?}", mouse.get_pressed().collect::<Vec<_>>());
}

fn print_keyboard(keyboard: Res<ButtonInput<KeyCode>>) {
    if keyboard.any_pressed([KeyCode::ControlLeft, KeyCode::ControlRight])
        && keyboard.any_pressed([KeyCode::AltLeft, KeyCode::AltRight])
        && keyboard.any_pressed([KeyCode::ShiftLeft, KeyCode::ShiftRight])
        && keyboard.any_pressed([KeyCode::SuperLeft, KeyCode::SuperRight])
        && keyboard.pressed(KeyCode::KeyL)
    {
        println!("On Windows this opens LinkedIn.");
    } else {
        println!("keyboard: {:?}", keyboard.get_pressed().collect::<Vec<_>>());
    }
}

§Note

When adding this resource for a new input type, you should:

Note: Calling clear from a ResMut will trigger change detection. It may be preferable to use DetectChangesMut::bypass_change_detection to avoid causing the resource to always be marked as changed.

Implementations§

Source§

impl<T> ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static,

Source

pub fn press(&mut self, input: T)

Registers a press for the given input.

Source

pub fn pressed(&self, input: T) -> bool

Returns true if the input has been pressed.

Examples found in repository?
examples/ecs/extraction.rs (line 107)
106fn trigger_extraction(mut writer: MessageWriter<ExtractMessage>, keys: Res<ButtonInput<KeyCode>>) {
107    if keys.pressed(KeyCode::Space) {
108        writer.write(ExtractMessage);
109    }
110}
More examples
Hide additional examples
examples/ecs/generic_system.rs (line 78)
74fn transition_to_in_game_system(
75    mut next_state: ResMut<NextState<AppState>>,
76    keyboard_input: Res<ButtonInput<KeyCode>>,
77) {
78    if keyboard_input.pressed(KeyCode::Space) {
79        next_state.set(AppState::InGame);
80    }
81}
examples/ecs/component_hooks.rs (line 142)
136fn trigger_hooks(
137    mut commands: Commands,
138    keys: Res<ButtonInput<KeyCode>>,
139    index: Res<MyComponentIndex>,
140) {
141    for (key, entity) in index.iter() {
142        if !keys.pressed(*key) {
143            commands.entity(*entity).remove::<MyComponent>();
144        }
145    }
146    for key in keys.get_just_pressed() {
147        commands.spawn(MyComponent(*key));
148    }
149}
examples/input/mouse_input.rs (line 17)
16fn mouse_click_system(mouse_button_input: Res<ButtonInput<MouseButton>>) {
17    if mouse_button_input.pressed(MouseButton::Left) {
18        info!("left mouse currently pressed");
19    }
20
21    if mouse_button_input.just_pressed(MouseButton::Left) {
22        info!("left mouse just pressed");
23    }
24
25    if mouse_button_input.just_released(MouseButton::Left) {
26        info!("left mouse just released");
27    }
28}
examples/ui/text/ime_support.rs (line 106)
99fn text_submission(
100    input_focus: Res<InputFocus>,
101    keyboard_input: Res<ButtonInput<KeyCode>>,
102    mut text_input: Query<&mut EditableText>,
103    mut text_output: Single<&mut Text, With<TextOutput>>,
104) {
105    if keyboard_input.just_pressed(KeyCode::Enter)
106        && (keyboard_input.pressed(KeyCode::ControlLeft)
107            || keyboard_input.pressed(KeyCode::ControlRight))
108        && let Some(focused_entity) = input_focus.get()
109        && let Ok(mut input) = text_input.get_mut(focused_entity)
110    {
111        text_output.0 = input.value().to_string();
112        input.clear();
113    }
114}
examples/audio/spatial_audio_2d.rs (line 113)
106fn update_listener(
107    keyboard: Res<ButtonInput<KeyCode>>,
108    time: Res<Time>,
109    mut listener: Single<&mut Transform, With<SpatialListener>>,
110) {
111    let speed = 200.;
112
113    if keyboard.pressed(KeyCode::ArrowRight) {
114        listener.translation.x += speed * time.delta_secs();
115    }
116    if keyboard.pressed(KeyCode::ArrowLeft) {
117        listener.translation.x -= speed * time.delta_secs();
118    }
119    if keyboard.pressed(KeyCode::ArrowUp) {
120        listener.translation.y += speed * time.delta_secs();
121    }
122    if keyboard.pressed(KeyCode::ArrowDown) {
123        listener.translation.y -= speed * time.delta_secs();
124    }
125}
Source

pub fn any_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool

Returns true if any item in inputs has been pressed.

Examples found in repository?
examples/input/keyboard_modifiers.rs (line 14)
13fn keyboard_input_system(input: Res<ButtonInput<KeyCode>>) {
14    let shift = input.any_pressed([KeyCode::ShiftLeft, KeyCode::ShiftRight]);
15    let ctrl = input.any_pressed([KeyCode::ControlLeft, KeyCode::ControlRight]);
16
17    if ctrl && shift && input.just_pressed(KeyCode::KeyA) {
18        info!("Just pressed Ctrl + Shift + A!");
19    }
20}
More examples
Hide additional examples
examples/ui/scroll_and_overflow/scroll.rs (line 40)
27fn send_scroll_events(
28    mut mouse_wheel_reader: MessageReader<MouseWheel>,
29    hover_map: Res<HoverMap>,
30    keyboard_input: Res<ButtonInput<KeyCode>>,
31    mut commands: Commands,
32) {
33    for mouse_wheel in mouse_wheel_reader.read() {
34        let mut delta = -Vec2::new(mouse_wheel.x, mouse_wheel.y);
35
36        if mouse_wheel.unit == MouseScrollUnit::Line {
37            delta *= LINE_HEIGHT;
38        }
39
40        if keyboard_input.any_pressed([KeyCode::ControlLeft, KeyCode::ControlRight]) {
41            std::mem::swap(&mut delta.x, &mut delta.y);
42        }
43
44        for pointer_map in hover_map.values() {
45            for entity in pointer_map.keys().copied() {
46                commands.trigger(Scroll { entity, delta });
47            }
48        }
49    }
50}
examples/3d/fog.rs (line 253)
137fn update_system(
138    camera: Single<(&mut DistanceFog, &mut Transform)>,
139    mut text: Single<&mut Text>,
140    time: Res<Time>,
141    keycode: Res<ButtonInput<KeyCode>>,
142) {
143    let now = time.elapsed_secs();
144    let delta = time.delta_secs();
145
146    let (mut fog, mut transform) = camera.into_inner();
147
148    // Orbit camera around pyramid
149    let orbit_scale = 8.0 + ops::sin(now / 10.0) * 7.0;
150    *transform = Transform::from_xyz(
151        ops::cos(now / 5.0) * orbit_scale,
152        12.0 - orbit_scale / 2.0,
153        ops::sin(now / 5.0) * orbit_scale,
154    )
155    .looking_at(Vec3::ZERO, Vec3::Y);
156
157    // Fog Information
158    text.0 = format!("Fog Falloff: {:?}\nFog Color: {:?}", fog.falloff, fog.color);
159
160    // Fog Falloff Mode Switching
161    text.push_str("\n\n1 / 2 / 3 - Fog Falloff Mode");
162
163    if keycode.pressed(KeyCode::Digit1) {
164        if let FogFalloff::Linear { .. } = fog.falloff {
165            // No change
166        } else {
167            fog.falloff = FogFalloff::Linear {
168                start: 5.0,
169                end: 20.0,
170            };
171        };
172    }
173
174    if keycode.pressed(KeyCode::Digit2) {
175        if let FogFalloff::Exponential { .. } = fog.falloff {
176            // No change
177        } else if let FogFalloff::ExponentialSquared { density } = fog.falloff {
178            fog.falloff = FogFalloff::Exponential { density };
179        } else {
180            fog.falloff = FogFalloff::Exponential { density: 0.07 };
181        };
182    }
183
184    if keycode.pressed(KeyCode::Digit3) {
185        if let FogFalloff::Exponential { density } = fog.falloff {
186            fog.falloff = FogFalloff::ExponentialSquared { density };
187        } else if let FogFalloff::ExponentialSquared { .. } = fog.falloff {
188            // No change
189        } else {
190            fog.falloff = FogFalloff::ExponentialSquared { density: 0.07 };
191        };
192    }
193
194    // Linear Fog Controls
195    if let FogFalloff::Linear { start, end } = &mut fog.falloff {
196        text.push_str("\nA / S - Move Start Distance\nZ / X - Move End Distance");
197
198        if keycode.pressed(KeyCode::KeyA) {
199            *start -= delta * 3.0;
200        }
201        if keycode.pressed(KeyCode::KeyS) {
202            *start += delta * 3.0;
203        }
204        if keycode.pressed(KeyCode::KeyZ) {
205            *end -= delta * 3.0;
206        }
207        if keycode.pressed(KeyCode::KeyX) {
208            *end += delta * 3.0;
209        }
210    }
211
212    // Exponential Fog Controls
213    if let FogFalloff::Exponential { density } = &mut fog.falloff {
214        text.push_str("\nA / S - Change Density");
215
216        if keycode.pressed(KeyCode::KeyA) {
217            *density -= delta * 0.5 * *density;
218            if *density < 0.0 {
219                *density = 0.0;
220            }
221        }
222        if keycode.pressed(KeyCode::KeyS) {
223            *density += delta * 0.5 * *density;
224        }
225    }
226
227    // ExponentialSquared Fog Controls
228    if let FogFalloff::ExponentialSquared { density } = &mut fog.falloff {
229        text.push_str("\nA / S - Change Density");
230
231        if keycode.pressed(KeyCode::KeyA) {
232            *density -= delta * 0.5 * *density;
233            if *density < 0.0 {
234                *density = 0.0;
235            }
236        }
237        if keycode.pressed(KeyCode::KeyS) {
238            *density += delta * 0.5 * *density;
239        }
240    }
241
242    // RGBA Controls
243    text.push_str("\n\n- / = - Red\n[ / ] - Green\n; / ' - Blue\n. / ? - Alpha");
244
245    // We're performing various operations in the sRGB color space,
246    // so we convert the fog color to sRGB here, then modify it,
247    // and finally when we're done we can convert it back and set it.
248    let mut fog_color = Srgba::from(fog.color);
249    if keycode.pressed(KeyCode::Minus) {
250        fog_color.red = (fog_color.red - 0.1 * delta).max(0.0);
251    }
252
253    if keycode.any_pressed([KeyCode::Equal, KeyCode::NumpadEqual]) {
254        fog_color.red = (fog_color.red + 0.1 * delta).min(1.0);
255    }
256
257    if keycode.pressed(KeyCode::BracketLeft) {
258        fog_color.green = (fog_color.green - 0.1 * delta).max(0.0);
259    }
260
261    if keycode.pressed(KeyCode::BracketRight) {
262        fog_color.green = (fog_color.green + 0.1 * delta).min(1.0);
263    }
264
265    if keycode.pressed(KeyCode::Semicolon) {
266        fog_color.blue = (fog_color.blue - 0.1 * delta).max(0.0);
267    }
268
269    if keycode.pressed(KeyCode::Quote) {
270        fog_color.blue = (fog_color.blue + 0.1 * delta).min(1.0);
271    }
272
273    if keycode.pressed(KeyCode::Period) {
274        fog_color.alpha = (fog_color.alpha - 0.1 * delta).max(0.0);
275    }
276
277    if keycode.pressed(KeyCode::Slash) {
278        fog_color.alpha = (fog_color.alpha + 0.1 * delta).min(1.0);
279    }
280
281    fog.color = Color::from(fog_color);
282}
Source

pub fn all_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool

Returns true if all items in inputs have been pressed.

Source

pub fn release(&mut self, input: T)

Registers a release for the given input.

Source

pub fn release_all(&mut self)

Registers a release for all currently pressed inputs.

Source

pub fn just_pressed(&self, input: T) -> bool

Returns true if the input has been pressed during the current frame.

Note: This function does not imply information regarding the current state of ButtonInput::pressed or ButtonInput::just_released.

Examples found in repository?
examples/app/logs.rs (line 34)
33fn panic_on_p(keys: Res<ButtonInput<KeyCode>>) {
34    if keys.just_pressed(KeyCode::KeyP) {
35        panic!("P pressed, panicking");
36    }
37}
More examples
Hide additional examples
examples/3d/solari_reflections.rs (line 618)
617fn pause_scene(key_input: Res<ButtonInput<KeyCode>>, mut state: ResMut<DemoState>) {
618    if key_input.just_pressed(KeyCode::Space) {
619        state.paused = !state.paused;
620    }
621}
622
623fn set_metallic(material: &mut StandardMaterial, metallic: bool) {
624    material.metallic = if metallic { 1.0 } else { 0.0 };
625    material.base_color = if metallic {
626        METALLIC_BASE_COLOR
627    } else {
628        DIELECTRIC_BASE_COLOR
629    };
630}
631
632fn toggle_metallic(
633    key_input: Res<ButtonInput<KeyCode>>,
634    mut state: ResMut<DemoState>,
635    test_material: Res<TestMaterial>,
636    mut materials: ResMut<Assets<StandardMaterial>>,
637) {
638    if key_input.just_pressed(KeyCode::Digit1) {
639        state.metallic = !state.metallic;
640        set_metallic(
641            &mut materials.get_mut(&test_material.0).unwrap(),
642            state.metallic,
643        );
644    }
645}
646
647fn toggle_mirror_motion(key_input: Res<ButtonInput<KeyCode>>, mut state: ResMut<DemoState>) {
648    if key_input.just_pressed(KeyCode::Digit8) {
649        state.pan_mirror = !state.pan_mirror;
650    }
651    if key_input.just_pressed(KeyCode::Digit9) {
652        state.slide_mirror = !state.slide_mirror;
653    }
654}
655
656fn toggle_pathtracer(
657    key_input: Res<ButtonInput<KeyCode>>,
658    camera: Single<(Entity, Has<Pathtracer>), With<Camera3d>>,
659    mut commands: Commands,
660) {
661    if key_input.just_pressed(KeyCode::KeyP) {
662        let (entity, pathtracing) = *camera;
663        let mut camera = commands.entity(entity);
664
665        if pathtracing {
666            camera.remove_with_requires::<Pathtracer>();
667            camera.insert(SolariLighting::default());
668        } else {
669            camera.remove_with_requires::<SolariLighting>();
670            camera.insert(Pathtracer::default());
671
672            #[cfg(all(feature = "dlss", not(feature = "force_disable_dlss")))]
673            camera.remove::<(Dlss<DlssRayReconstructionFeature>, TemporalJitter, MipBias)>();
674        }
675    }
676}
677
678fn reset_pathtracer(state: Res<DemoState>, pathtracer: Option<Single<&mut Pathtracer>>) {
679    if let Some(mut pathtracer) = pathtracer
680        && state.is_changed()
681    {
682        pathtracer.reset = true;
683    }
684}
685
686fn select_preset(
687    key_input: Res<ButtonInput<KeyCode>>,
688    slider: Single<Entity, With<RoughnessSlider>>,
689    test_material: Res<TestMaterial>,
690    mut materials: ResMut<Assets<StandardMaterial>>,
691    mut commands: Commands,
692) {
693    for (key, _, roughness) in MATERIAL_PRESETS {
694        if key_input.just_pressed(key) {
695            materials
696                .get_mut(&test_material.0)
697                .unwrap()
698                .perceptual_roughness = roughness;
699
700            commands.entity(*slider).insert(SliderValue(roughness));
701        }
702    }
703}
examples/window/clear_color.rs (line 21)
20fn change_clear_color(input: Res<ButtonInput<KeyCode>>, mut clear_color: ResMut<ClearColor>) {
21    if input.just_pressed(KeyCode::Space) {
22        clear_color.0 = PURPLE.into();
23    }
24}
examples/showcase/alien_cake_addict.rs (line 386)
382fn game_over_keyboard(
383    mut next_state: ResMut<NextState<GameState>>,
384    keyboard_input: Res<ButtonInput<KeyCode>>,
385) {
386    if keyboard_input.just_pressed(KeyCode::Space) {
387        next_state.set(GameState::Playing);
388    }
389}
examples/3d/solari.rs (line 481)
477fn toggle_restir(
478    key_input: Res<ButtonInput<KeyCode>>,
479    mut solari_lighting: Single<&mut SolariLighting>,
480) {
481    if key_input.just_pressed(KeyCode::KeyR) {
482        solari_lighting.restir = !solari_lighting.restir;
483    }
484}
485
486fn pause_scene(mut time: ResMut<Time<Virtual>>, key_input: Res<ButtonInput<KeyCode>>) {
487    if key_input.just_pressed(KeyCode::Space) {
488        time.toggle();
489    }
490}
491
492#[derive(Resource)]
493struct RobotLightMaterial(Handle<StandardMaterial>);
494
495fn toggle_lights(
496    key_input: Res<ButtonInput<KeyCode>>,
497    robot_light_material: Option<Res<RobotLightMaterial>>,
498    mut materials: ResMut<Assets<StandardMaterial>>,
499    directional_light: Query<Entity, With<DirectionalLight>>,
500    mut commands: Commands,
501) {
502    if key_input.just_pressed(KeyCode::Digit1) {
503        if let Ok(directional_light) = directional_light.single() {
504            commands.entity(directional_light).despawn();
505        } else {
506            commands.spawn((
507                DirectionalLight {
508                    illuminance: light_consts::lux::FULL_DAYLIGHT,
509                    shadow_maps_enabled: false, // Solari replaces shadow mapping
510                    ..default()
511                },
512                Transform::from_rotation(Quat::from_xyzw(
513                    -0.13334629,
514                    -0.86597735,
515                    -0.3586996,
516                    0.3219264,
517                )),
518            ));
519        }
520    }
521
522    if key_input.just_pressed(KeyCode::Digit2)
523        && let Some(robot_light_material) = robot_light_material
524    {
525        let mut material = materials.get_mut(&robot_light_material.0).unwrap();
526        if material.emissive == LinearRgba::BLACK {
527            material.emissive = LinearRgba::from(Color::srgb(0.941, 0.714, 0.043)) * 1_000_000.0;
528        } else {
529            material.emissive = LinearRgba::BLACK;
530        }
531    }
532}
examples/3d/3d_shapes.rs (line 265)
261fn toggle_wireframe(
262    mut wireframe_config: ResMut<WireframeConfig>,
263    keyboard: Res<ButtonInput<KeyCode>>,
264) {
265    if keyboard.just_pressed(KeyCode::Space) {
266        wireframe_config.global = !wireframe_config.global;
267    }
268}
Source

pub fn any_just_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool

Returns true if any item in inputs has been pressed during the current frame.

Source

pub fn clear_just_pressed(&mut self, input: T) -> bool

Clears the just_pressed state of the input and returns true if the input has just been pressed.

Future calls to ButtonInput::just_pressed for the given input will return false until a new press event occurs.

Source

pub fn just_released(&self, input: T) -> bool

Returns true if the input has been released during the current frame.

Note: This function does not imply information regarding the current state of ButtonInput::pressed or ButtonInput::just_pressed.

Examples found in repository?
examples/input/mouse_input.rs (line 25)
16fn mouse_click_system(mouse_button_input: Res<ButtonInput<MouseButton>>) {
17    if mouse_button_input.pressed(MouseButton::Left) {
18        info!("left mouse currently pressed");
19    }
20
21    if mouse_button_input.just_pressed(MouseButton::Left) {
22        info!("left mouse just pressed");
23    }
24
25    if mouse_button_input.just_released(MouseButton::Left) {
26        info!("left mouse just released");
27    }
28}
More examples
Hide additional examples
examples/stress_tests/bevymark_3d.rs (line 314)
299fn mouse_handler(
300    mut commands: Commands,
301    args: Res<Args>,
302    time: Res<Time>,
303    mouse_button_input: Res<ButtonInput<MouseButton>>,
304    cube_resources: ResMut<CubeResources>,
305    mut counter: ResMut<BevyCounter>,
306    mut rng: Local<Option<ChaCha8Rng>>,
307    mut wave: Local<usize>,
308) {
309    if rng.is_none() {
310        *rng = Some(ChaCha8Rng::seed_from_u64(42));
311    }
312    let rng = rng.as_mut().unwrap();
313
314    if mouse_button_input.just_released(MouseButton::Left) {
315        counter.color = Color::linear_rgb(rng.random(), rng.random(), rng.random());
316    }
317
318    if mouse_button_input.pressed(MouseButton::Left) {
319        let spawn_count = (CUBES_PER_SECOND as f64 * time.delta_secs_f64()) as usize;
320        spawn_cubes(
321            &mut commands,
322            args.into_inner(),
323            &mut counter,
324            spawn_count,
325            cube_resources.into_inner(),
326            None,
327            *wave,
328        );
329        *wave += 1;
330    }
331}
examples/input/keyboard_input.rs (line 26)
13fn keyboard_input_system(
14    keyboard_input: Res<ButtonInput<KeyCode>>,
15    key_input: Res<ButtonInput<Key>>,
16) {
17    // KeyCode is used when you want the key location across different keyboard layouts
18    // See https://w3c.github.io/uievents-code/#code-value-tables for the locations
19    if keyboard_input.pressed(KeyCode::KeyA) {
20        info!("'A' currently pressed");
21    }
22
23    if keyboard_input.just_pressed(KeyCode::KeyA) {
24        info!("'A' just pressed");
25    }
26    if keyboard_input.just_released(KeyCode::KeyA) {
27        info!("'A' just released");
28    }
29
30    // Key is used when you want a specific key, no matter where it is located.
31    // This is useful for symbols that have a specific connotation, e.g. '?' for
32    // a help menu or '+'/'-' for zoom
33    let key = Key::Character("?".into());
34    if key_input.pressed(key.clone()) {
35        info!("'?' currently pressed");
36    }
37    if key_input.just_pressed(key.clone()) {
38        info!("'?' just pressed");
39    }
40    if key_input.just_released(key) {
41        info!("'?' just released");
42    }
43}
examples/dev_tools/fps_overlay.rs (line 100)
74fn customize_config(input: Res<ButtonInput<KeyCode>>, mut overlay: ResMut<FpsOverlayConfig>) {
75    if input.just_pressed(KeyCode::Digit1) {
76        // Changing resource will affect overlay
77        if overlay.text_color == OverlayColor::GREEN {
78            overlay.text_color = OverlayColor::RED;
79        } else {
80            overlay.text_color = OverlayColor::GREEN;
81        }
82    }
83
84    // The font size only adjustable when using `Px` units
85    if let FontSize::Px(mut px_font_size) = overlay.text_config.font_size {
86        if input.just_pressed(KeyCode::Digit2) {
87            px_font_size = (px_font_size - 2.).max(2.);
88        }
89        if input.just_pressed(KeyCode::Digit3) {
90            px_font_size += 2.;
91        }
92        if FontSize::Px(px_font_size) != overlay.text_config.font_size {
93            overlay.text_config.font_size = FontSize::Px(px_font_size);
94        }
95    }
96
97    if input.just_pressed(KeyCode::Digit4) {
98        overlay.enabled = !overlay.enabled;
99    }
100    if input.just_released(KeyCode::Digit5) {
101        overlay.frame_time_graph_config.enabled = !overlay.frame_time_graph_config.enabled;
102    }
103}
examples/stress_tests/bevymark.rs (line 343)
321fn mouse_handler(
322    mut commands: Commands,
323    args: Res<Args>,
324    time: Res<Time>,
325    mouse_button_input: Res<ButtonInput<MouseButton>>,
326    window: Query<&Window>,
327    bird_resources: ResMut<BirdResources>,
328    mut counter: ResMut<BevyCounter>,
329    mut rng: Local<Option<ChaCha8Rng>>,
330    mut wave: Local<usize>,
331) {
332    let Ok(window) = window.single() else {
333        return;
334    };
335
336    if rng.is_none() {
337        // We're seeding the PRNG here to make this example deterministic for testing purposes.
338        // This isn't strictly required in practical use unless you need your app to be deterministic.
339        *rng = Some(ChaCha8Rng::seed_from_u64(500));
340    }
341    let rng = rng.as_mut().unwrap();
342
343    if mouse_button_input.just_released(MouseButton::Left) {
344        counter.color = Color::linear_rgb(rng.random(), rng.random(), rng.random());
345    }
346
347    if mouse_button_input.pressed(MouseButton::Left) {
348        let spawn_count = (BIRDS_PER_SECOND as f64 * time.delta_secs_f64()) as usize;
349        spawn_birds(
350            &mut commands,
351            args.into_inner(),
352            &window.resolution,
353            &mut counter,
354            spawn_count,
355            bird_resources.into_inner(),
356            None,
357            *wave,
358        );
359        *wave += 1;
360    }
361}
Source

pub fn any_just_released(&self, inputs: impl IntoIterator<Item = T>) -> bool

Returns true if any item in inputs has just been released.

Examples found in repository?
examples/camera/pan_orbit_camera_custom_input_plugin.rs (line 97)
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}
Source

pub fn all_just_released(&self, inputs: impl IntoIterator<Item = T>) -> bool

Returns true if all items in inputs have just been released.

Source

pub fn all_just_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool

Returns true if all items in inputs have been just pressed.

Source

pub fn clear_just_released(&mut self, input: T) -> bool

Clears the just_released state of the input and returns true if the input has just been released.

Future calls to ButtonInput::just_released for the given input will return false until a new release event occurs.

Source

pub fn reset(&mut self, input: T)

Clears the pressed, just_pressed and just_released data of the input.

Source

pub fn reset_all(&mut self)

Clears the pressed, just_pressed, and just_released data for every input.

See also ButtonInput::clear for simulating elapsed time steps.

Source

pub fn clear(&mut self)

Clears the just pressed and just released data for every input.

See also ButtonInput::reset_all for a full reset.

Source

pub fn get_pressed(&self) -> impl ExactSizeIterator

An iterator visiting every pressed input in arbitrary order.

Source

pub fn get_just_pressed(&self) -> impl ExactSizeIterator

An iterator visiting every just pressed input in arbitrary order.

Note: Returned elements do not imply information regarding the current state of ButtonInput::pressed or ButtonInput::just_released.

Examples found in repository?
examples/ecs/component_hooks.rs (line 146)
136fn trigger_hooks(
137    mut commands: Commands,
138    keys: Res<ButtonInput<KeyCode>>,
139    index: Res<MyComponentIndex>,
140) {
141    for (key, entity) in index.iter() {
142        if !keys.pressed(*key) {
143            commands.entity(*entity).remove::<MyComponent>();
144        }
145    }
146    for key in keys.get_just_pressed() {
147        commands.spawn(MyComponent(*key));
148    }
149}
Source

pub fn get_just_released(&self) -> impl ExactSizeIterator

An iterator visiting every just released input in arbitrary order.

Note: Returned elements do not imply information regarding the current state of ButtonInput::pressed or ButtonInput::just_pressed.

Trait Implementations§

Source§

impl<T> Clone for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static,

Source§

fn clone(&self) -> ButtonInput<T>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<T> Component for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static, ButtonInput<T>: Send + Sync + 'static,

Source§

const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::SparseSet

A constant indicating the storage type used for this component.
Source§

type Mutability = Mutable

A marker type to assist Bevy with determining if this component is mutable, or immutable. Mutable components will have Component<Mutability = Mutable>, while immutable components will instead have Component<Mutability = Immutable>. Read more
Source§

fn register_required_components( _requiree: ComponentId, required_components: &mut RequiredComponentsRegistrator<'_, '_>, )

Registers required components. Read more
Source§

fn clone_behavior() -> ComponentCloneBehavior

Called when registering this component, allowing to override clone function (or disable cloning altogether) for this component. Read more
Source§

fn relationship_accessor() -> Option<ComponentRelationshipAccessor<ButtonInput<T>>>

Returns ComponentRelationshipAccessor required for working with relationships in dynamic contexts. Read more
Source§

fn on_add() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>

Gets the on_add ComponentHook for this Component if one is defined.
Source§

fn on_insert() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>

Gets the on_insert ComponentHook for this Component if one is defined.
Source§

fn on_discard() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>

Gets the on_discard ComponentHook for this Component if one is defined.
Source§

fn on_remove() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>

Gets the on_remove ComponentHook for this Component if one is defined.
Source§

fn on_despawn() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>

Gets the on_despawn ComponentHook for this Component if one is defined.
Source§

fn map_entities<E>(_this: &mut Self, _mapper: &mut E)
where E: EntityMapper,

Maps the entities on this component using the given EntityMapper. This is used to remap entities in contexts like scenes and entity cloning. When deriving Component, this is populated by annotating fields containing entities with #[entities] Read more
Source§

const HAS_SUMMARY_TICK: bool = false

Set this constant to true if the component should track a summary tick. Read more
Source§

impl<T> Debug for ButtonInput<T>
where T: Debug + Clone + Eq + Hash + Send + Sync + 'static,

Source§

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

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

impl<T> Default for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static,

Source§

fn default() -> ButtonInput<T>

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

impl<T> FromArg for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static + TypePath, ButtonInput<T>: Any + Send + Sync, HashSet<T>: FromReflect + TypePath + MaybeTyped + RegisterForReflection,

Source§

type This<'from_arg> = ButtonInput<T>

The type to convert into. Read more
Source§

fn from_arg( arg: Arg<'_>, ) -> Result<<ButtonInput<T> as FromArg>::This<'_>, ArgError>

Creates an item from an argument. Read more
Source§

impl<T> FromReflect for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static + TypePath, ButtonInput<T>: Any + Send + Sync, HashSet<T>: FromReflect + TypePath + MaybeTyped + RegisterForReflection,

Source§

fn from_reflect( reflect: &(dyn PartialReflect + 'static), ) -> Option<ButtonInput<T>>

Constructs a concrete instance of Self from a reflected value.
Source§

fn take_from_reflect( reflect: Box<dyn PartialReflect>, ) -> Result<Self, Box<dyn PartialReflect>>

Attempts to downcast the given value to Self using, constructing the value using from_reflect if that fails. Read more
Source§

impl<T> GetOwnership for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static + TypePath, ButtonInput<T>: Any + Send + Sync, HashSet<T>: FromReflect + TypePath + MaybeTyped + RegisterForReflection,

Source§

fn ownership() -> Ownership

Returns the ownership of Self.
Source§

impl<T> GetTypeRegistration for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static + TypePath, ButtonInput<T>: Any + Send + Sync, HashSet<T>: FromReflect + TypePath + MaybeTyped + RegisterForReflection,

Source§

fn get_type_registration() -> TypeRegistration

Returns the default TypeRegistration for this type.
Source§

fn register_type_dependencies(registry: &mut TypeRegistry)

Registers other types needed by this type. Read more
Source§

impl<T> IntoReturn for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static + TypePath, ButtonInput<T>: Any + Send + Sync, HashSet<T>: FromReflect + TypePath + MaybeTyped + RegisterForReflection,

Source§

fn into_return<'into_return>(self) -> Return<'into_return>
where ButtonInput<T>: 'into_return,

Converts Self into a Return value.
Source§

impl<T> PartialReflect for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static + TypePath, ButtonInput<T>: Any + Send + Sync, HashSet<T>: FromReflect + TypePath + MaybeTyped + RegisterForReflection,

Source§

fn get_represented_type_info(&self) -> Option<&'static TypeInfo>

Returns the TypeInfo of the type represented by this value. Read more
Source§

fn try_apply( &mut self, value: &(dyn PartialReflect + 'static), ) -> Result<(), ApplyError>

Tries to apply a reflected value to this value. Read more
Source§

fn reflect_kind(&self) -> ReflectKind

Returns a zero-sized enumeration of “kinds” of type. Read more
Source§

fn reflect_ref(&self) -> ReflectRef<'_>

Returns an immutable enumeration of “kinds” of type. Read more
Source§

fn reflect_mut(&mut self) -> ReflectMut<'_>

Returns a mutable enumeration of “kinds” of type. Read more
Source§

fn reflect_owned(self: Box<ButtonInput<T>>) -> ReflectOwned

Returns an owned enumeration of “kinds” of type. Read more
Source§

fn try_into_reflect( self: Box<ButtonInput<T>>, ) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>

Attempts to cast this type to a boxed, fully-reflected value.
Source§

fn try_as_reflect(&self) -> Option<&(dyn Reflect + 'static)>

Attempts to cast this type to a fully-reflected value.
Source§

fn try_as_reflect_mut(&mut self) -> Option<&mut (dyn Reflect + 'static)>

Attempts to cast this type to a mutable, fully-reflected value.
Source§

fn into_partial_reflect(self: Box<ButtonInput<T>>) -> Box<dyn PartialReflect>

Casts this type to a boxed, reflected value. Read more
Source§

fn as_partial_reflect(&self) -> &(dyn PartialReflect + 'static)

Casts this type to a reflected value. Read more
Source§

fn as_partial_reflect_mut(&mut self) -> &mut (dyn PartialReflect + 'static)

Casts this type to a mutable, reflected value. Read more
Source§

fn reflect_partial_eq( &self, value: &(dyn PartialReflect + 'static), ) -> Option<bool>

Returns a “partial equality” comparison result. Read more
Source§

fn reflect_partial_cmp( &self, value: &(dyn PartialReflect + 'static), ) -> Option<Ordering>

Returns a “partial comparison” result. Read more
Source§

fn reflect_clone(&self) -> Result<Box<dyn Reflect>, ReflectCloneError>

Attempts to clone Self using reflection. Read more
Source§

fn apply(&mut self, value: &(dyn PartialReflect + 'static))

Applies a reflected value to this value. Read more
Source§

fn to_dynamic(&self) -> Result<Box<dyn PartialReflect>, ReflectCloneError>

Converts this reflected value into its dynamic representation based on its kind. Read more
Source§

fn reflect_clone_and_take<T>(&self) -> Result<T, ReflectCloneError>
where T: 'static, Self: Sized + TypePath,

For a type implementing PartialReflect, combines reflect_clone and take in a useful fashion, automatically constructing an appropriate ReflectCloneError if the downcast fails.
Source§

fn reflect_hash(&self) -> Option<u64>

Returns a hash of the value (which includes the type). Read more
Source§

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

Debug formatter for the value. Read more
Source§

fn is_dynamic(&self) -> bool

Indicates whether or not this type is a dynamic type. Read more
Source§

impl<T> Reflect for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static + TypePath, ButtonInput<T>: Any + Send + Sync, HashSet<T>: FromReflect + TypePath + MaybeTyped + RegisterForReflection,

Source§

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

Returns the value as a Box<dyn Any>. Read more
Source§

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

Returns the value as a &dyn Any. Read more
Source§

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

Returns the value as a &mut dyn Any. Read more
Source§

fn into_reflect(self: Box<ButtonInput<T>>) -> Box<dyn Reflect>

Casts this type to a boxed, fully-reflected value.
Source§

fn as_reflect(&self) -> &(dyn Reflect + 'static)

Casts this type to a fully-reflected value.
Source§

fn as_reflect_mut(&mut self) -> &mut (dyn Reflect + 'static)

Casts this type to a mutable, fully-reflected value.
Source§

fn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>>

Performs a type-checked assignment of a reflected value to this value. Read more
Source§

impl<T> Resource for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static, ButtonInput<T>: Send + Sync + 'static,

Source§

impl<T> Struct for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static + TypePath, ButtonInput<T>: Any + Send + Sync, HashSet<T>: FromReflect + TypePath + MaybeTyped + RegisterForReflection,

Source§

fn field(&self, name: &str) -> Option<&(dyn PartialReflect + 'static)>

Gets a reference to the value of the field named name as a &dyn PartialReflect.
Source§

fn field_mut( &mut self, name: &str, ) -> Option<&mut (dyn PartialReflect + 'static)>

Gets a mutable reference to the value of the field named name as a &mut dyn PartialReflect.
Source§

fn field_at(&self, index: usize) -> Option<&(dyn PartialReflect + 'static)>

Gets a reference to the value of the field with index index as a &dyn PartialReflect.
Source§

fn field_at_mut( &mut self, index: usize, ) -> Option<&mut (dyn PartialReflect + 'static)>

Gets a mutable reference to the value of the field with index index as a &mut dyn PartialReflect.
Source§

fn name_at(&self, index: usize) -> Option<&str>

Gets the name of the field with index index.
Source§

fn index_of_name(&self, name: &str) -> Option<usize>

Gets the index of the field with the given name.
Source§

fn field_len(&self) -> usize

Returns the number of fields in the struct.
Source§

fn iter_fields(&self) -> FieldIter<'_> ⓘ

Returns an iterator over the values of the reflectable fields for this struct.
Source§

fn to_dynamic_struct(&self) -> Result<DynamicStruct, ReflectCloneError>

Creates a new DynamicStruct from this struct. Read more
Source§

fn get_represented_struct_info(&self) -> Option<&'static StructInfo>

Will return None if TypeInfo is not available.
Source§

impl<T> TypePath for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static + TypePath, ButtonInput<T>: Any + Send + Sync,

Source§

fn type_path() -> &'static str

Returns the fully qualified path of the underlying type. Read more
Source§

fn short_type_path() -> &'static str

Returns a short, pretty-print enabled path to the type. Read more
Source§

fn type_ident() -> Option<&'static str>

Returns the name of the type, or None if it is anonymous. Read more
Source§

fn crate_name() -> Option<&'static str>

Returns the name of the crate the type is in, or None if it is anonymous. Read more
Source§

fn module_path() -> Option<&'static str>

Returns the path to the module the type is in, or None if it is anonymous. Read more
Source§

impl<T> Typed for ButtonInput<T>
where T: Clone + Eq + Hash + Send + Sync + 'static + TypePath, ButtonInput<T>: Any + Send + Sync, HashSet<T>: FromReflect + TypePath + MaybeTyped + RegisterForReflection,

Source§

fn type_info() -> &'static TypeInfo

Returns the compile-time info for the underlying type.

Auto Trait Implementations§

§

impl<T> Freeze for ButtonInput<T>
where HashSet<T>: Freeze,

§

impl<T> RefUnwindSafe for ButtonInput<T>

§

impl<T> Send for ButtonInput<T>
where HashSet<T>: Send,

§

impl<T> Sync for ButtonInput<T>
where HashSet<T>: Sync,

§

impl<T> Unpin for ButtonInput<T>
where HashSet<T>: Unpin,

§

impl<T> UnsafeUnpin for ButtonInput<T>
where HashSet<T>: UnsafeUnpin,

§

impl<T> UnwindSafe for ButtonInput<T>
where HashSet<T>: UnwindSafe,

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<C> Bundle for C
where C: Component,

Source§

fn component_ids( components: &mut ComponentsRegistrator<'_>, ) -> impl Iterator<Item = ComponentId> + use<C>

Source§

fn get_component_ids( components: &Components, ) -> impl Iterator<Item = Option<ComponentId>>

Returns an iterator over this Bundle’s component ids. This will be None if the component has not been registered.
Source§

impl<C> BundleFromComponents for C
where C: Component,

Source§

unsafe fn from_components<T, F>(ctx: &mut T, func: &mut F) -> C
where F: for<'a> FnMut(&'a mut T) -> OwningPtr<'a>, C: Sized,

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> 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> 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<C> DynamicBundle for C
where C: Component,

Source§

type Effect = ()

An operation on the entity that happens after inserting this bundle.
Source§

unsafe fn get_components( ptr: MovingPtr<'_, C>, func: &mut impl FnMut(StorageType, OwningPtr<'_>), ) -> <C as DynamicBundle>::Effect

Moves the components out of the bundle. Read more
Source§

unsafe fn apply_effect( _ptr: MovingPtr<'_, MaybeUninit<C>>, _entity: &mut EntityWorldMut<'_>, )

Applies the after-effects of spawning this bundle. Read more
Source§

impl<T> DynamicTypePath for T
where T: TypePath,

Source§

impl<T> DynamicTyped for T
where T: Typed,

Source§

impl<T> ErasedBundleTemplate for T
where T: Template + Send + Sync + 'static, <T as Template>::Output: Bundle,

Source§

unsafe fn apply( &self, context: &mut TemplateContext<'_, '_>, ) -> Result<(), BevyError>

Applies this template to the given entity. Read more
Source§

fn clone_template(&self) -> Box<dyn ErasedBundleTemplate>

Clones this template. See Clone.
Source§

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

Source§

impl<T> ErasedTemplate for T
where T: Template + Send + Sync + 'static, <T as Template>::Output: SceneEffect,

Source§

unsafe fn apply( &self, context: &mut TemplateContext<'_, '_>, bundle_writer: &mut BundleWriter<'_>, ) -> Result<(), BevyError>

Applies this template to the given entity. Read more
Source§

fn clone_template(&self) -> Box<dyn ErasedTemplate>

Clones this template. See Clone.
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> FromTemplate for T
where T: Clone + Default + Unpin,

Source§

type Template = T

The Template for this type.
Source§

impl<T> FromWorld for T
where T: Default,

Source§

fn from_world(_world: &mut World) -> T

Creates Self using default().

Source§

impl<S> GetField for S
where S: Struct,

Source§

fn get_field<T>(&self, name: &str) -> Option<&T>
where T: Reflect,

Gets a reference to the value of the field named name, downcast to T.
Source§

fn get_field_mut<T>(&mut self, name: &str) -> Option<&mut T>
where T: Reflect,

Gets a mutable reference to the value of the field named name, downcast to T.
Source§

impl<T> GetPath for T
where T: Reflect + ?Sized,

Source§

fn reflect_path<'p>( &self, path: impl ReflectPath<'p>, ) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>

Returns a reference to the value specified by path. Read more
Source§

fn reflect_path_mut<'p>( &mut self, path: impl ReflectPath<'p>, ) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>

Returns a mutable reference to the value specified by path. Read more
Source§

fn path<'p, T>( &self, path: impl ReflectPath<'p>, ) -> Result<&T, ReflectPathError<'p>>
where T: Reflect,

Returns a statically typed reference to the value specified by path. Read more
Source§

fn path_mut<'p, T>( &mut self, path: impl ReflectPath<'p>, ) -> Result<&mut T, ReflectPathError<'p>>
where T: Reflect,

Returns a statically typed mutable reference to the value specified by path. Read more
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> NoneValue for T
where T: Default,

Source§

type NoneType = T

Source§

fn null_value() -> T

The none-equivalent value.
Source§

impl<G> PatchFromTemplate for G
where G: FromTemplate,

Source§

type Template = <G as FromTemplate>::Template

The Template that will be patched.
Source§

fn patch<F>(func: F) -> TemplatePatch<F, <G as PatchFromTemplate>::Template>
where F: FnOnce(&mut <G as PatchFromTemplate>::Template, &mut ResolveContext<'_>),

Takes a “patch function” func, and turns it into a TemplatePatch.
Source§

impl<T> PatchTemplate for T
where T: Template,

Source§

fn patch_template<F>(func: F) -> TemplatePatch<F, T>
where F: FnOnce(&mut T, &mut ResolveContext<'_>),

Takes a “patch function” func that patches this Template, and turns it into a TemplatePatch.
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<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

Source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
Source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
Source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
Source§

impl<T> Reflectable for T

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<C> SceneEffect for C
where C: Component,

Source§

fn apply( self, context: &mut TemplateContext<'_, '_>, bundle_writer: &mut BundleWriter<'_>, )

Applies the scene effect to the current context.
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> Template for T
where T: Clone + Unpin,

Source§

type Output = T

The type of value produced by this Template.
Source§

fn build_template( &self, _context: &mut TemplateContext<'_, '_>, ) -> Result<<T as Template>::Output, BevyError>

Uses this template and the given entity context to produce a Template::Output.
Source§

fn clone_template(&self) -> T

Clones this template. See Clone.
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, 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<T> TypeData for T
where T: 'static + Send + Sync + Clone,

Source§

fn clone_type_data(&self) -> Box<dyn TypeData>

Creates a type-erased clone of self.
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