Crates.io | bevy_file_dialog |
lib.rs | bevy_file_dialog |
version | 0.6.0 |
source | src |
created_at | 2023-11-24 21:52:02.424322 |
updated_at | 2024-07-14 15:41:12.446674 |
description | File system dialogs for loading and saving files using the Bevy game engine |
homepage | https://github.com/richardhozak/bevy_file_dialog |
repository | https://github.com/richardhozak/bevy_file_dialog |
max_upload_size | |
id | 1047819 |
size | 167,806 |
A plugin for loading and saving files using system dialogs for the Bevy game engine.
See usage below for loading and saving and the examples for separate load/save dialogs. This example is also present in examples and you can run it with cargo run --example save_and_load
.
use bevy::prelude::*;
use bevy_file_dialog::prelude::*;
struct TextFileContents;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
// Add the file dialog plugin
.add_plugins(
FileDialogPlugin::new()
// allow saving of files marked with TextFileContents
.with_save_file::<TextFileContents>()
// allow loading of files marked with TextFileContents
.with_load_file::<TextFileContents>(),
)
.add_systems(Startup, setup)
.add_systems(
Update,
(
dialog,
file_loaded,
file_saved,
file_load_canceled,
file_save_canceled,
),
)
.run();
}
fn setup(mut commands: Commands) {
commands.spawn(Camera2dBundle::default());
}
fn dialog(mut commands: Commands, keys: Res<ButtonInput<KeyCode>>) {
// Ctrl+S - save file
// Ctrl+O - load file
if keys.any_pressed([KeyCode::ControlLeft, KeyCode::ControlRight]) {
if keys.just_pressed(KeyCode::S) {
// save contents to selected file
commands
.dialog()
.add_filter("Text", &["txt"])
.set_file_name("hello.txt")
.save_file::<TextFileContents>(b"hello".to_vec());
} else if keys.just_pressed(KeyCode::O) {
// read contents from selected file
commands
.dialog()
.add_filter("Text", &["txt"])
.load_file::<TextFileContents>();
}
}
}
fn file_loaded(mut ev_loaded: EventReader<DialogFileLoaded<TextFileContents>>) {
for ev in ev_loaded.read() {
eprintln!(
"Loaded file {} with contents '{}'",
ev.file_name,
std::str::from_utf8(&ev.contents).unwrap()
);
}
}
fn file_load_canceled(mut ev_canceled: EventReader<DialogFileLoadCanceled<TextFileContents>>) {
for _ in ev_canceled.read() {
eprintln!("Text file content load canceled");
}
}
fn file_saved(mut ev_saved: EventReader<DialogFileSaved<TextFileContents>>) {
for ev in ev_saved.read() {
match ev.result {
Ok(_) => eprintln!("File {} successfully saved", ev.file_name),
Err(ref err) => eprintln!("Failed to save {}: {}", ev.file_name, err),
}
}
}
fn file_save_canceled(mut ev_canceled: EventReader<DialogFileSaveCanceled<TextFileContents>>) {
for _ in ev_canceled.read() {
eprintln!("Text file content save canceled");
}
}
You can use one of the two backends on linux to create file dialogs that is specified with features, either gtk3
or xdg-portal
. By default bevy_file_dialog
uses the default provided by rfd
which is xdg-portal
. You can change this by specifying the correct features in your Cargo.toml
:
bevy_file_dialog = { version = "*", default-features = false, features = ["gtk3"] }
More information in rfd docs, the information there matches bevy_file_dialog
.
bevy | bevy_file_dialog |
---|---|
0.14 | 0.6.0 |
0.13 | 0.4.0 - 0.5.0 |
0.12 | 0.1.0 - 0.3.1 |