diff options
| author | Polesznyák Márk <contact@pml68.dev> | 2025-11-30 00:33:01 +0100 |
|---|---|---|
| committer | Polesznyák Márk <contact@pml68.dev> | 2025-11-30 00:36:01 +0100 |
| commit | d19a89128596633e61f429365862027e2ef6eda5 (patch) | |
| tree | 10cc41b9eb15b35c9b8699962ef1afa08e7a8b2c | |
| parent | chore: update deps (diff) | |
| download | iced-builder-d19a89128596633e61f429365862027e2ef6eda5.tar.gz | |
feat: make it impossible (tm) to open multiple dialogs at once
Diffstat (limited to '')
| -rw-r--r-- | src/main.rs | 58 |
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, |
