From a1cfa56b5de6b5db7f62e555444649d4a236d691 Mon Sep 17 00:00:00 2001 From: Fabien Freling Date: Mon, 22 Apr 2024 14:09:31 +0200 Subject: [PATCH] add rfd for file dialog --- Cargo.lock | 231 +++++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 1 + flake.nix | 3 + src/main.rs | 74 ++++++++--------- 4 files changed, 270 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d294f93..07d6757 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -115,6 +115,18 @@ dependencies = [ "libloading 0.7.4", ] +[[package]] +name = "atk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -211,6 +223,16 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "libc", + "system-deps", +] + [[package]] name = "calloop" version = "0.12.4" @@ -253,6 +275,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -529,6 +561,7 @@ name = "doggo" version = "0.1.0" dependencies = [ "iced", + "rfd", ] [[package]] @@ -797,6 +830,36 @@ dependencies = [ "slab", ] +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + [[package]] name = "gethostname" version = "0.4.3" @@ -818,6 +881,19 @@ dependencies = [ "wasi", ] +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + [[package]] name = "gl_generator" version = "0.14.0" @@ -835,6 +911,16 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + [[package]] name = "glow" version = "0.13.1" @@ -868,6 +954,17 @@ dependencies = [ "wgpu", ] +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + [[package]] name = "gpu-alloc" version = "0.6.0" @@ -920,6 +1017,24 @@ dependencies = [ "bitflags 2.5.0", ] +[[package]] +name = "gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + [[package]] name = "guillotiere" version = "0.6.2" @@ -965,6 +1080,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -1579,6 +1700,18 @@ dependencies = [ "syn 2.0.58", ] +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + [[package]] name = "parking_lot" version = "0.11.2" @@ -1739,7 +1872,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit", + "toml_edit 0.21.1", ] [[package]] @@ -1860,6 +1993,29 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "rfd" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a73a7337fc24366edfca76ec521f51877b114e42dab584008209cca6719251" +dependencies = [ + "block", + "dispatch", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.48.0", +] + [[package]] name = "roxmltree" version = "0.19.0" @@ -1962,6 +2118,15 @@ dependencies = [ "syn 2.0.58", ] +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -2143,6 +2308,25 @@ dependencies = [ "libc", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" + [[package]] name = "termcolor" version = "1.4.1" @@ -2225,11 +2409,26 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "toml" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.12", +] + [[package]] name = "toml_datetime" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -2239,7 +2438,20 @@ checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ "indexmap", "toml_datetime", - "winnow", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.6", ] [[package]] @@ -2345,6 +2557,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.4" @@ -3009,6 +3227,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" +dependencies = [ + "memchr", +] + [[package]] name = "x11-dl" version = "2.21.0" diff --git a/Cargo.toml b/Cargo.toml index 2870607..4c16502 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,4 @@ edition = "2021" [dependencies] iced = {version = "0.12.1"} +rfd = { version = "0.14.1", default-features = false, features = ["gtk3"] } diff --git a/flake.nix b/flake.nix index 0431eca..ab1ffe3 100644 --- a/flake.nix +++ b/flake.nix @@ -35,6 +35,9 @@ libxkbcommon wayland + + # rfd + gtk3 ]; env = { diff --git a/src/main.rs b/src/main.rs index 681c46f..58b363d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,9 @@ -use iced::{alignment, widget::{button, column, container, row, scrollable, text, text_input, Column}, Element, Length, Padding, Sandbox, Settings}; - +use iced::{ + alignment, + widget::{button, column, container, row, scrollable, text, text_input, Column}, + Element, Length, Padding, Sandbox, Settings, +}; +use rfd::FileDialog; #[derive(Debug, Clone)] enum Message { @@ -7,15 +11,14 @@ enum Message { Submitted, DeleteItem(usize), } - + /** - * This is your model. It contains all the data needed for your application to work properly. - * The model can only be updated with the `update` function. + * This is your model. It contains all the data needed for your application to work properly. + * The model can only be updated with the `update` function. */ struct GroceryList { grocery_items: Vec, input_value: String, - } impl Sandbox for GroceryList { @@ -24,12 +27,8 @@ impl Sandbox for GroceryList { /* Initialize your app */ fn new() -> GroceryList { Self { - grocery_items: vec![ - "Eggs".to_owned(), - "Milk".to_owned(), - "Flour".to_owned() - ], - input_value: String::default() + grocery_items: vec!["Eggs".to_owned(), "Milk".to_owned(), "Flour".to_owned()], + input_value: String::default(), } } @@ -46,11 +45,23 @@ impl Sandbox for GroceryList { Message::Submitted => { let input_value = self.input_value.clone(); self.input_value = String::default(); // Clear the input value - self.grocery_items.push(input_value); + let _file = FileDialog::new() + .set_directory("/home/ffreling/Sync") + .pick_file(); + let file_str = _file.and_then(|p| Some(String::from(p.to_str().unwrap()))); + println!("{:?}", file_str); + match file_str { + None => (), + Some(path_str) => self.grocery_items.push(path_str), + } + // self.grocery_items.push(input_value); } Message::DeleteItem(item) => { + let _files = FileDialog::new() + .set_directory("/home/ffreling/Sync") + .pick_file(); self.grocery_items.remove(item); - }, + } } } @@ -60,16 +71,14 @@ impl Sandbox for GroceryList { items_list_view(&self.grocery_items), row!( text_input("Input grocery item", &self.input_value) - .on_input(|value| Message::InputValue(value)) - .on_submit(Message::Submitted), - - button("Submit") - .on_press(Message::Submitted) + .on_input(|value| Message::InputValue(value)) + .on_submit(Message::Submitted), + button("Submit").on_press(Message::Submitted) ) .spacing(30) .padding(Padding::from(30)) ) - .align_items(iced::Alignment::Center) + .align_items(iced::Alignment::Center), ) .height(Length::Fill) .width(Length::Fill) @@ -81,43 +90,34 @@ impl Sandbox for GroceryList { fn theme(&self) -> iced::Theme { iced::Theme::Dark } - } fn items_list_view(items: &Vec) -> Element<'static, Message> { - let mut column = Column::new() - .spacing(20) - .align_items(iced::Alignment::Center) - .width(Length::Fill); + .spacing(20) + .align_items(iced::Alignment::Center) + .width(Length::Fill); for (index, value) in items.into_iter().enumerate() { column = column.push(grocery_item(index, value)); } - scrollable( - container( - column - ) - ) - .height(250.0) - .width(300) - .into() + scrollable(container(column)) + .height(250.0) + .width(300) + .into() } - fn grocery_item(index: usize, value: &str) -> Element<'static, Message> { row!( text(value), - button("Delete") - .on_press(Message::DeleteItem(index)) + button("Delete").on_press(Message::DeleteItem(index)) ) .align_items(iced::Alignment::Center) .spacing(30) .into() } - pub fn main() -> iced::Result { GroceryList::run(Settings::default()) }