summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-05-10 22:23:45 +0300
committerAndrei Karas <akaras@inbox.ru>2015-05-10 22:23:45 +0300
commitfca0f15e161755e0a430802b1b38bdda0cb033cb (patch)
treec81055dd71fa7a6510d029da65d7f0a36078a99a
parenteaf9448af11e82a567a82aafba95f65e984d9942 (diff)
downloadmanaverse-fca0f15e161755e0a430802b1b38bdda0cb033cb.tar.gz
manaverse-fca0f15e161755e0a430802b1b38bdda0cb033cb.tar.bz2
manaverse-fca0f15e161755e0a430802b1b38bdda0cb033cb.tar.xz
manaverse-fca0f15e161755e0a430802b1b38bdda0cb033cb.zip
Fix crash on closing sell dialog in some cases.
-rw-r--r--src/gui/models/shopitems.cpp19
-rw-r--r--src/gui/models/shopitems.h3
-rw-r--r--src/gui/windows/npcselldialog.cpp3
3 files changed, 23 insertions, 2 deletions
diff --git a/src/gui/models/shopitems.cpp b/src/gui/models/shopitems.cpp
index 2fd399cb0..3a0d933cc 100644
--- a/src/gui/models/shopitems.cpp
+++ b/src/gui/models/shopitems.cpp
@@ -111,11 +111,27 @@ ShopItem *ShopItems::at(unsigned int i) const
return mShopItems.at(i);
}
+bool ShopItems::findInAllItems(std::vector<ShopItem*>::iterator &it,
+ const ShopItem *const item)
+{
+ const std::vector<ShopItem*>::iterator it_end = mAllShopItems.end();
+ for (it = mAllShopItems.begin(); it != it_end; ++ it)
+ {
+ if (*it == item)
+ return true;
+ }
+ return false;
+}
+
void ShopItems::erase(const unsigned int i)
{
if (i >= static_cast<unsigned int>(mShopItems.size()))
return;
+ ShopItem *item = *(mShopItems.begin() + i);
+ std::vector<ShopItem*>::iterator it;
+ if (findInAllItems(it, item))
+ mAllShopItems.erase(it);
mShopItems.erase(mShopItems.begin() + i);
}
@@ -125,6 +141,9 @@ void ShopItems::del(const unsigned int i)
return;
ShopItem *item = *(mShopItems.begin() + i);
+ std::vector<ShopItem*>::iterator it;
+ if (findInAllItems(it, item))
+ mAllShopItems.erase(it);
mShopItems.erase(mShopItems.begin() + i);
delete item;
}
diff --git a/src/gui/models/shopitems.h b/src/gui/models/shopitems.h
index 50269cff1..b222f9385 100644
--- a/src/gui/models/shopitems.h
+++ b/src/gui/models/shopitems.h
@@ -147,6 +147,9 @@ class ShopItems final : public ListModel
ShopItem *findItem(const int id,
const unsigned char color) const A_WARN_UNUSED;
+ bool findInAllItems(std::vector<ShopItem*>::iterator &it,
+ const ShopItem *const item);
+
/** The list of items in the shop. */
std::vector<ShopItem*> mAllShopItems;
diff --git a/src/gui/windows/npcselldialog.cpp b/src/gui/windows/npcselldialog.cpp
index 881e15254..683593deb 100644
--- a/src/gui/windows/npcselldialog.cpp
+++ b/src/gui/windows/npcselldialog.cpp
@@ -101,8 +101,7 @@ void NpcSellDialog::sellAction(const ActionEvent &event)
{
// All were sold
mShopItemList->setSelected(-1);
- delete mShopItems->at(selectedItem);
- mShopItems->erase(selectedItem);
+ mShopItems->del(selectedItem);
Rect scroll;
scroll.y = mShopItemList->getRowHeight() * (selectedItem + 1);