#ifndef MWGUI_MESSAGE_BOX_H #define MWGUI_MESSAGE_BOX_H #include #include "windowbase.hpp" namespace MyGUI { class Widget; class Button; class EditBox; } namespace MWGui { class InteractiveMessageBox; class MessageBoxManager; class MessageBox; class MessageBoxManager { public: MessageBoxManager(float timePerChar); ~MessageBoxManager(); void onFrame(float frameDuration); void createMessageBox(std::string_view message, bool stat = false); void removeStaticMessageBox(); bool createInteractiveMessageBox(std::string_view message, const std::vector& buttons, bool immediate = false, int defaultFocus = -1); bool isInteractiveMessageBox(); int getMessagesCount(); const InteractiveMessageBox* getInteractiveMessageBox() const { return mInterMessageBoxe.get(); } /// Remove all message boxes void clear(); bool removeMessageBox(MessageBox* msgbox); /// @param reset Reset the pressed button to -1 after reading it. int readPressedButton(bool reset = true); void resetInteractiveMessageBox(); void setLastButtonPressed(int index); typedef MyGUI::delegates::MultiDelegate EventHandle_Int; // Note: this delegate unassigns itself after it was fired, i.e. works once. EventHandle_Int eventButtonPressed; void onButtonPressed(int button) { eventButtonPressed(button); eventButtonPressed.clear(); } void setVisible(bool value); const std::vector>& getActiveMessageBoxes() const; private: std::vector> mMessageBoxes; std::unique_ptr mInterMessageBoxe; MessageBox* mStaticMessageBox; float mMessageBoxSpeed; int mLastButtonPressed; bool mVisible = true; }; class MessageBox : public Layout { public: MessageBox(MessageBoxManager& parMessageBoxManager, std::string_view message); const std::string& getMessage() { return mMessage; } int getHeight(); void update(int height); void setVisible(bool value); float mCurrentTime; float mMaxTime; protected: MessageBoxManager& mMessageBoxManager; std::string mMessage; MyGUI::EditBox* mMessageWidget; int mBottomPadding; int mNextBoxPadding; }; class InteractiveMessageBox : public WindowModal { public: InteractiveMessageBox(MessageBoxManager& parMessageBoxManager, const std::string& message, const std::vector& buttons, bool immediate, int defaultFocus); void mousePressed(MyGUI::Widget* _widget); int readPressedButton(); MyGUI::Widget* getDefaultKeyFocus() override; bool exit() override { return false; } bool mMarkedToDelete; private: void buttonActivated(MyGUI::Widget* _widget); MessageBoxManager& mMessageBoxManager; MyGUI::EditBox* mMessageWidget; MyGUI::Widget* mButtonsWidget; std::vector mButtons; int mButtonPressed; int mDefaultFocus; bool mImmediate; }; } #endif