From e59186a413f90dd4dd60e4d59a53abcb649cde0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= 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 acb931f..f36e49b 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -904,11 +904,13 @@ try_again: } else if(linkMap.count(g.linkFile) == 0) { dbp("Missing file for group: %s", g.name.c_str()); // 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(); @@ -985,6 +987,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 7b2cdf5..1608a6f 100644 --- a/src/platform/gui.h +++ b/src/platform/gui.h @@ -356,6 +356,7 @@ public: 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 cd5d0b8..0c857df 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -1246,6 +1246,10 @@ public: 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 5aa7f05..9789736 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -1274,6 +1274,10 @@ public: 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 d50d24d..cc93077 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1582,6 +1582,10 @@ public: wcsncpy(filenameWC, Widen(path.raw).c_str(), sizeof(filenameWC) / sizeof(wchar_t) - 1); } + void SuggestFilename(Platform::Path path) override { + SetFilename(Platform::Path::From(path.FileStem())); + } + 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 cc89fed..55f6ded 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -627,6 +627,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()); @@ -638,6 +639,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"); @@ -661,6 +663,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"); @@ -672,6 +675,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"); @@ -683,6 +687,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"); @@ -694,6 +699,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"); @@ -910,6 +916,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");