From f08db308e4d4989678a315e7b306ef247050e7fd Mon Sep 17 00:00:00 2001 From: prewettg Date: Wed, 23 Dec 2020 23:32:40 -0800 Subject: [PATCH] Automatically add extension to non-native file dialog if none is specified (#2818) --- cpp/open3d/visualization/gui/FileDialog.cpp | 27 ++++++++++++++++--- cpp/open3d/visualization/gui/FileDialog.h | 2 ++ .../visualization/gui/FileDialogNative.cpp | 8 +++--- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/cpp/open3d/visualization/gui/FileDialog.cpp b/cpp/open3d/visualization/gui/FileDialog.cpp index 5fb7194d1e0..073712f8cf9 100644 --- a/cpp/open3d/visualization/gui/FileDialog.cpp +++ b/cpp/open3d/visualization/gui/FileDialog.cpp @@ -24,12 +24,13 @@ // IN THE SOFTWARE. // ---------------------------------------------------------------------------- -#if defined(__APPLE__) +// Include FileDialog here to get value of GUI_USE_NATIVE_FILE_DIALOG +#include "open3d/visualization/gui/FileDialog.h" + +#if defined(__APPLE__) && GUI_USE_NATIVE_FILE_DIALOG // see FileDialogNative.cpp #else -#include "open3d/visualization/gui/FileDialog.h" - #include #include #include @@ -387,7 +388,25 @@ void FileDialog::OnDone() { if (this->impl_->on_done_) { auto dir = this->impl_->CalcCurrentDirectory(); utility::filesystem::ChangeWorkingDirectory(dir); - auto name = this->impl_->filename_->GetText(); + std::string name = this->impl_->filename_->GetText(); + // If the user didn't specify an extension, automatically add one + // (unless we don't have the any-files (*.*) filter selected). + if (name.find(".") == std::string::npos && !name.empty()) { + int idx = this->impl_->filter_->GetSelectedIndex(); + if (idx >= 0) { + auto &exts = impl_->filter_idx_2_filter[idx]; + // Prefer PNG if available (otherwise in a list of common + // image files, e.g., ".jpg .png", we might pick the lossy one. + if (exts.find(".png") != exts.end()) { + name += ".png"; + } else { + if (!exts.empty()) { + name += *exts.begin(); + } + } + } + } + std::cout << "[o3d] name: '" << name << "'" << std::endl; this->impl_->on_done_((dir + "/" + name).c_str()); } else { utility::LogError("FileDialog: need to call SetOnDone()"); diff --git a/cpp/open3d/visualization/gui/FileDialog.h b/cpp/open3d/visualization/gui/FileDialog.h index d16ebd67b9c..7d40950c1c2 100644 --- a/cpp/open3d/visualization/gui/FileDialog.h +++ b/cpp/open3d/visualization/gui/FileDialog.h @@ -30,6 +30,8 @@ #include "open3d/visualization/gui/Dialog.h" +#define GUI_USE_NATIVE_FILE_DIALOG 1 + namespace open3d { namespace visualization { namespace gui { diff --git a/cpp/open3d/visualization/gui/FileDialogNative.cpp b/cpp/open3d/visualization/gui/FileDialogNative.cpp index 275495a08f4..0a20ca45406 100644 --- a/cpp/open3d/visualization/gui/FileDialogNative.cpp +++ b/cpp/open3d/visualization/gui/FileDialogNative.cpp @@ -24,12 +24,14 @@ // IN THE SOFTWARE. // ---------------------------------------------------------------------------- -#if defined(__APPLE__) +// Include FileDialog here to get value of GUI_USE_NATIVE_FILE_DIALOG +#include "open3d/visualization/gui/FileDialog.h" + +#if defined(__APPLE__) && GUI_USE_NATIVE_FILE_DIALOG #include #include -#include "open3d/visualization/gui/FileDialog.h" #include "open3d/visualization/gui/Native.h" namespace open3d { @@ -83,4 +85,4 @@ void FileDialog::OnDone() {} } // namespace visualization } // namespace open3d -#endif // __APPLE__ +#endif // __APPLE__ && GUI_USE_NATIVE_FILE_DIALOG