diff --git a/include/imessagebus.h b/include/imessagebus.h index 6f87a212b6..2751fc2e5e 100644 --- a/include/imessagebus.h +++ b/include/imessagebus.h @@ -50,6 +50,7 @@ class IMessage TextureChanged, ApplicationIsActiveQuery, FileOverwriteConfirmation, + FileSaveConfirmation, UnselectSelectionRequest, ManipulatorModeToggleRequest, ComponentSelectionModeToggleRequest, diff --git a/libs/messages/FileSaveConfirmation.h b/libs/messages/FileSaveConfirmation.h new file mode 100644 index 0000000000..0e9b23d9a8 --- /dev/null +++ b/libs/messages/FileSaveConfirmation.h @@ -0,0 +1,80 @@ +#pragma once + +#include +#include "imessagebus.h" +#include "iradiant.h" + +namespace radiant +{ + +/** + * Message sent when the backend code wants the user to confirm saving a modified file + * before a new map is loaded, with the option to Save the modified map, Discard the changes + * or to cancel the request. + * Senders: If this message stays unresponded the switch is allowed. + */ +class FileSaveConfirmation : + public radiant::IMessage +{ +public: + enum class Action + { + SaveChanges, + DiscardChanges, + Cancel, + }; + +private: + std::string _title; + std::string _message; + + Action _action; + +public: + FileSaveConfirmation(const std::string& title, const std::string& message) : + _title(title), + _message(message), + _action(Action::DiscardChanges) + {} + + const std::string& getTitle() const + { + return _title; + } + + bool hasTitle() const + { + return !_title.empty(); + } + + const std::string& getMessage() const + { + return _message; + } + + std::size_t getId() const override + { + return IMessage::Type::FileSaveConfirmation; + } + + Action getChosenAction() const + { + return _action; + } + + void setAction(Action action) + { + _action = action; + } + + // Convenience method, creating an instance and dispatching it to the message bus, returning the answer + static Action SendAndReceiveAnswer(const std::string& message, const std::string& title = std::string()) + { + FileSaveConfirmation msg(title, message); + GlobalRadiantCore().getMessageBus().sendMessage(msg); + + return msg.getChosenAction(); + } +}; + +} diff --git a/tools/msvc/libs.vcxproj b/tools/msvc/libs.vcxproj index 985dc19f1c..54ed9cbf3a 100644 --- a/tools/msvc/libs.vcxproj +++ b/tools/msvc/libs.vcxproj @@ -172,6 +172,7 @@ + diff --git a/tools/msvc/libs.vcxproj.filters b/tools/msvc/libs.vcxproj.filters index 554f9c1c45..0af9bd8ea9 100644 --- a/tools/msvc/libs.vcxproj.filters +++ b/tools/msvc/libs.vcxproj.filters @@ -317,6 +317,9 @@ messages + + messages +