diff options
-rw-r--r-- | include/cru/platform/gui/SaveOpenDialogOptions.hpp | 81 | ||||
-rw-r--r-- | include/cru/platform/gui/UiApplication.hpp | 6 | ||||
-rw-r--r-- | src/platform/gui/UiApplication.cpp | 10 |
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 |