bevyhub_core/render/
screenshot.rs

1use bevy::input::keyboard::KeyboardInput;
2use bevy::prelude::*;
3use bevy::render::view::screenshot::save_to_disk;
4use bevy::render::view::screenshot::Screenshot;
5use serde::Deserialize;
6use serde::Serialize;
7
8#[derive(Debug, Clone, Serialize, Deserialize, Event, Reflect)]
9pub struct SaveScreenshot {
10	pub filename: String,
11}
12
13
14pub fn screenshot_on_event(
15	trigger: Trigger<SaveScreenshot>,
16	mut commands: Commands,
17) {
18	let filename = trigger.event().filename.clone();
19	log::info!("Saved screenshot to {}", filename);
20	commands
21		.spawn(Screenshot::primary_window())
22		.observe(save_to_disk(filename));
23}
24
25/// Take a screenshot when ctrl+s is pressed
26pub fn screenshot_on_keypress(
27	mut commands: Commands,
28	// _trigger: Trigger<KeyboardInput>,
29	mut events: EventReader<KeyboardInput>,
30	keys: Res<ButtonInput<KeyCode>>,
31	mut counter: Local<u32>,
32) {
33	if events.read().count() == 0 {
34		return;
35	}
36	if keys.any_pressed([KeyCode::ControlRight, KeyCode::ControlLeft])
37		&& keys.just_pressed(KeyCode::KeyS)
38	{
39		#[cfg(not(target_arch = "wasm32"))]
40		std::fs::create_dir_all("target/screenshots").ok();
41		#[cfg(not(target_arch = "wasm32"))]
42		let path = format!("target/screenshots/screenshot-{}.png", *counter);
43		#[cfg(target_arch = "wasm32")]
44		let path = format!("screenshot-{}.png", *counter);
45		*counter += 1;
46		log::info!("Saved screenshot to {}", path);
47		commands
48			.spawn(Screenshot::primary_window())
49			.observe(save_to_disk(path));
50	}
51}