Skip to content

Commit

Permalink
#363: Fix file/folder selector panic on Mac
Browse files Browse the repository at this point in the history
  • Loading branch information
mtkennerly committed Jun 30, 2024
1 parent ad48808 commit 30f6308
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 40 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
## Unreleased

* Fixed:
* GUI: On Mac, the file/folder selector would cause the app to crash.

## v0.24.2 (2024-06-28)

* Fixed:
Expand Down
64 changes: 24 additions & 40 deletions src/gui/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1930,46 +1930,30 @@ impl Application for App {
self.save_config();
Command::none()
}
Message::BrowseDir(subject) => Command::perform(
async move { native_dialog::FileDialog::new().show_open_single_dir() },
move |choice| match choice {
Ok(Some(path)) => match subject {
BrowseSubject::BackupTarget => Message::EditedBackupTarget(crate::path::render_pathbuf(&path)),
BrowseSubject::RestoreSource => {
Message::EditedRestoreSource(crate::path::render_pathbuf(&path))
}
BrowseSubject::Root(i) => Message::EditedRoot(EditAction::Change(
i,
globetter::Pattern::escape(&crate::path::render_pathbuf(&path)),
)),
BrowseSubject::RedirectSource(i) => Message::EditedRedirect(
EditAction::Change(i, crate::path::render_pathbuf(&path)),
Some(RedirectEditActionField::Source),
),
BrowseSubject::RedirectTarget(i) => Message::EditedRedirect(
EditAction::Change(i, crate::path::render_pathbuf(&path)),
Some(RedirectEditActionField::Target),
),
BrowseSubject::CustomGameFile(i, j) => Message::EditedCustomGameFile(
i,
EditAction::Change(j, globetter::Pattern::escape(&crate::path::render_pathbuf(&path))),
),
BrowseSubject::BackupFilterIgnoredPath(i) => Message::EditedBackupFilterIgnoredPath(
EditAction::Change(i, crate::path::render_pathbuf(&path)),
),
},
Ok(None) => Message::Ignore,
Err(_) => Message::BrowseDirFailure,
},
),
Message::BrowseFile(subject) => Command::perform(
async move { native_dialog::FileDialog::new().show_open_single_file() },
move |choice| match choice {
Ok(Some(path)) => Message::SelectedFile(subject, StrictPath::from(path)),
Ok(None) => Message::Ignore,
Err(_) => Message::BrowseDirFailure,
},
),
Message::BrowseDir(subject) => {
if cfg!(target_os = "macos") {
// On Mac, this must be on the main thread, or it will panic.
let choice = native_dialog::FileDialog::new().show_open_single_dir();
Command::perform(async {}, |_| Message::browsed_dir(subject, choice))
} else {
Command::perform(
async move { native_dialog::FileDialog::new().show_open_single_dir() },
move |choice| Message::browsed_dir(subject, choice),
)
}
}
Message::BrowseFile(subject) => {
if cfg!(target_os = "macos") {
// On Mac, this must be on the main thread, or it will panic.
let choice = native_dialog::FileDialog::new().show_open_single_file();
Command::perform(async {}, |_| Message::browsed_file(subject, choice))
} else {
Command::perform(
async move { native_dialog::FileDialog::new().show_open_single_file() },
move |choice| Message::browsed_file(subject, choice),
)
}
}
Message::BrowseDirFailure => self.show_modal(Modal::Error {
variant: Error::UnableToBrowseFileSystem,
}),
Expand Down
46 changes: 46 additions & 0 deletions src/gui/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,52 @@ pub enum Message {
},
}

impl Message {
pub fn browsed_dir(
subject: BrowseSubject,
choice: Result<Option<std::path::PathBuf>, native_dialog::Error>,
) -> Self {
match choice {
Ok(Some(path)) => match subject {
BrowseSubject::BackupTarget => Message::EditedBackupTarget(crate::path::render_pathbuf(&path)),
BrowseSubject::RestoreSource => Message::EditedRestoreSource(crate::path::render_pathbuf(&path)),
BrowseSubject::Root(i) => Message::EditedRoot(EditAction::Change(
i,
globetter::Pattern::escape(&crate::path::render_pathbuf(&path)),
)),
BrowseSubject::RedirectSource(i) => Message::EditedRedirect(
EditAction::Change(i, crate::path::render_pathbuf(&path)),
Some(RedirectEditActionField::Source),
),
BrowseSubject::RedirectTarget(i) => Message::EditedRedirect(
EditAction::Change(i, crate::path::render_pathbuf(&path)),
Some(RedirectEditActionField::Target),
),
BrowseSubject::CustomGameFile(i, j) => Message::EditedCustomGameFile(
i,
EditAction::Change(j, globetter::Pattern::escape(&crate::path::render_pathbuf(&path))),
),
BrowseSubject::BackupFilterIgnoredPath(i) => {
Message::EditedBackupFilterIgnoredPath(EditAction::Change(i, crate::path::render_pathbuf(&path)))
}
},
Ok(None) => Message::Ignore,
Err(_) => Message::BrowseDirFailure,
}
}

pub fn browsed_file(
subject: BrowseFileSubject,
choice: Result<Option<std::path::PathBuf>, native_dialog::Error>,
) -> Self {
match choice {
Ok(Some(path)) => Message::SelectedFile(subject, StrictPath::from(path)),
Ok(None) => Message::Ignore,
Err(_) => Message::BrowseDirFailure,
}
}
}

#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub enum Operation {
#[default]
Expand Down

0 comments on commit 30f6308

Please sign in to comment.