From ef26dc666ca7cb9f2c426c7cbc5e1d2d4844010c Mon Sep 17 00:00:00 2001 From: nabijaczleweli Date: Sat, 21 Mar 2020 19:37:14 +0100 Subject: [PATCH] Suggest sensible defaults in file dialogs Went through first the diff of the referenced commit, then all instances of "Create(Open|Save)FileDialog"; added SuggestFilename() calls where a default exists This has been previously removed in 6b5db5897155ca9bdc5daa3e791c07723a6b7d9c Closes #538 --- src/file.cpp | 5 ++++- src/platform/gui.h | 1 + src/platform/guigtk.cpp | 4 ++++ src/platform/guimac.mm | 4 ++++ src/platform/guiwin.cpp | 4 ++++ src/solvespace.cpp | 7 +++++++ 6 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/file.cpp b/src/file.cpp index 657a4b2ae..6ad4f55e2 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -893,11 +893,13 @@ bool SolveSpaceUI::ReloadAllLinked(const Platform::Path &saveFile, bool canCance } } else if(linkMap.count(g.linkFile) == 0) { // The file was moved; prompt the user for its new location. - switch(LocateImportedFile(g.linkFile.RelativeTo(saveFile), canCancel)) { + const auto linkFileRelative = g.linkFile.RelativeTo(saveFile); + switch(LocateImportedFile(linkFileRelative, canCancel)) { case Platform::MessageDialog::Response::YES: { Platform::FileDialogRef dialog = Platform::CreateOpenFileDialog(SS.GW.window); dialog->AddFilters(Platform::SolveSpaceModelFileFilters); dialog->ThawChoices(settings, "LinkSketch"); + dialog->SuggestFilename(linkFileRelative); if(dialog->RunModal()) { dialog->FreezeChoices(settings, "LinkSketch"); linkMap[g.linkFile] = dialog->GetFilename(); @@ -974,6 +976,7 @@ bool SolveSpaceUI::ReloadLinkedImage(const Platform::Path &saveFile, Platform::FileDialogRef dialog = Platform::CreateOpenFileDialog(SS.GW.window); dialog->AddFilters(Platform::RasterFileFilters); dialog->ThawChoices(settings, "LinkImage"); + dialog->SuggestFilename(filename->RelativeTo(saveFile)); if(dialog->RunModal()) { dialog->FreezeChoices(settings, "LinkImage"); *filename = dialog->GetFilename(); diff --git a/src/platform/gui.h b/src/platform/gui.h index c5d082c17..87f12614c 100644 --- a/src/platform/gui.h +++ b/src/platform/gui.h @@ -354,6 +354,7 @@ class FileDialog { virtual Platform::Path GetFilename() = 0; virtual void SetFilename(Platform::Path path) = 0; + virtual void SuggestFilename(Platform::Path path) = 0; virtual void AddFilter(std::string name, std::vector extensions) = 0; void AddFilter(const FileFilter &filter); diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index 73fb01ec1..8cb4cca2c 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -1245,6 +1245,10 @@ class FileDialogImplGtk : public FileDialog { gtkChooser->set_filename(path.raw); } + void SuggestFilename(Platform::Path path) override { + SetFilename(path.WithExtension("")); // TODO + } + void AddFilter(std::string name, std::vector extensions) override { Glib::RefPtr gtkFilter = Gtk::FileFilter::create(); Glib::ustring desc; diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index cb939cf74..95e1f1dbe 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -1261,6 +1261,10 @@ void SetFilename(Platform::Path path) override { nsPanel.nameFieldStringValue = Wrap(path.FileStem()); } + void SuggestFilename(Platform::Path path) override { + SetFilename(path.WithExtension("")); + } + void FreezeChoices(SettingsRef settings, const std::string &key) override { settings->FreezeString("Dialog_" + key + "_Folder", [nsPanel.directoryURL.absoluteString UTF8String]); diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index 70160bbcc..e2b37abda 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1575,6 +1575,10 @@ class FileDialogImplWin32 final : public FileDialog { wcsncpy(filenameWC, Widen(path.raw).c_str(), sizeof(filenameWC) / sizeof(wchar_t) - 1); } + void SuggestFilename(Platform::Path path) override { + SetFilename(path.WithExtension("")); + } + void AddFilter(std::string name, std::vector extensions) override { std::string desc, patterns; for(auto extension : extensions) { diff --git a/src/solvespace.cpp b/src/solvespace.cpp index a3a53caac..ec7a89971 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -599,6 +599,7 @@ void SolveSpaceUI::MenuFile(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::RasterFileFilters); dialog->ThawChoices(settings, "ExportImage"); + dialog->SuggestFilename(SS.saveFile); if(dialog->RunModal()) { dialog->FreezeChoices(settings, "ExportImage"); SS.ExportAsPngTo(dialog->GetFilename()); @@ -610,6 +611,7 @@ void SolveSpaceUI::MenuFile(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::VectorFileFilters); dialog->ThawChoices(settings, "ExportView"); + dialog->SuggestFilename(SS.saveFile); if(!dialog->RunModal()) break; dialog->FreezeChoices(settings, "ExportView"); @@ -633,6 +635,7 @@ void SolveSpaceUI::MenuFile(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::Vector3dFileFilters); dialog->ThawChoices(settings, "ExportWireframe"); + dialog->SuggestFilename(SS.saveFile); if(!dialog->RunModal()) break; dialog->FreezeChoices(settings, "ExportWireframe"); @@ -644,6 +647,7 @@ void SolveSpaceUI::MenuFile(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::VectorFileFilters); dialog->ThawChoices(settings, "ExportSection"); + dialog->SuggestFilename(SS.saveFile); if(!dialog->RunModal()) break; dialog->FreezeChoices(settings, "ExportSection"); @@ -655,6 +659,7 @@ void SolveSpaceUI::MenuFile(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::MeshFileFilters); dialog->ThawChoices(settings, "ExportMesh"); + dialog->SuggestFilename(SS.saveFile); if(!dialog->RunModal()) break; dialog->FreezeChoices(settings, "ExportMesh"); @@ -666,6 +671,7 @@ void SolveSpaceUI::MenuFile(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::SurfaceFileFilters); dialog->ThawChoices(settings, "ExportSurfaces"); + dialog->SuggestFilename(SS.saveFile); if(!dialog->RunModal()) break; dialog->FreezeChoices(settings, "ExportSurfaces"); @@ -879,6 +885,7 @@ void SolveSpaceUI::MenuAnalyze(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::CsvFileFilters); dialog->ThawChoices(settings, "Trace"); + dialog->SetFilename(SS.saveFile); if(dialog->RunModal()) { dialog->FreezeChoices(settings, "Trace");