diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-05-10 22:23:45 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-05-10 22:23:45 +0300 |
commit | fca0f15e161755e0a430802b1b38bdda0cb033cb (patch) | |
tree | c81055dd71fa7a6510d029da65d7f0a36078a99a | |
parent | eaf9448af11e82a567a82aafba95f65e984d9942 (diff) | |
download | plus-fca0f15e161755e0a430802b1b38bdda0cb033cb.tar.gz plus-fca0f15e161755e0a430802b1b38bdda0cb033cb.tar.bz2 plus-fca0f15e161755e0a430802b1b38bdda0cb033cb.tar.xz plus-fca0f15e161755e0a430802b1b38bdda0cb033cb.zip |
Fix crash on closing sell dialog in some cases.
-rw-r--r-- | src/gui/models/shopitems.cpp | 19 | ||||
-rw-r--r-- | src/gui/models/shopitems.h | 3 | ||||
-rw-r--r-- | src/gui/windows/npcselldialog.cpp | 3 |
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); |