diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-10-30 00:11:35 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-10-30 00:11:35 +0300 |
commit | 1b653c7c1a3e6c5d7b2739f881ea6b11ca46cd3b (patch) | |
tree | de98074d774b203053c4215a49764837a3b007ed | |
parent | 598de45a1e77e5f10c69694f607941336163673f (diff) | |
download | mv-1b653c7c1a3e6c5d7b2739f881ea6b11ca46cd3b.tar.gz mv-1b653c7c1a3e6c5d7b2739f881ea6b11ca46cd3b.tar.bz2 mv-1b653c7c1a3e6c5d7b2739f881ea6b11ca46cd3b.tar.xz mv-1b653c7c1a3e6c5d7b2739f881ea6b11ca46cd3b.zip |
Allow add item by drag&drop into npc inventory to exact position.
-rw-r--r-- | src/gui/widgets/itemcontainer.cpp | 5 | ||||
-rw-r--r-- | src/gui/windows/npcdialog.cpp | 2 | ||||
-rw-r--r-- | src/inventory.cpp | 42 | ||||
-rw-r--r-- | src/inventory.h | 3 |
4 files changed, 36 insertions, 16 deletions
diff --git a/src/gui/widgets/itemcontainer.cpp b/src/gui/widgets/itemcontainer.cpp index 8fc8b09e4..fec14b814 100644 --- a/src/gui/widgets/itemcontainer.cpp +++ b/src/gui/widgets/itemcontainer.cpp @@ -631,8 +631,9 @@ void ItemContainer::mouseReleased(MouseEvent &event) inventory = PlayerInfo::getInventory(); if (inventory) { - mInventory->addVirtualItem(inventory->getItem( - dragDrop.getTag())); + mInventory->addVirtualItem( + inventory->getItem(dragDrop.getTag()), + getSlotIndex(event.getX(), event.getY())); } return; } diff --git a/src/gui/windows/npcdialog.cpp b/src/gui/windows/npcdialog.cpp index 5cc538e34..f601c6405 100644 --- a/src/gui/windows/npcdialog.cpp +++ b/src/gui/windows/npcdialog.cpp @@ -542,7 +542,7 @@ void NpcDialog::action(const ActionEvent &event) else if (eventId == "add") { if (inventoryWindow) - mInventory->addVirtualItem(inventoryWindow->getSelectedItem()); + mInventory->addVirtualItem(inventoryWindow->getSelectedItem(), 0); } else if (eventId.find("skin_") == 0) { diff --git a/src/inventory.cpp b/src/inventory.cpp index eecaacd6c..c91a7411a 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -362,24 +362,42 @@ int Inventory::findIndexByTag(const int tag) const return -1; } -void Inventory::addVirtualItem(const Item *const item) +void Inventory::addVirtualItem(const Item *const item, + int index) { if (item && !PlayerInfo::isItemProtected(item->getId())) { if (findIndexByTag(item->getInvIndex()) != -1) return; - const int index = addItem(item->getId(), - item->getType(), - 1, - 1, - item->getColor(), - item->getIdentified(), - item->getDamaged(), - item->getFavorite(), - Equipm_false, - Equipped_false); - Item *const item2 = getItem(index); + if (index >= 0 && index < mSize && mItems[index] == nullptr) + { + setItem(index, + item->getId(), + item->getType(), + 1, + 1, + item->getColor(), + item->getIdentified(), + item->getDamaged(), + item->getFavorite(), + Equipm_false, + Equipped_false); + } + else + { + index = addItem(item->getId(), + item->getType(), + 1, + 1, + item->getColor(), + item->getIdentified(), + item->getDamaged(), + item->getFavorite(), + Equipm_false, + Equipped_false); + } + Item *const item2 = getItem(index); if (item2) item2->setTag(item->getInvIndex()); } diff --git a/src/inventory.h b/src/inventory.h index e20010c23..1d1f49ebe 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -174,7 +174,8 @@ class Inventory final int findIndexByTag(const int tag) const; - void addVirtualItem(const Item *const item); + void addVirtualItem(const Item *const item, + int index); protected: typedef std::list<InventoryListener*> InventoryListenerList; |