diff --git a/apps/openmw/mwgui/container.cpp b/apps/openmw/mwgui/container.cpp index 6bf6a589e..66ccfd50f 100644 --- a/apps/openmw/mwgui/container.cpp +++ b/apps/openmw/mwgui/container.cpp @@ -83,10 +83,9 @@ void ContainerBase::onSelectedItemImpl(MyGUI::Widget* _sender, int count) MWWorld::Ptr object = *mSelectedItem->getUserData(); _unequipItem(object); - int originalCount = object.getRefData().getCount(); - object.getRefData().setCount(count); - mDragAndDrop->mStore.add(object); - object.getRefData().setCount(originalCount - count); + mDragAndDrop->mDraggedCount = count; + + mDragAndDrop->mDraggedFrom = this; std::string sound = MWWorld::Class::get(object).getUpSoundId(object); MWBase::Environment::get().getSoundManager()->playSound (sound, 1.0, 1.0); @@ -94,7 +93,7 @@ void ContainerBase::onSelectedItemImpl(MyGUI::Widget* _sender, int count) mDragAndDrop->mDraggedWidget = mSelectedItem; static_cast(mSelectedItem)->setImageTexture(""); // remove the background texture (not visible during drag) static_cast(mSelectedItem->getChildAt(0)->getChildAt(0))->setCaption( - getCountString((*mDragAndDrop->mStore.begin()).getRefData().getCount())); + getCountString(mDragAndDrop->mDraggedCount)); mDragAndDrop->mWasInInventory = isInventory(); @@ -108,19 +107,27 @@ void ContainerBase::onContainerClicked(MyGUI::Widget* _sender) if(mDragAndDrop->mIsOnDragAndDrop) //drop widget here { MWWorld::Ptr object = *mDragAndDrop->mDraggedWidget->getUserData(); - assert(object.getContainerStore() && "Item is not in a container!"); - std::string sound = MWWorld::Class::get(object).getDownSoundId(object); - MWBase::Environment::get().getSoundManager()->playSound (sound, 1.0, 1.0); + if (mDragAndDrop->mDraggedFrom != this) + { + assert(object.getContainerStore() && "Item is not in a container!"); + + MWWorld::ContainerStore& containerStore = MWWorld::Class::get(mContainer).getContainerStore(mContainer); + int origCount = object.getRefData().getCount(); + object.getRefData().setCount (mDragAndDrop->mDraggedCount); + containerStore.add(object); + object.getRefData().setCount (origCount - mDragAndDrop->mDraggedCount); + } - MWWorld::ContainerStore& containerStore = MWWorld::Class::get(mContainer).getContainerStore(mContainer); - containerStore.add(*mDragAndDrop->mStore.begin()); - mDragAndDrop->mStore.clear(); mDragAndDrop->mIsOnDragAndDrop = false; MyGUI::Gui::getInstance().destroyWidget(mDragAndDrop->mDraggedWidget); drawItems(); + mDragAndDrop->mDraggedFrom->drawItems(); MWBase::Environment::get().getWindowManager()->setDragDrop(false); + + std::string sound = MWWorld::Class::get(object).getDownSoundId(object); + MWBase::Environment::get().getSoundManager()->playSound (sound, 1.0, 1.0); } } @@ -224,7 +231,14 @@ void ContainerBase::drawItems() { index++; const MWWorld::Ptr* iter = &((*it).first); - if(iter->getRefData().getCount() > 0 && !(onlyMagic && MWWorld::Class::get(*iter).getEnchantment(*iter) == "" && iter->getTypeName() != typeid(ESM::Potion).name())) + + int displayCount = iter->getRefData().getCount(); + if (mDragAndDrop->mIsOnDragAndDrop && *iter == *mDragAndDrop->mDraggedWidget->getUserData()) + { + std::cout << "beep" << std::endl; + displayCount -= mDragAndDrop->mDraggedCount; +} + if(displayCount > 0 && !(onlyMagic && MWWorld::Class::get(*iter).getEnchantment(*iter) == "" && iter->getTypeName() != typeid(ESM::Potion).name())) { std::string path = std::string("icons\\"); path+=MWWorld::Class::get(*iter).getInventoryIcon(*iter); @@ -276,7 +290,7 @@ void ContainerBase::drawItems() y = 0; } - text->setCaption(getCountString(iter->getRefData().getCount())); + text->setCaption(getCountString(displayCount)); } } diff --git a/apps/openmw/mwgui/container.hpp b/apps/openmw/mwgui/container.hpp index 9f994be16..a19f9e91f 100644 --- a/apps/openmw/mwgui/container.hpp +++ b/apps/openmw/mwgui/container.hpp @@ -44,7 +44,8 @@ namespace MWGui bool mIsOnDragAndDrop; MyGUI::Widget* mDraggedWidget; MyGUI::Widget* mDragAndDropWidget; - MWWorld::ContainerStore mStore; + ContainerBase* mDraggedFrom; + int mDraggedCount; bool mWasInInventory; // was the item in inventory before it was dragged }; @@ -77,6 +78,8 @@ namespace MWGui void openContainer(MWWorld::Ptr container); void setFilter(Filter filter); ///< set category filter void Update(); + void drawItems(); + protected: MyGUI::ScrollView* mItemView; @@ -100,8 +103,6 @@ namespace MWGui virtual bool isInventory() { return false; } virtual std::vector getEquippedItems() { return std::vector(); } virtual void _unequipItem(MWWorld::Ptr item) { ; } - - void drawItems(); }; class ContainerWindow : public ContainerBase, public WindowBase diff --git a/apps/openmw/mwgui/hud.cpp b/apps/openmw/mwgui/hud.cpp index b99276440..90adb80d5 100644 --- a/apps/openmw/mwgui/hud.cpp +++ b/apps/openmw/mwgui/hud.cpp @@ -260,7 +260,7 @@ void HUD::onWorldClicked(MyGUI::Widget* _sender) if (mDragAndDrop->mIsOnDragAndDrop) { // drop item into the gameworld - MWWorld::Ptr object = *mDragAndDrop->mStore.begin(); + MWWorld::Ptr object = *mDragAndDrop->mDraggedWidget->getUserData(); MWWorld::World* world = MWBase::Environment::get().getWorld(); @@ -279,7 +279,9 @@ void HUD::onWorldClicked(MyGUI::Widget* _sender) std::string sound = MWWorld::Class::get(object).getDownSoundId(object); MWBase::Environment::get().getSoundManager()->playSound (sound, 1.0, 1.0); - mDragAndDrop->mStore.clear(); + // remove object from the container it was coming from + object.getRefData().setCount(0); + mDragAndDrop->mIsOnDragAndDrop = false; MyGUI::Gui::getInstance().destroyWidget(mDragAndDrop->mDraggedWidget); mDragAndDrop->mDraggedWidget = 0; diff --git a/apps/openmw/mwgui/inventorywindow.cpp b/apps/openmw/mwgui/inventorywindow.cpp index ef41bf10a..0c8ac459f 100644 --- a/apps/openmw/mwgui/inventorywindow.cpp +++ b/apps/openmw/mwgui/inventorywindow.cpp @@ -142,7 +142,7 @@ namespace MWGui { if (mDragAndDrop->mIsOnDragAndDrop) { - MWWorld::Ptr ptr = *mDragAndDrop->mStore.begin(); + MWWorld::Ptr ptr = *mDragAndDrop->mDraggedWidget->getUserData(); // can the object be equipped? std::pair, bool> slots = MWWorld::Class::get(ptr).getEquipmentSlots(ptr); @@ -166,49 +166,35 @@ namespace MWGui mWindowManager.getBookWindow()->setTakeButtonShow(false); mWindowManager.getScrollWindow()->setTakeButtonShow(false); } - - // put back in inventory - MWWorld::ContainerStore& containerStore = MWWorld::Class::get(mContainer).getContainerStore(mContainer); - containerStore.add(ptr); } else { - // put back in inventory MWWorld::InventoryStore& invStore = static_cast(MWWorld::Class::get(mContainer).getContainerStore(mContainer)); - MWWorld::ContainerStoreIterator it = invStore.add(ptr); - - // retrieve iterator to the item we just re-added (if stacking didn't happen). - // if stacking happened, the iterator was already returned by the add() call - /// \todo this does not work! - if (it == invStore.end()) + // retrieve iterator to the item + MWWorld::ContainerStoreIterator it = invStore.begin(); + for (; it != invStore.end(); ++it) { - std::cout << "stacking didn't happen" << std::endl; - for (MWWorld::ContainerStoreIterator it2 = invStore.begin(); - it2 != invStore.end(); ++it2) + if (*it == ptr) { - if (*it2 == ptr) - { - std::cout << "found iterator" << std::endl; - it = it2; - return; - } + break; } } + assert(it != invStore.end()); + // equip the item in the first available slot invStore.equip(slots.first.front(), it); std::cout << "Equipped item in slot " << slots.first.front() << std::endl; } - drawItems(); - - mDragAndDrop->mStore.clear(); mDragAndDrop->mIsOnDragAndDrop = false; MyGUI::Gui::getInstance().destroyWidget(mDragAndDrop->mDraggedWidget); mWindowManager.setDragDrop(false); + + drawItems(); } }