aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/platform/gui/SaveOpenDialogOptions.hpp81
-rw-r--r--include/cru/platform/gui/UiApplication.hpp6
-rw-r--r--src/platform/gui/UiApplication.cpp10
3 files changed, 97 insertions, 0 deletions
diff --git a/include/cru/platform/gui/SaveOpenDialogOptions.hpp b/include/cru/platform/gui/SaveOpenDialogOptions.hpp
new file mode 100644
index 00000000..907ec808
--- /dev/null
+++ b/include/cru/platform/gui/SaveOpenDialogOptions.hpp
@@ -0,0 +1,81 @@
+#pragma once
+#include "Base.hpp"
+
+namespace cru::platform::gui {
+struct CRU_PLATFORM_GUI_API SaveDialogOptions {
+ String title;
+ String prompt;
+ String message;
+ std::vector<String> allowed_file_types;
+ bool allow_all_file_types = false;
+};
+
+struct CRU_PLATFORM_GUI_API OpenDialogOptions : SaveDialogOptions {
+ bool can_choose_files = true;
+ bool can_choose_directories = false;
+ bool allow_mulitple_selection = false;
+};
+
+template <typename T>
+struct CRU_PLATFORM_GUI_API SaveDialogOptionsBuilderTemplate {
+ T options;
+
+ SaveDialogOptionsBuilderTemplate& SetTitle(String title) {
+ options.title = std::move(title);
+ return *this;
+ }
+
+ SaveDialogOptionsBuilderTemplate& SetPrompt(String prompt) {
+ options.prompt = std::move(prompt);
+ return *this;
+ }
+
+ SaveDialogOptionsBuilderTemplate& SetMessage(String message) {
+ options.message = std::move(message);
+ return *this;
+ }
+
+ SaveDialogOptionsBuilderTemplate& SetAllowedFileTypes(
+ std::vector<String> allowed_file_types) {
+ options.allowed_file_types = std::move(allowed_file_types);
+ return *this;
+ }
+
+ SaveDialogOptionsBuilderTemplate& AddAllowedFileType(
+ String allowed_file_type) {
+ options.allowed_file_types.push_back(allowed_file_type);
+ return *this;
+ }
+
+ SaveDialogOptionsBuilderTemplate& SetAllowAllFileTypes(
+ bool allow_all_file_types) {
+ options.allow_all_file_types = allow_all_file_types;
+ return *this;
+ }
+
+ T Build() { return options; }
+};
+
+using SaveDialogOptionsBuilder =
+ SaveDialogOptionsBuilderTemplate<SaveDialogOptions>;
+
+struct CRU_PLATFORM_GUI_API OpenDialogOptionsBuilder
+ : SaveDialogOptionsBuilderTemplate<OpenDialogOptions> {
+ OpenDialogOptionsBuilder& SetCanChooseFiles(bool can_choose_files) {
+ options.can_choose_files = can_choose_files;
+ return *this;
+ }
+
+ OpenDialogOptionsBuilder& SetCanChooseDirectories(
+ bool can_choose_directories) {
+ options.can_choose_directories = can_choose_directories;
+ return *this;
+ }
+
+ OpenDialogOptionsBuilder& SetAllowMultipleSelection(
+ bool allow_mulitple_selection) {
+ options.allow_mulitple_selection = allow_mulitple_selection;
+ return *this;
+ }
+};
+} // namespace cru::platform::gui
diff --git a/include/cru/platform/gui/UiApplication.hpp b/include/cru/platform/gui/UiApplication.hpp
index 5c22bd94..c917aa01 100644
--- a/include/cru/platform/gui/UiApplication.hpp
+++ b/include/cru/platform/gui/UiApplication.hpp
@@ -4,6 +4,8 @@
#include "cru/common/Bitmask.hpp"
#include "cru/platform/gui/Menu.hpp"
+#include "SaveOpenDialogOptions.hpp"
+
#include <chrono>
#include <functional>
#include <memory>
@@ -60,5 +62,9 @@ struct CRU_PLATFORM_GUI_API IUiApplication : public virtual IPlatformResource {
// If return nullptr, it means the menu is not supported.
virtual IMenu* GetApplicationMenu();
+
+ virtual std::optional<String> ShowSaveDialog(SaveDialogOptions options);
+ virtual std::optional<std::vector<String>> ShowOpenDialog(
+ OpenDialogOptions options);
};
} // namespace cru::platform::gui
diff --git a/src/platform/gui/UiApplication.cpp b/src/platform/gui/UiApplication.cpp
index 1f77653f..e58d34c9 100644
--- a/src/platform/gui/UiApplication.cpp
+++ b/src/platform/gui/UiApplication.cpp
@@ -14,4 +14,14 @@ IUiApplication::IUiApplication() {
IUiApplication::~IUiApplication() { instance = nullptr; }
IMenu* IUiApplication::GetApplicationMenu() { return nullptr; }
+
+std::optional<String> IUiApplication::ShowSaveDialog(
+ SaveDialogOptions options) {
+ throw Exception(u"Not implemented.");
+}
+
+std::optional<std::vector<String>> IUiApplication::ShowOpenDialog(
+ OpenDialogOptions options) {
+ throw Exception(u"Not implemented.");
+}
} // namespace cru::platform::gui