Fix clearing of local map markers

destroyWidget changes the child count, so the for loop is flawed.
This commit is contained in:
scrawl 2014-05-10 01:06:08 +02:00
parent 1444cd9051
commit d86585b153
2 changed files with 23 additions and 18 deletions

View file

@ -86,6 +86,11 @@ namespace MWGui
{ {
mFogOfWar = !mFogOfWar; mFogOfWar = !mFogOfWar;
applyFogOfWar(); applyFogOfWar();
// clear all previous door markers
for (std::vector<MyGUI::Widget*>::iterator it = mDoorMarkerWidgets.begin(); it != mDoorMarkerWidgets.end(); ++it)
MyGUI::Gui::getInstance().destroyWidget(*it);
mDoorMarkerWidgets.clear();
} }
void LocalMapBase::applyFogOfWar() void LocalMapBase::applyFogOfWar()
@ -172,14 +177,10 @@ namespace MWGui
mInterior = interior; mInterior = interior;
mChanged = false; mChanged = false;
// clear all previous markers // clear all previous door markers
for (unsigned int i=0; i< mLocalMap->getChildCount(); ++i) for (std::vector<MyGUI::Widget*>::iterator it = mDoorMarkerWidgets.begin(); it != mDoorMarkerWidgets.end(); ++it)
{ MyGUI::Gui::getInstance().destroyWidget(*it);
if (mLocalMap->getChildAt(i)->getName ().substr (0, 4) == "Door") mDoorMarkerWidgets.clear();
{
MyGUI::Gui::getInstance ().destroyWidget (mLocalMap->getChildAt(i));
}
}
// Update the map textures // Update the map textures
for (int mx=0; mx<3; ++mx) for (int mx=0; mx<3; ++mx)
@ -243,6 +244,8 @@ namespace MWGui
// Used by tooltips to not show the tooltip if marker is hidden by fog of war // Used by tooltips to not show the tooltip if marker is hidden by fog of war
markerWidget->setUserString("IsMarker", "true"); markerWidget->setUserString("IsMarker", "true");
markerWidget->setUserData(markerPos); markerWidget->setUserData(markerPos);
mDoorMarkerWidgets.push_back(markerWidget);
} }
updateMarkers(); updateMarkers();
@ -344,13 +347,9 @@ namespace MWGui
void LocalMapBase::updateMarkers() void LocalMapBase::updateMarkers()
{ {
// clear all previous markers // clear all previous markers
for (unsigned int i=0; i< mLocalMap->getChildCount(); ++i) for (std::vector<MyGUI::Widget*>::iterator it = mMarkerWidgets.begin(); it != mMarkerWidgets.end(); ++it)
{ MyGUI::Gui::getInstance().destroyWidget(*it);
if (mLocalMap->getChildAt(i)->getName ().substr (0, 6) == "Marker") mMarkerWidgets.clear();
{
MyGUI::Gui::getInstance ().destroyWidget (mLocalMap->getChildAt(i));
}
}
addDetectionMarkers(MWBase::World::Detect_Creature); addDetectionMarkers(MWBase::World::Detect_Creature);
addDetectionMarkers(MWBase::World::Detect_Key); addDetectionMarkers(MWBase::World::Detect_Key);
@ -373,6 +372,7 @@ namespace MWGui
markerWidget->setImageTexture("textures\\menu_map_smark.dds"); markerWidget->setImageTexture("textures\\menu_map_smark.dds");
markerWidget->setUserString("IsMarker", "true"); markerWidget->setUserString("IsMarker", "true");
markerWidget->setUserData(markerPos); markerWidget->setUserData(markerPos);
mMarkerWidgets.push_back(markerWidget);
} }
} }

View file

@ -55,12 +55,13 @@ namespace MWGui
bool mChanged; bool mChanged;
bool mFogOfWar; bool mFogOfWar;
typedef std::pair<int, int> CellId;
std::vector<CellId> mMarkers;
std::vector<MyGUI::ImageBox*> mMapWidgets; std::vector<MyGUI::ImageBox*> mMapWidgets;
std::vector<MyGUI::ImageBox*> mFogWidgets; std::vector<MyGUI::ImageBox*> mFogWidgets;
// Keep track of created marker widgets, just to easily remove them later.
std::vector<MyGUI::Widget*> mDoorMarkerWidgets; // Doors
std::vector<MyGUI::Widget*> mMarkerWidgets; // Other markers
void applyFogOfWar(); void applyFogOfWar();
void onMarkerFocused(MyGUI::Widget* w1, MyGUI::Widget* w2); void onMarkerFocused(MyGUI::Widget* w1, MyGUI::Widget* w2);
@ -127,6 +128,10 @@ namespace MWGui
MyGUI::IntPoint mLastDragPos; MyGUI::IntPoint mLastDragPos;
bool mGlobal; bool mGlobal;
// Markers on global map
typedef std::pair<int, int> CellId;
std::vector<CellId> mMarkers;
MyGUI::Button* mEventBoxGlobal; MyGUI::Button* mEventBoxGlobal;
MyGUI::Button* mEventBoxLocal; MyGUI::Button* mEventBoxLocal;