summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPolesznyák Márk <contact@pml68.dev>2026-01-29 18:27:54 +0100
committerPolesznyák Márk <contact@pml68.dev>2026-01-29 18:27:54 +0100
commit7dcc3d8eabfba6a7c4cdd36165d55c4d2f48a82c (patch)
treef291953090670ef149db37770bdd70578690fb15 /src
parentchore: bump MSRV to match iced's (diff)
downloadiced-builder-7dcc3d8eabfba6a7c4cdd36165d55c4d2f48a82c.tar.gz
feat: set parent window of rfd dialogs
Diffstat (limited to '')
-rw-r--r--src/main.rs42
-rw-r--r--src/types/project.rs92
2 files changed, 70 insertions, 64 deletions
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> {