From 5bf5bde946a0cf5fca1c3ffd54edd61a9a50b2d7 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Tue, 14 Jun 2011 16:41:30 +0200 Subject: [PATCH 01/12] created new files, conncted MessageBoxManger with WindowManager --- apps/openmw/mwgui/messagebox.cpp | 15 +++++++++++++++ apps/openmw/mwgui/messagebox.hpp | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 apps/openmw/mwgui/messagebox.cpp create mode 100644 apps/openmw/mwgui/messagebox.hpp diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp new file mode 100644 index 0000000000..9c32ed47d1 --- /dev/null +++ b/apps/openmw/mwgui/messagebox.cpp @@ -0,0 +1,15 @@ +#include "messagebox.hpp" +//#include "window_manager.hpp" + +using namespace MWGui; + +void MessageBoxManager::createMessageBox (const std::string& message) +{ + std::cout << "create non-interactive message box" << std::endl; +} + +void MessageBoxManager::createInteractiveMessageBox (const std::string& message, const std::vector& buttons) +{ + std::cout << "create interactive message box" << std::endl; + std::copy (buttons.begin(), buttons.end(), std::ostream_iterator (std::cout, ", ")); +} diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp new file mode 100644 index 0000000000..0e6f0e45f8 --- /dev/null +++ b/apps/openmw/mwgui/messagebox.hpp @@ -0,0 +1,25 @@ +#ifndef MWGUI_MESSAGE_BOX_H +#define MWGUI_MESSAGE_BOX_H + +#include "window_base.hpp" + +namespace MWGui +{ + class WindowManager; +} + +namespace MWGui +{ + using namespace MyGUI; + + class WindowManager; + + class MessageBoxManager + { + public: + void createMessageBox (const std::string& message); + void createInteractiveMessageBox (const std::string& message, const std::vector& buttons); + }; +} + +#endif From 2d93705baa05dfbbd59447c6261f139e8f7b778a Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Tue, 14 Jun 2011 18:25:07 +0200 Subject: [PATCH 02/12] created xml file for the layout; MessageBox class --- .../openmw_resources/openmw_messagebox_layout.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 extern/mygui_3.0.1/openmw_resources/openmw_messagebox_layout.xml diff --git a/extern/mygui_3.0.1/openmw_resources/openmw_messagebox_layout.xml b/extern/mygui_3.0.1/openmw_resources/openmw_messagebox_layout.xml new file mode 100644 index 0000000000..9debd1096e --- /dev/null +++ b/extern/mygui_3.0.1/openmw_resources/openmw_messagebox_layout.xml @@ -0,0 +1,10 @@ + + + + + + + + + + From 84c19a90ade136ee9dea42ab7b484834cdb57705 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Tue, 14 Jun 2011 18:29:20 +0200 Subject: [PATCH 03/12] deleted needless code --- apps/openmw/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index b206934179..bb62c00442 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -65,6 +65,7 @@ set(GAMEGUI mwgui/dialogue_history.cpp mwgui/window_base.cpp mwgui/stats_window.cpp + mwgui/messagebox.cpp ) source_group(apps\\openmw\\mwgui FILES ${GAMEGUI_HEADER} ${GAMEGUI}) From 56dc9ffcf3650e6d9692a4405043ac4eaa6bb027 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Tue, 14 Jun 2011 18:29:55 +0200 Subject: [PATCH 04/12] now, realy deleted needless code. --- apps/openmw/mwgui/messagebox.cpp | 10 +++++++++- apps/openmw/mwgui/messagebox.hpp | 24 +++++++++++++++++------- apps/openmw/mwgui/window_manager.cpp | 13 ++++++++++++- apps/openmw/mwgui/window_manager.hpp | 4 +++- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index 9c32ed47d1..78235fa8c7 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -1,11 +1,12 @@ #include "messagebox.hpp" -//#include "window_manager.hpp" using namespace MWGui; void MessageBoxManager::createMessageBox (const std::string& message) { std::cout << "create non-interactive message box" << std::endl; + MessageBox *box = new MessageBox(*this, message); + mMessageBoxes.push_back(box); } void MessageBoxManager::createInteractiveMessageBox (const std::string& message, const std::vector& buttons) @@ -13,3 +14,10 @@ void MessageBoxManager::createInteractiveMessageBox (const std::string& message, std::cout << "create interactive message box" << std::endl; std::copy (buttons.begin(), buttons.end(), std::ostream_iterator (std::cout, ", ")); } + +MessageBox::MessageBox(MessageBoxManager& parMessageBoxManager, const std::string& message) + : Layout("openmw_messagebox_layout.xml") + , mMessageBoxManager(parMessageBoxManager) +{ + setText("message", message); +} diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 0e6f0e45f8..31286dacd0 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -1,25 +1,35 @@ #ifndef MWGUI_MESSAGE_BOX_H #define MWGUI_MESSAGE_BOX_H +#include +#include + #include "window_base.hpp" namespace MWGui { - class WindowManager; -} -namespace MWGui -{ - using namespace MyGUI; - - class WindowManager; + class MessageBoxManager; + class MessageBox; class MessageBoxManager { + private: + std::vector mMessageBoxes; public: void createMessageBox (const std::string& message); void createInteractiveMessageBox (const std::string& message, const std::vector& buttons); }; + + class MessageBox : public OEngine::GUI::Layout + { + public: + MessageBox(MessageBoxManager& parMessageBoxManager, const std::string& message); + void setMessage(const std::string& message); + protected: + MessageBoxManager& mMessageBoxManager; + }; + } #endif diff --git a/apps/openmw/mwgui/window_manager.cpp b/apps/openmw/mwgui/window_manager.cpp index 2d7f70ef86..1c9cda6772 100644 --- a/apps/openmw/mwgui/window_manager.cpp +++ b/apps/openmw/mwgui/window_manager.cpp @@ -8,6 +8,7 @@ #include "dialogue.hpp" #include "dialogue_history.hpp" #include "stats_window.hpp" +#include "messagebox.hpp" #include "../mwmechanics/mechanicsmanager.hpp" #include "../mwinput/inputmanager.hpp" @@ -60,6 +61,7 @@ WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment inventory = new InventoryWindow (); #endif console = new Console(w,h, environment, extensions); + mMessageBoxManager = new MessageBoxManager(); // The HUD is always on hud->setVisible(true); @@ -82,6 +84,7 @@ WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment WindowManager::~WindowManager() { delete console; + delete mMessageBoxManager; delete hud; delete map; delete menu; @@ -446,13 +449,21 @@ void WindowManager::removeDialog(OEngine::GUI::Layout*dialog) void WindowManager::messageBox (const std::string& message, const std::vector& buttons) { - std::cout << "message box: " << message << std::endl; + /*std::cout << "message box: " << message << std::endl; if (!buttons.empty()) { std::cout << "buttons: "; std::copy (buttons.begin(), buttons.end(), std::ostream_iterator (std::cout, ", ")); std::cout << std::endl; + }*/ + if (buttons.empty()) + { + mMessageBoxManager->createMessageBox(message); + } + else + { + mMessageBoxManager->createInteractiveMessageBox(message, buttons); } } diff --git a/apps/openmw/mwgui/window_manager.hpp b/apps/openmw/mwgui/window_manager.hpp index d3fbf3ea31..92f19cdc3b 100644 --- a/apps/openmw/mwgui/window_manager.hpp +++ b/apps/openmw/mwgui/window_manager.hpp @@ -62,6 +62,7 @@ namespace MWGui class CreateClassDialog; class BirthDialog; class ReviewDialog; + class MessageBoxManager; struct ClassPoint { @@ -84,6 +85,7 @@ namespace MWGui MapWindow *map; MainMenu *menu; StatsWindow *stats; + MessageBoxManager *mMessageBoxManager; #if 0 InventoryWindow *inventory; #endif @@ -245,7 +247,7 @@ namespace MWGui void removeDialog(OEngine::GUI::Layout* dialog); ///< Hides dialog and schedules dialog to be deleted. - + void messageBox (const std::string& message, const std::vector& buttons); /** From aab07f379e89f90351b971539c7f6fb4a771cea0 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Tue, 14 Jun 2011 18:55:07 +0200 Subject: [PATCH 05/12] added openmw_messagebox_layout.xml to CMakeLists.txt --- extern/mygui_3.0.1/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/extern/mygui_3.0.1/CMakeLists.txt b/extern/mygui_3.0.1/CMakeLists.txt index 8101ad91a7..36467733dd 100644 --- a/extern/mygui_3.0.1/CMakeLists.txt +++ b/extern/mygui_3.0.1/CMakeLists.txt @@ -68,6 +68,7 @@ configure_file("${SDIR}/openmw_progress.skin.xml" "${DDIR}/openmw_progress.skin. configure_file("${SDIR}/openmw_stats_window_layout.xml" "${DDIR}/openmw_stats_window_layout.xml" COPYONLY) configure_file("${SDIR}/openmw_text.skin.xml" "${DDIR}/openmw_text.skin.xml" COPYONLY) configure_file("${SDIR}/openmw_windows.skin.xml" "${DDIR}/openmw_windows.skin.xml" COPYONLY) +configure_file("${SDIR}/openmw_messagebox_layout.xml" "${DDIR}/openmw_messagebox_layout.xml" COPYONLY) configure_file("${SDIR}/smallbars.png" "${DDIR}/smallbars.png" COPYONLY) configure_file("${SDIR}/transparent.png" "${DDIR}/transparent.png" COPYONLY) configure_file("${SDIR}/VeraMono.ttf" "${DDIR}/VeraMono.ttf" COPYONLY) From fc25ccef4e102d12a458a7796a1844ceffa1306b Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Tue, 14 Jun 2011 22:11:36 +0200 Subject: [PATCH 06/12] MW_Dialog set ro right propertys --- apps/openmw/mwgui/messagebox.cpp | 25 +++++++++++++++++++ apps/openmw/mwgui/messagebox.hpp | 14 ++++++++--- apps/openmw/mwgui/window_manager.cpp | 2 +- .../openmw_messagebox_layout.xml | 5 +--- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index 78235fa8c7..1a8c3c1691 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -2,6 +2,11 @@ using namespace MWGui; +MessageBoxManager::MessageBoxManager (WindowManager *windowManager) +{ + mWindowManager = windowManager; +} + void MessageBoxManager::createMessageBox (const std::string& message) { std::cout << "create non-interactive message box" << std::endl; @@ -20,4 +25,24 @@ MessageBox::MessageBox(MessageBoxManager& parMessageBoxManager, const std::strin , mMessageBoxManager(parMessageBoxManager) { setText("message", message); + + MyGUI::WidgetPtr messageWidget; + getWidget(messageWidget, "message"); + + MyGUI::IntSize size = messageWidget->_getTextSize(); + size.width += 20; + size.height += 20; + + MyGUI::IntSize gameWindowSize = mMessageBoxManager.mWindowManager->getGui()->getViewSize(); + MyGUI::IntCoord coord; + coord.left = (gameWindowSize.width - size.width)/2; + coord.top = (gameWindowSize.height - size.height); + + + std::cout << "Setting MainWidget to position (" << coord.left << "|" << coord.top + << ") and size to (" << size.width << "|" << size.height << ")" << std::endl; + + mMainWidget->setCoord(coord); + mMainWidget->setSize(size); + } diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 31286dacd0..86e9cb28e1 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -5,6 +5,7 @@ #include #include "window_base.hpp" +#include "window_manager.hpp" namespace MWGui { @@ -14,18 +15,23 @@ namespace MWGui class MessageBoxManager { - private: - std::vector mMessageBoxes; public: + MessageBoxManager (WindowManager* windowManager); void createMessageBox (const std::string& message); void createInteractiveMessageBox (const std::string& message, const std::vector& buttons); + + WindowManager *mWindowManager; + + private: + std::vector mMessageBoxes; }; class MessageBox : public OEngine::GUI::Layout { public: - MessageBox(MessageBoxManager& parMessageBoxManager, const std::string& message); - void setMessage(const std::string& message); + MessageBox (MessageBoxManager& parMessageBoxManager, const std::string& message); + void setMessage (const std::string& message); + protected: MessageBoxManager& mMessageBoxManager; }; diff --git a/apps/openmw/mwgui/window_manager.cpp b/apps/openmw/mwgui/window_manager.cpp index 1c9cda6772..1c9217a921 100644 --- a/apps/openmw/mwgui/window_manager.cpp +++ b/apps/openmw/mwgui/window_manager.cpp @@ -61,7 +61,7 @@ WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment inventory = new InventoryWindow (); #endif console = new Console(w,h, environment, extensions); - mMessageBoxManager = new MessageBoxManager(); + mMessageBoxManager = new MessageBoxManager(this); // The HUD is always on hud->setVisible(true); diff --git a/extern/mygui_3.0.1/openmw_resources/openmw_messagebox_layout.xml b/extern/mygui_3.0.1/openmw_resources/openmw_messagebox_layout.xml index 9debd1096e..e2caf1e316 100644 --- a/extern/mygui_3.0.1/openmw_resources/openmw_messagebox_layout.xml +++ b/extern/mygui_3.0.1/openmw_resources/openmw_messagebox_layout.xml @@ -2,9 +2,6 @@ - - - - + From 9c56031ee2ec8f80b24dbdc34ca5f1ff6c0e7f4c Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Wed, 15 Jun 2011 13:58:57 +0200 Subject: [PATCH 07/12] rudimental implementation of non-interactive MessageBox --- apps/openmw/mwgui/messagebox.cpp | 48 ++++++++++++++++++++++++++++---- apps/openmw/mwgui/messagebox.hpp | 4 +++ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index 1a8c3c1691..148a7f98cc 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -11,7 +11,23 @@ void MessageBoxManager::createMessageBox (const std::string& message) { std::cout << "create non-interactive message box" << std::endl; MessageBox *box = new MessageBox(*this, message); - mMessageBoxes.push_back(box); + + mMessageBoxes.insert(mMessageBoxes.begin(), box); + int height = box->getHeight(); + std::vector::const_iterator it; + + int i = 0; + for(it = mMessageBoxes.begin(); it != mMessageBoxes.end(); ++it) { + if(i == 3) { + (*it)->del(); + break; + } + else { + (*it)->update(height); + height += (*it)->getHeight(); + i++; + } + } } void MessageBoxManager::createInteractiveMessageBox (const std::string& message, const std::vector& buttons) @@ -25,24 +41,44 @@ MessageBox::MessageBox(MessageBoxManager& parMessageBoxManager, const std::strin , mMessageBoxManager(parMessageBoxManager) { setText("message", message); - + update(0); +} + +void MessageBox::update (int height) +{ MyGUI::WidgetPtr messageWidget; getWidget(messageWidget, "message"); MyGUI::IntSize size = messageWidget->_getTextSize(); - size.width += 20; - size.height += 20; + messageWidget->setSize(size); + size.width += 20; // padding between text and border of the box + size.height += 20; // same here MyGUI::IntSize gameWindowSize = mMessageBoxManager.mWindowManager->getGui()->getViewSize(); MyGUI::IntCoord coord; coord.left = (gameWindowSize.width - size.width)/2; - coord.top = (gameWindowSize.height - size.height); + coord.top = (gameWindowSize.height - size.height - height); std::cout << "Setting MainWidget to position (" << coord.left << "|" << coord.top - << ") and size to (" << size.width << "|" << size.height << ")" << std::endl; + << ") and size to (" << size.width << "|" << size.height << ")" + << " while height is " << height << std::endl; mMainWidget->setCoord(coord); mMainWidget->setSize(size); + mHeight = size.height; +} + +void MessageBox::del () +{ + // i dont know how to destroy, but therefor i will just set height and width to zero + MyGUI::IntSize size; + size.width = size.height = 0; + mMainWidget->setSize(size); +} + +int MessageBox::getHeight () +{ + return mHeight+20; // 20 is the padding between this and the next MessageBox } diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 86e9cb28e1..717ec5ab39 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -31,9 +31,13 @@ namespace MWGui public: MessageBox (MessageBoxManager& parMessageBoxManager, const std::string& message); void setMessage (const std::string& message); + int getHeight (); + void update (int height); + void del (); protected: MessageBoxManager& mMessageBoxManager; + int mHeight; }; } From 6dc35247dac7c501d1527d6a211871e755e80bfa Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Wed, 15 Jun 2011 19:42:20 +0200 Subject: [PATCH 08/12] Word wrap for MessageBox --- apps/openmw/mwgui/messagebox.cpp | 53 ++++++++++++------- apps/openmw/mwgui/messagebox.hpp | 4 ++ .../openmw_messagebox_layout.xml | 14 ++++- 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index 148a7f98cc..a96906d252 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -17,8 +17,8 @@ void MessageBoxManager::createMessageBox (const std::string& message) std::vector::const_iterator it; int i = 0; - for(it = mMessageBoxes.begin(); it != mMessageBoxes.end(); ++it) { - if(i == 3) { + for(it = mMessageBoxes.begin()+1; it != mMessageBoxes.end(); ++it) { + if(i == 2) { (*it)->del(); break; } @@ -39,35 +39,50 @@ void MessageBoxManager::createInteractiveMessageBox (const std::string& message, MessageBox::MessageBox(MessageBoxManager& parMessageBoxManager, const std::string& message) : Layout("openmw_messagebox_layout.xml") , mMessageBoxManager(parMessageBoxManager) + , cMessage(message) { - setText("message", message); + mFixedWidth = 300; + mBottomPadding = 20; + + getWidget(mMessageWidget, "message"); + + mMessageWidget->setOverflowToTheLeft(true); + mMessageWidget->addText(cMessage); + + MyGUI::IntSize size; + size.width = mFixedWidth; // fiexd width + size.height = 100; // dummy + + MyGUI::IntCoord coord; + coord.left = 10; // dummy + coord.top = 10; // dummy + + mMessageWidget->setSize(size); + + MyGUI::IntSize textSize = mMessageWidget->_getTextSize(); + size.height = mHeight = textSize.height + 20; // this is the padding between the text and the box + + mMainWidget->setSize(size); + size.width -= 5; // this is to center the text (see messagebox_layout.xml, Widget type="Edit" position="-2 -3 0 0") + mMessageWidget->setSize(size); + update(0); } void MessageBox::update (int height) { - MyGUI::WidgetPtr messageWidget; - getWidget(messageWidget, "message"); - - MyGUI::IntSize size = messageWidget->_getTextSize(); - messageWidget->setSize(size); - size.width += 20; // padding between text and border of the box - size.height += 20; // same here - MyGUI::IntSize gameWindowSize = mMessageBoxManager.mWindowManager->getGui()->getViewSize(); MyGUI::IntCoord coord; - coord.left = (gameWindowSize.width - size.width)/2; - coord.top = (gameWindowSize.height - size.height - height); + coord.left = (gameWindowSize.width - mFixedWidth)/2; + coord.top = (gameWindowSize.height - mHeight - height - mBottomPadding); - - std::cout << "Setting MainWidget to position (" << coord.left << "|" << coord.top - << ") and size to (" << size.width << "|" << size.height << ")" - << " while height is " << height << std::endl; + MyGUI::IntSize size; + size.width = mFixedWidth; + size.height = mHeight; mMainWidget->setCoord(coord); mMainWidget->setSize(size); - - mHeight = size.height; + mMainWidget->setVisible(true); } void MessageBox::del () diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 717ec5ab39..e5593473a2 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -38,6 +38,10 @@ namespace MWGui protected: MessageBoxManager& mMessageBoxManager; int mHeight; + const std::string& cMessage; + MyGUI::EditPtr mMessageWidget; + int mFixedWidth; + int mBottomPadding; }; } diff --git a/extern/mygui_3.0.1/openmw_resources/openmw_messagebox_layout.xml b/extern/mygui_3.0.1/openmw_resources/openmw_messagebox_layout.xml index e2caf1e316..aa1e00258d 100644 --- a/extern/mygui_3.0.1/openmw_resources/openmw_messagebox_layout.xml +++ b/extern/mygui_3.0.1/openmw_resources/openmw_messagebox_layout.xml @@ -1,7 +1,17 @@ - - + + + + + + + + + + From 94e010b79002ac82c5bfc55329af37c96cdafe44 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Wed, 15 Jun 2011 19:53:32 +0200 Subject: [PATCH 09/12] delete all non-interactive MessageBox'es when creating an interactive MessageBox --- apps/openmw/mwgui/messagebox.cpp | 24 +++++++++++++----------- apps/openmw/mwgui/messagebox.hpp | 2 +- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index a96906d252..92d79d05f4 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -12,6 +12,8 @@ void MessageBoxManager::createMessageBox (const std::string& message) std::cout << "create non-interactive message box" << std::endl; MessageBox *box = new MessageBox(*this, message); + // create a timer and delete when ready. + mMessageBoxes.insert(mMessageBoxes.begin(), box); int height = box->getHeight(); std::vector::const_iterator it; @@ -19,7 +21,7 @@ void MessageBoxManager::createMessageBox (const std::string& message) int i = 0; for(it = mMessageBoxes.begin()+1; it != mMessageBoxes.end(); ++it) { if(i == 2) { - (*it)->del(); + delete (*it); break; } else { @@ -34,6 +36,13 @@ void MessageBoxManager::createInteractiveMessageBox (const std::string& message, { std::cout << "create interactive message box" << std::endl; std::copy (buttons.begin(), buttons.end(), std::ostream_iterator (std::cout, ", ")); + + // delete all MessageBox'es + std::vector::const_iterator it; + for(it = mMessageBoxes.begin(); it != mMessageBoxes.end(); it++) { + delete (*it); + } + mMessageBoxes.clear(); } MessageBox::MessageBox(MessageBoxManager& parMessageBoxManager, const std::string& message) @@ -43,6 +52,7 @@ MessageBox::MessageBox(MessageBoxManager& parMessageBoxManager, const std::strin { mFixedWidth = 300; mBottomPadding = 20; + mNextBoxPadding = 20; getWidget(mMessageWidget, "message"); @@ -50,7 +60,7 @@ MessageBox::MessageBox(MessageBoxManager& parMessageBoxManager, const std::strin mMessageWidget->addText(cMessage); MyGUI::IntSize size; - size.width = mFixedWidth; // fiexd width + size.width = mFixedWidth; size.height = 100; // dummy MyGUI::IntCoord coord; @@ -85,15 +95,7 @@ void MessageBox::update (int height) mMainWidget->setVisible(true); } -void MessageBox::del () -{ - // i dont know how to destroy, but therefor i will just set height and width to zero - MyGUI::IntSize size; - size.width = size.height = 0; - mMainWidget->setSize(size); -} - int MessageBox::getHeight () { - return mHeight+20; // 20 is the padding between this and the next MessageBox + return mHeight+mNextBoxPadding; // 20 is the padding between this and the next MessageBox } diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index e5593473a2..30e869a72f 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -33,7 +33,6 @@ namespace MWGui void setMessage (const std::string& message); int getHeight (); void update (int height); - void del (); protected: MessageBoxManager& mMessageBoxManager; @@ -42,6 +41,7 @@ namespace MWGui MyGUI::EditPtr mMessageWidget; int mFixedWidth; int mBottomPadding; + int mNextBoxPadding; }; } From a4217f8fb809f6f9c7efc11534a29ebd62f3934c Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Wed, 15 Jun 2011 22:53:05 +0200 Subject: [PATCH 10/12] Everything should work fine but deleting the existing MessageBox'es. --- apps/openmw/engine.cpp | 3 ++ apps/openmw/mwgui/messagebox.cpp | 47 +++++++++++++++++++++++++--- apps/openmw/mwgui/messagebox.hpp | 16 +++++++++- apps/openmw/mwgui/window_manager.cpp | 5 +++ apps/openmw/mwgui/window_manager.hpp | 2 ++ 5 files changed, 68 insertions(+), 5 deletions(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index b2ed0a7675..1aa442c156 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -152,6 +152,9 @@ bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt) try { mEnvironment.mFrameDuration = evt.timeSinceLastFrame; + + // + mEnvironment.mWindowManager->onFrame(mEnvironment.mFrameDuration); // global scripts mEnvironment.mGlobalScripts->run (mEnvironment); diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index 92d79d05f4..43de3ff0da 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -5,6 +5,22 @@ using namespace MWGui; MessageBoxManager::MessageBoxManager (WindowManager *windowManager) { mWindowManager = windowManager; + // defines + mMessageBoxSpeed = 0.1; +} + +void MessageBoxManager::onFrame (float frameDuration) +{ + std::vector::const_iterator it; + for(it = mTimers.begin(); it != mTimers.end(); it++) + { + (*it)->current += frameDuration; + if((*it)->current >= (*it)->max) + { + // FIXME: delete the messagebox and erase it from the vector + std::cout << "delete MessageBox" << std::endl; + } + } } void MessageBoxManager::createMessageBox (const std::string& message) @@ -12,16 +28,18 @@ void MessageBoxManager::createMessageBox (const std::string& message) std::cout << "create non-interactive message box" << std::endl; MessageBox *box = new MessageBox(*this, message); - // create a timer and delete when ready. + removeMessageBox(message.length()*mMessageBoxSpeed, box); mMessageBoxes.insert(mMessageBoxes.begin(), box); int height = box->getHeight(); std::vector::const_iterator it; int i = 0; - for(it = mMessageBoxes.begin()+1; it != mMessageBoxes.end(); ++it) { + for(it = mMessageBoxes.begin()+1; it != mMessageBoxes.end(); ++it) + { if(i == 2) { delete (*it); + // FIXME: erase it from the vector without segfault :/ break; } else { @@ -30,6 +48,7 @@ void MessageBoxManager::createMessageBox (const std::string& message) i++; } } + std::cout << "mMessageBoxes.size() is " << mMessageBoxes.size() << std::endl; } void MessageBoxManager::createInteractiveMessageBox (const std::string& message, const std::vector& buttons) @@ -37,19 +56,39 @@ void MessageBoxManager::createInteractiveMessageBox (const std::string& message, std::cout << "create interactive message box" << std::endl; std::copy (buttons.begin(), buttons.end(), std::ostream_iterator (std::cout, ", ")); - // delete all MessageBox'es + // FIXME: erase it from the vector without segfault :/ std::vector::const_iterator it; - for(it = mMessageBoxes.begin(); it != mMessageBoxes.end(); it++) { + for(it = mMessageBoxes.begin(); it != mMessageBoxes.end(); it++) + { delete (*it); } mMessageBoxes.clear(); } +void MessageBoxManager::removeMessageBox (float time, MessageBox *msgbox) +{ + MessageBoxManagerTimer *timer; + timer->current = 0; + timer->max = time; + timer->messageBox = msgbox; + + mTimers.insert(mTimers.end(), timer); +} + +void MessageBoxManager::setMessageBoxSpeed (int speed) +{ + mMessageBoxSpeed = speed; +} + + + + MessageBox::MessageBox(MessageBoxManager& parMessageBoxManager, const std::string& message) : Layout("openmw_messagebox_layout.xml") , mMessageBoxManager(parMessageBoxManager) , cMessage(message) { + // defines mFixedWidth = 300; mBottomPadding = 20; mNextBoxPadding = 20; diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 30e869a72f..166a870118 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -3,27 +3,41 @@ #include #include +#include #include "window_base.hpp" #include "window_manager.hpp" + namespace MWGui { - + class MessageBoxManager; class MessageBox; + struct MessageBoxManagerTimer { + float current; + float max; + MessageBox *messageBox; + }; + class MessageBoxManager { public: MessageBoxManager (WindowManager* windowManager); + void onFrame (float frameDuration); void createMessageBox (const std::string& message); void createInteractiveMessageBox (const std::string& message, const std::vector& buttons); + void removeMessageBox (float time, MessageBox *msgbox); + void setMessageBoxSpeed (int speed); + WindowManager *mWindowManager; private: std::vector mMessageBoxes; + std::vector mTimers; + float mMessageBoxSpeed; }; class MessageBox : public OEngine::GUI::Layout diff --git a/apps/openmw/mwgui/window_manager.cpp b/apps/openmw/mwgui/window_manager.cpp index 1c9217a921..8e9a14837d 100644 --- a/apps/openmw/mwgui/window_manager.cpp +++ b/apps/openmw/mwgui/window_manager.cpp @@ -566,6 +566,11 @@ void WindowManager::onClassChoice(int _index) }; } +void WindowManager::onFrame (float frameDuration) +{ + mMessageBoxManager->onFrame(frameDuration); +} + namespace MWGui { diff --git a/apps/openmw/mwgui/window_manager.hpp b/apps/openmw/mwgui/window_manager.hpp index 92f19cdc3b..ebe115d309 100644 --- a/apps/openmw/mwgui/window_manager.hpp +++ b/apps/openmw/mwgui/window_manager.hpp @@ -249,6 +249,8 @@ namespace MWGui ///< Hides dialog and schedules dialog to be deleted. void messageBox (const std::string& message, const std::vector& buttons); + + void onFrame (float frameDuration); /** * Fetches a GMST string from the store, if there is no setting with the given From 4d1db13c8f76a24a509a69baea177bbba68a674d Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Thu, 16 Jun 2011 12:12:50 +0200 Subject: [PATCH 11/12] MessageBoxmangerTimer is now working properly --- apps/openmw/mwgui/messagebox.cpp | 15 +++++++-------- apps/openmw/mwgui/messagebox.hpp | 3 +-- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index 43de3ff0da..6baf496a4c 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -11,14 +11,13 @@ MessageBoxManager::MessageBoxManager (WindowManager *windowManager) void MessageBoxManager::onFrame (float frameDuration) { - std::vector::const_iterator it; + std::vector::iterator it; for(it = mTimers.begin(); it != mTimers.end(); it++) { - (*it)->current += frameDuration; - if((*it)->current >= (*it)->max) + it->current += frameDuration; + if(it->current >= it->max) { // FIXME: delete the messagebox and erase it from the vector - std::cout << "delete MessageBox" << std::endl; } } } @@ -67,10 +66,10 @@ void MessageBoxManager::createInteractiveMessageBox (const std::string& message, void MessageBoxManager::removeMessageBox (float time, MessageBox *msgbox) { - MessageBoxManagerTimer *timer; - timer->current = 0; - timer->max = time; - timer->messageBox = msgbox; + MessageBoxManagerTimer timer; + timer.current = 0; + timer.max = time; + timer.messageBox = msgbox; mTimers.insert(mTimers.end(), timer); } diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 166a870118..94a4407bec 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -3,7 +3,6 @@ #include #include -#include #include "window_base.hpp" #include "window_manager.hpp" @@ -36,7 +35,7 @@ namespace MWGui private: std::vector mMessageBoxes; - std::vector mTimers; + std::vector mTimers; float mMessageBoxSpeed; }; From b72e9d3b2bac35a73ecb6d8c5684114d9ebd2733 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Thu, 16 Jun 2011 13:02:49 +0200 Subject: [PATCH 12/12] non-interactive MessageBox is finished. Didn't find any bugs. --- apps/openmw/mwgui/messagebox.cpp | 41 ++++++++++++++++++++++++-------- apps/openmw/mwgui/messagebox.hpp | 1 + 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index 6baf496a4c..76b35eab39 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -12,33 +12,39 @@ MessageBoxManager::MessageBoxManager (WindowManager *windowManager) void MessageBoxManager::onFrame (float frameDuration) { std::vector::iterator it; - for(it = mTimers.begin(); it != mTimers.end(); it++) + for(it = mTimers.begin(); it != mTimers.end();) { it->current += frameDuration; if(it->current >= it->max) { - // FIXME: delete the messagebox and erase it from the vector + removeMessageBox(it->messageBox); + it = mTimers.erase(it); + } + else + { + it++; } } } void MessageBoxManager::createMessageBox (const std::string& message) { - std::cout << "create non-interactive message box" << std::endl; + std::cout << "MessageBox: " << message << std::endl; + MessageBox *box = new MessageBox(*this, message); removeMessageBox(message.length()*mMessageBoxSpeed, box); mMessageBoxes.insert(mMessageBoxes.begin(), box); int height = box->getHeight(); - std::vector::const_iterator it; + std::vector::iterator it; int i = 0; for(it = mMessageBoxes.begin()+1; it != mMessageBoxes.end(); ++it) { if(i == 2) { delete (*it); - // FIXME: erase it from the vector without segfault :/ + mMessageBoxes.erase(it); break; } else { @@ -47,19 +53,19 @@ void MessageBoxManager::createMessageBox (const std::string& message) i++; } } - std::cout << "mMessageBoxes.size() is " << mMessageBoxes.size() << std::endl; } void MessageBoxManager::createInteractiveMessageBox (const std::string& message, const std::vector& buttons) { - std::cout << "create interactive message box" << std::endl; + std::cout << "interactive MessageBox: " << message << " - "; std::copy (buttons.begin(), buttons.end(), std::ostream_iterator (std::cout, ", ")); + std::cout << std::endl; - // FIXME: erase it from the vector without segfault :/ - std::vector::const_iterator it; - for(it = mMessageBoxes.begin(); it != mMessageBoxes.end(); it++) + std::vector::iterator it = mMessageBoxes.begin(); + while(it != mMessageBoxes.end()) { delete (*it); + it = mMessageBoxes.erase(it); } mMessageBoxes.clear(); } @@ -74,6 +80,21 @@ void MessageBoxManager::removeMessageBox (float time, MessageBox *msgbox) mTimers.insert(mTimers.end(), timer); } +bool MessageBoxManager::removeMessageBox (MessageBox *msgbox) +{ + std::vector::iterator it; + for(it = mMessageBoxes.begin(); it != mMessageBoxes.end(); ++it) + { + if((*it) == msgbox) + { + delete (*it); + mMessageBoxes.erase(it); + return true; + } + } + return false; +} + void MessageBoxManager::setMessageBoxSpeed (int speed) { mMessageBoxSpeed = speed; diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 94a4407bec..37c4db77ae 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -29,6 +29,7 @@ namespace MWGui void createInteractiveMessageBox (const std::string& message, const std::vector& buttons); void removeMessageBox (float time, MessageBox *msgbox); + bool removeMessageBox (MessageBox *msgbox); void setMessageBoxSpeed (int speed); WindowManager *mWindowManager;