diff options
| author | Polesznyák Márk <contact@pml68.dev> | 2026-01-29 18:27:54 +0100 |
|---|---|---|
| committer | Polesznyák Márk <contact@pml68.dev> | 2026-01-29 18:27:54 +0100 |
| commit | 7dcc3d8eabfba6a7c4cdd36165d55c4d2f48a82c (patch) | |
| tree | f291953090670ef149db37770bdd70578690fb15 | |
| parent | chore: bump MSRV to match iced's (diff) | |
| download | iced-builder-7dcc3d8eabfba6a7c4cdd36165d55c4d2f48a82c.tar.gz | |
feat: set parent window of rfd dialogs
| -rw-r--r-- | Cargo.lock | 92 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/main.rs | 42 | ||||
| -rw-r--r-- | src/types/project.rs | 92 |
4 files changed, 111 insertions, 116 deletions
@@ -627,9 +627,9 @@ checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" [[package]] name = "cc" -version = "1.2.53" +version = "1.2.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932" +checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583" dependencies = [ "find-msvc-tools", "jobserver", @@ -1492,15 +1492,6 @@ dependencies = [ ] [[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1827,7 +1818,7 @@ dependencies = [ [[package]] name = "iced" version = "0.15.0-dev" -source = "git+https://github.com/iced-rs/iced?branch=master#90037336e80f02b817f2f68a5adf877bdb85639a" +source = "git+https://github.com/iced-rs/iced?branch=master#ed36c6e107bb12190c2ac4ed509f803d095bc154" dependencies = [ "iced_core", "iced_debug", @@ -1864,7 +1855,6 @@ version = "0.1.0" dependencies = [ "dirs-next", "embed-resource", - "fxhash", "iced", "iced_anim", "iced_custom_highlighter", @@ -1887,7 +1877,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.15.0-dev" -source = "git+https://github.com/iced-rs/iced?branch=master#90037336e80f02b817f2f68a5adf877bdb85639a" +source = "git+https://github.com/iced-rs/iced?branch=master#ed36c6e107bb12190c2ac4ed509f803d095bc154" dependencies = [ "bitflags 2.10.0", "bytes", @@ -1914,7 +1904,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.15.0-dev" -source = "git+https://github.com/iced-rs/iced?branch=master#90037336e80f02b817f2f68a5adf877bdb85639a" +source = "git+https://github.com/iced-rs/iced?branch=master#ed36c6e107bb12190c2ac4ed509f803d095bc154" dependencies = [ "iced_core", "iced_futures", @@ -1954,7 +1944,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.15.0-dev" -source = "git+https://github.com/iced-rs/iced?branch=master#90037336e80f02b817f2f68a5adf877bdb85639a" +source = "git+https://github.com/iced-rs/iced?branch=master#ed36c6e107bb12190c2ac4ed509f803d095bc154" dependencies = [ "futures", "iced_core", @@ -1968,7 +1958,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.15.0-dev" -source = "git+https://github.com/iced-rs/iced?branch=master#90037336e80f02b817f2f68a5adf877bdb85639a" +source = "git+https://github.com/iced-rs/iced?branch=master#ed36c6e107bb12190c2ac4ed509f803d095bc154" dependencies = [ "bitflags 2.10.0", "bytemuck", @@ -2000,7 +1990,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.15.0-dev" -source = "git+https://github.com/iced-rs/iced?branch=master#90037336e80f02b817f2f68a5adf877bdb85639a" +source = "git+https://github.com/iced-rs/iced?branch=master#ed36c6e107bb12190c2ac4ed509f803d095bc154" dependencies = [ "iced_graphics", "iced_runtime", @@ -2009,7 +1999,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.15.0-dev" -source = "git+https://github.com/iced-rs/iced?branch=master#90037336e80f02b817f2f68a5adf877bdb85639a" +source = "git+https://github.com/iced-rs/iced?branch=master#ed36c6e107bb12190c2ac4ed509f803d095bc154" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -2021,7 +2011,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.15.0-dev" -source = "git+https://github.com/iced-rs/iced?branch=master#90037336e80f02b817f2f68a5adf877bdb85639a" +source = "git+https://github.com/iced-rs/iced?branch=master#ed36c6e107bb12190c2ac4ed509f803d095bc154" dependencies = [ "bytes", "iced_core", @@ -2033,7 +2023,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.15.0-dev" -source = "git+https://github.com/iced-rs/iced?branch=master#90037336e80f02b817f2f68a5adf877bdb85639a" +source = "git+https://github.com/iced-rs/iced?branch=master#ed36c6e107bb12190c2ac4ed509f803d095bc154" dependencies = [ "bytemuck", "cosmic-text", @@ -2050,7 +2040,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.15.0-dev" -source = "git+https://github.com/iced-rs/iced?branch=master#90037336e80f02b817f2f68a5adf877bdb85639a" +source = "git+https://github.com/iced-rs/iced?branch=master#ed36c6e107bb12190c2ac4ed509f803d095bc154" dependencies = [ "bitflags 2.10.0", "bytemuck", @@ -2070,7 +2060,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.15.0-dev" -source = "git+https://github.com/iced-rs/iced?branch=master#90037336e80f02b817f2f68a5adf877bdb85639a" +source = "git+https://github.com/iced-rs/iced?branch=master#ed36c6e107bb12190c2ac4ed509f803d095bc154" dependencies = [ "iced_renderer", "log", @@ -2083,7 +2073,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.15.0-dev" -source = "git+https://github.com/iced-rs/iced?branch=master#90037336e80f02b817f2f68a5adf877bdb85639a" +source = "git+https://github.com/iced-rs/iced?branch=master#ed36c6e107bb12190c2ac4ed509f803d095bc154" dependencies = [ "iced_debug", "iced_program", @@ -2221,7 +2211,7 @@ dependencies = [ "rgb", "tiff", "zune-core 0.5.1", - "zune-jpeg 0.5.11", + "zune-jpeg 0.5.12", ] [[package]] @@ -2413,9 +2403,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" @@ -2760,9 +2750,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-derive" @@ -3498,9 +3488,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -3559,9 +3549,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -4228,9 +4218,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "skrifa" @@ -4364,9 +4354,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ "libc", "windows-sys 0.60.2", @@ -4624,9 +4614,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.45" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" +checksum = "9da98b7d9b7dad93488a84b8248efc35352b0b2657397d4167e7ad67e5d535e5" dependencies = [ "deranged", "num-conv", @@ -4637,9 +4627,9 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "tiny-skia" @@ -5083,9 +5073,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ "js-sys", "serde_core", @@ -6198,18 +6188,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.33" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +checksum = "fdea86ddd5568519879b8187e1cf04e24fce28f7fe046ceecbce472ff19a2572" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.33" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +checksum = "0c15e1b46eff7c6c91195752e0eeed8ef040e391cdece7c25376957d5f15df22" dependencies = [ "proc-macro2", "quote", @@ -6322,9 +6312,9 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65" +checksum = "02aae0f83f69aafc94776e879363e9771d7ecbffe2c7fbb6c14c5e00dfe88439" [[package]] name = "zopfli" @@ -6398,9 +6388,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2959ca473aae96a14ecedf501d20b3608d2825ba280d5adb57d651721885b0c2" +checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe" dependencies = [ "zune-core 0.5.1", ] @@ -48,7 +48,6 @@ serde_json = "1.0" toml = "0.9" smol = "2" rust-format = { version = "0.3", features = ["pretty_please", "post_process"] } -fxhash = "0.2" thiserror = "2" dirs-next = "2" diff --git a/src/main.rs b/src/main.rs index 107dd3f..9a93b51 100644 --- a/src/main.rs +++ b/src/main.rs @@ -350,13 +350,10 @@ impl IcedBuilder { dialog::Action::UnsavedChanges(_) ) { self.is_loading = true; - Task::perform( - self.project - .clone() - .write_to_file(self.project_path.clone()), - Message::FileSaved, - ) - .chain(Task::done(Message::DialogNo)) + self.project + .write_to_file(self.project_path.clone()) + .map(Message::FileSaved) + .chain(Task::done(Message::DialogNo)) } else { self.update(Message::CloseDialog) }; @@ -377,11 +374,9 @@ impl IcedBuilder { UnsavedChanges::Open => { self.is_dirty = false; self.is_loading = true; - task = Task::perform( - Project::from_file(), - Message::FileOpened, - ) - .chain(task); + task = Project::from_file() + .map(Message::FileOpened) + .chain(task); } UnsavedChanges::Exit => { return self.update(Message::CloseApp); @@ -414,10 +409,7 @@ impl IcedBuilder { if !self.is_dirty { self.is_loading = true; - return Task::perform( - Project::from_file(), - Message::FileOpened, - ); + return Project::from_file().map(Message::FileOpened); } else { self.dialog = Dialog::unsaved_changes( "You have unsaved changes. Do you want to save them before opening another project?", @@ -453,12 +445,10 @@ impl IcedBuilder { self.is_loading = true; self.is_dialog_open = true; - return Task::perform( - self.project - .clone() - .write_to_file(self.project_path.clone()), - Message::FileSaved, - ); + return self + .project + .write_to_file(self.project_path.clone()) + .map(Message::FileSaved); } } Message::SaveFileAs => { @@ -466,10 +456,10 @@ impl IcedBuilder { self.is_loading = true; self.is_dialog_open = true; - return Task::perform( - self.project.clone().write_to_file(None), - Message::FileSaved, - ); + return self + .project + .write_to_file(None) + .map(Message::FileSaved); } } Message::FileSaved(result) => { diff --git a/src/types/project.rs b/src/types/project.rs index a9c4430..e1b2d0c 100644 --- a/src/types/project.rs +++ b/src/types/project.rs @@ -1,11 +1,10 @@ -use std::path::{Path, PathBuf}; +use std::path::PathBuf; -use smol::fs; - -extern crate fxhash; use iced::theme::{Base, Mode, Theme}; +use iced::{Task, window}; use rust_format::{Formatter, PostProcess, PrettyPlease}; use serde::{Deserialize, Serialize}; +use smol::fs; use super::rendered_element::RenderedElement; use crate::Error; @@ -47,47 +46,64 @@ impl Project { Ok((path, project)) } - pub async fn from_file() -> Result<(PathBuf, Self), Error> { - let picked_file = rfd::AsyncFileDialog::new() - .set_title("Open a JSON file...") - .add_filter("*.json, *.JSON", &["json", "JSON"]) - .pick_file() - .await - .ok_or(Error::DialogClosed)?; - - let path = picked_file.path().to_owned(); - - Self::from_path(path).await + pub fn from_file() -> Task<Result<(PathBuf, Self), Error>> { + window::latest() + .and_then(|id| { + window::run(id, |window| { + rfd::AsyncFileDialog::new() + .set_parent(window) + .set_title("Open a JSON file...") + .add_filter("*.json, *.JSON", &["json", "JSON"]) + .pick_file() + }) + }) + .then(Task::future) + .map(|picked_file| picked_file.ok_or(Error::DialogClosed)) + .and_then(|picked_file| { + Task::future(Self::from_path(picked_file.path().to_owned())) + }) } - pub async fn write_to_file( - self, + pub fn write_to_file( + &self, path: Option<PathBuf>, - ) -> Result<PathBuf, Error> { + ) -> Task<Result<PathBuf, Error>> { let path = if let Some(p) = path { - if let Some(parent) = p.parent() - && !parent.exists() - { - fs::create_dir_all(parent).await?; - } - - p + Task::done(Ok(p)) } else { - rfd::AsyncFileDialog::new() - .set_title("Save to JSON file...") - .add_filter("*.json, *.JSON", &["json", "JSON"]) - .save_file() - .await - .as_ref() - .map(rfd::FileHandle::path) - .map(Path::to_owned) - .ok_or(Error::DialogClosed)? + window::latest() + .and_then(|id| { + window::run(id, |window| { + rfd::AsyncFileDialog::new() + .set_parent(window) + .set_title("Save to JSON file...") + .add_filter("*.json, *.JSON", &["json", "JSON"]) + .save_file() + }) + }) + .then(Task::future) + .map(|picked_file| picked_file.ok_or(Error::DialogClosed)) + .and_then(|picked_file| { + Task::done(Ok(picked_file.path().to_owned())) + }) }; - let contents = serde_json::to_string(&self)?; - fs::write(&path, contents).await?; - - Ok(path) + let contents = serde_json::to_string(self).map_err(Error::from); + + path.and_then(move |path| { + Task::done(contents.clone().map(|contents| { + let path = path.clone(); + + async move { + fs::write(path.clone(), contents) + .await + .map(|_| path) + .map_err(Error::from) + } + })) + }) + .and_then(Task::future) + .and_then(move |path| Task::done(Ok(path))) } pub fn app_code(&mut self, theme_mode: Mode) -> Result<String, Error> { |
