bevy_file_dialog

Crates.iobevy_file_dialog
lib.rsbevy_file_dialog
version0.6.0
sourcesrc
created_at2023-11-24 21:52:02.424322
updated_at2024-07-14 15:41:12.446674
descriptionFile system dialogs for loading and saving files using the Bevy game engine
homepagehttps://github.com/richardhozak/bevy_file_dialog
repositoryhttps://github.com/richardhozak/bevy_file_dialog
max_upload_size
id1047819
size167,806
Richard Hozák (richardhozak)

documentation

README

bevy_file_dialog

crates.io docs.rs

A plugin for loading and saving files using system dialogs for the Bevy game engine.

Usage

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");
    }
}

File dialogs on Linux and BSDs

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
Commit count: 5

cargo fmt