diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index bb62c0044..492c3869b 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -50,6 +50,7 @@ set(GAMEGUI_HEADER mwgui/dialogue_history.hpp mwgui/window_base.hpp mwgui/stats_window.hpp + mwgui/messagebox.hpp ) set(GAMEGUI mwgui/window_manager.cpp diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index 76b35eab3..28aae874f 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -17,7 +17,28 @@ void MessageBoxManager::onFrame (float frameDuration) it->current += frameDuration; if(it->current >= it->max) { - removeMessageBox(it->messageBox); + it->messageBox->mMarkedToDelete = true; + + if(*mMessageBoxes.begin() == it->messageBox) // if this box is the last one + { + // collect all with mMarkedToDelete and delete them. + // and place the other messageboxes on the right position + int height = 0; + std::vector::iterator it2 = mMessageBoxes.begin(); + while(it2 != mMessageBoxes.end()) + { + if((*it2)->mMarkedToDelete) + { + delete (*it2); + it2 = mMessageBoxes.erase(it2); + } + else { + (*it2)->update(height); + height += (*it2)->getHeight(); + it2++; + } + } + } it = mTimers.erase(it); } else @@ -35,23 +56,19 @@ void MessageBoxManager::createMessageBox (const std::string& message) removeMessageBox(message.length()*mMessageBoxSpeed, box); - mMessageBoxes.insert(mMessageBoxes.begin(), box); - int height = box->getHeight(); + mMessageBoxes.push_back(box); std::vector::iterator it; - int i = 0; - for(it = mMessageBoxes.begin()+1; it != mMessageBoxes.end(); ++it) + if(mMessageBoxes.size() > 3) { + delete *mMessageBoxes.begin(); + mMessageBoxes.erase(mMessageBoxes.begin()); + } + + int height = 0; + for(it = mMessageBoxes.begin(); it != mMessageBoxes.end(); ++it) { - if(i == 2) { - delete (*it); - mMessageBoxes.erase(it); - break; - } - else { - (*it)->update(height); - height += (*it)->getHeight(); - i++; - } + (*it)->update(height); + height += (*it)->getHeight(); } } @@ -112,6 +129,7 @@ MessageBox::MessageBox(MessageBoxManager& parMessageBoxManager, const std::strin mFixedWidth = 300; mBottomPadding = 20; mNextBoxPadding = 20; + mMarkedToDelete = false; getWidget(mMessageWidget, "message"); @@ -132,10 +150,8 @@ MessageBox::MessageBox(MessageBoxManager& parMessageBoxManager, const std::strin 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") + size.width -= 15; // 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) diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 37c4db77a..fe58a31c8 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -48,6 +48,8 @@ namespace MWGui int getHeight (); void update (int height); + bool mMarkedToDelete; + protected: MessageBoxManager& mMessageBoxManager; int mHeight; 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 aa1e00258..fb4235ff1 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 @@ -5,7 +5,7 @@ - +