Rusty file dialogs for Windows, Linux (GTK), MacOS And WASM32.
Why RFD?
- It uses 100% native API on all platforms, it does not spawn any processes in the background.
- It supports async/await syntax
- And if one day you decide to port your program to browser, WASM support is there for you!
Example
// Sync Dialog
let files = new
.add_filter
.add_filter
.set_directory
.pick_file;
// Async Dialog
let file = new
.add_filter
.add_filter
.set_directory
.pick_file
.await;
let data = file.read.await;
State
| API Stability |
|---|
| 🚧 |
| Feature | Linux | Windows | MacOS [1] | Wasm32 |
|---|---|---|---|---|
| SingleFile | ✔ | ✔ | ✔ | ✔ |
| MultipleFile | ✔ | ✔ | ✔ | ✔ |
| PickFolder | ✔ | ✔ | ✔ | ✖ |
| SaveFile | ✔ | ✔ | ✔ | ✖ |
| Filters | ✔ | ✔ | ✔ | ✔ |
| StartingPath | ✔ | ✔ | ✔ | ✖ |
| Async | ✔ | ✔ | ✔ | ✔ |
[1] Macos Sync dialog freezes when used with winit (same way as nfd) Caused by winit #1779
Diference bettwen MacOS Windowed App and MacOS NonWindowed App
- Macos async dialog requires an started
NSApplicationinstance, so dialog is truly async only when opened in windowed env likewinit,SDL2, etc. otherwise it will fallback to sync dialog. - It is also recomended to spawn dialogs on main thread, RFD can run dialogs from any thread but it is only possible in windowed app and it adds a lite bit of overhead. So it is recomended to: spawn on main and await in other thread
- NonWindowed apps will never be able to spawn dialogs from threads diferent than main
- NonWindowed apps will never be able to spawn async dialogs
rfd-extras
AKA features that are not file related
| Feature | Linux | Windows | MacOS | Wasm32 |
|---|---|---|---|---|
| MessageDialog | ✔ | ✔ | ✔ | ✔ |
| PromptDialog | ||||
| ColorPicker |