summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPolesznyák Márk <contact@pml68.dev>2025-11-30 00:33:01 +0100
committerPolesznyák Márk <contact@pml68.dev>2025-11-30 00:36:01 +0100
commitd19a89128596633e61f429365862027e2ef6eda5 (patch)
tree10cc41b9eb15b35c9b8699962ef1afa08e7a8b2c /src
parentchore: update deps (diff)
downloadiced-builder-d19a89128596633e61f429365862027e2ef6eda5.tar.gz
feat: make it impossible (tm) to open multiple dialogs at once
Diffstat (limited to '')
-rw-r--r--src/main.rs58
1 files changed, 44 insertions, 14 deletions
diff --git a/src/main.rs b/src/main.rs
index c3ee12c..695d742 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -81,6 +81,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
struct IcedBuilder {
is_dirty: bool,
is_loading: bool,
+ // Applies to both `Dialog` and file pickers
+ is_dialog_open: bool,
project_path: Option<PathBuf>,
project: Project,
config: Config,
@@ -124,6 +126,7 @@ impl IcedBuilder {
Self {
is_dirty: false,
is_loading: false,
+ is_dialog_open: false,
project_path,
project: Project::new(),
config,
@@ -181,6 +184,7 @@ impl IcedBuilder {
Message::FileOpened,
);
} else {
+ self.is_dialog_open = true;
self.dialog = Dialog::warning(format!(
"The file {} does not exist, or isn't a file.",
path.to_string_lossy()
@@ -188,10 +192,14 @@ impl IcedBuilder {
};
};
}
- Err(error) => self.dialog = Dialog::error(error),
+ Err(error) => {
+ self.is_dialog_open = true;
+ self.dialog = Dialog::error(error);
+ }
},
Message::ConfigWrite(result) => {
if let Err(error) = result {
+ self.is_dialog_open = true;
self.dialog = Dialog::error(error);
}
}
@@ -249,7 +257,10 @@ impl IcedBuilder {
self.editor_content =
text_editor::Content::with_text(&code);
}
- Err(error) => self.dialog = Dialog::error(error),
+ Err(error) => {
+ self.is_dialog_open = true;
+ self.dialog = Dialog::error(error);
+ }
}
}
Message::DropNewElement(name, point, _) => {
@@ -281,6 +292,7 @@ impl IcedBuilder {
self.project.element_tree = Some(element.clone());
}
Err(error) => {
+ self.is_dialog_open = true;
self.dialog = Dialog::error(error);
}
_ => {}
@@ -311,6 +323,7 @@ impl IcedBuilder {
);
if let Err(error) = result {
+ self.is_dialog_open = true;
self.dialog = Dialog::error(error);
}
@@ -327,7 +340,10 @@ impl IcedBuilder {
target,
}) => self.pane_state.drop(pane, target),
Message::PaneDragged(_) => {}
- Message::CloseDialog => self.dialog.close(),
+ Message::CloseDialog => {
+ self.is_dialog_open = false;
+ self.dialog.close();
+ }
Message::DialogYes => {
return if matches!(
self.dialog.action(),
@@ -377,12 +393,13 @@ impl IcedBuilder {
}
Message::DialogCancel => return Task::done(Message::CloseDialog),
Message::NewFile => {
- if !self.is_loading {
+ if !self.is_loading && !self.is_dialog_open {
if !self.is_dirty {
self.project = Project::new();
self.project_path = None;
self.editor_content = text_editor::Content::new();
} else {
+ self.is_dialog_open = true;
self.dialog = Dialog::unsaved_changes(
"You have unsaved changes. Do you want to save them before creating a new project?",
UnsavedChanges::New,
@@ -391,7 +408,9 @@ impl IcedBuilder {
}
}
Message::OpenFile => {
- if !self.is_loading {
+ if !self.is_loading && !self.is_dialog_open {
+ self.is_dialog_open = true;
+
if !self.is_dirty {
self.is_loading = true;
@@ -410,6 +429,7 @@ impl IcedBuilder {
Message::FileOpened(result) => {
self.is_loading = false;
self.is_dirty = false;
+ self.is_dialog_open = false;
match result {
Ok((path, project)) => {
@@ -422,12 +442,16 @@ impl IcedBuilder {
)
.chain(Task::done(Message::RefreshEditorContent));
}
- Err(error) => self.dialog = Dialog::error(error),
+ Err(error) => {
+ self.is_dialog_open = true;
+ self.dialog = Dialog::error(error);
+ }
};
}
Message::SaveFile => {
- if !self.is_loading {
+ if !self.is_loading && !self.is_dialog_open {
self.is_loading = true;
+ self.is_dialog_open = true;
return Task::perform(
self.project
@@ -438,8 +462,9 @@ impl IcedBuilder {
}
}
Message::SaveFileAs => {
- if !self.is_loading {
+ if !self.is_loading && !self.is_dialog_open {
self.is_loading = true;
+ self.is_dialog_open = true;
return Task::perform(
self.project.clone().write_to_file(None),
@@ -449,6 +474,7 @@ impl IcedBuilder {
}
Message::FileSaved(result) => {
self.is_loading = false;
+ self.is_dialog_open = false;
match result {
Ok(path) => {
@@ -458,20 +484,24 @@ impl IcedBuilder {
return self
.update(ConfigChangeType::LastProject.into());
}
- Err(error) => self.dialog = Dialog::error(error),
+ Err(error) => {
+ self.is_dialog_open = true;
+ self.dialog = Dialog::error(error);
+ }
}
}
Message::CloseApp => {
return iced::exit();
}
- Message::EscapePressed
- if self.dialog.action() == dialog::Action::Close =>
- {
- self.dialog.close();
+ Message::EscapePressed => {
+ if self.dialog.action() == dialog::Action::Close {
+ self.is_dialog_open = false;
+ self.dialog.close();
+ }
}
- Message::EscapePressed => {}
Message::WindowEvent(window::Event::CloseRequested) => {
if self.is_dirty {
+ self.is_dialog_open = true;
self.dialog = Dialog::unsaved_changes(
"You have unsaved changes. Do you want to save them before closing iced Builder?",
UnsavedChanges::Exit,