From 5d0b4c09a67f279847337aa06bc3066c07f63114 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Fri, 8 Jan 2016 20:27:29 +0300 Subject: Impliment craft inventory for moving items one by one. --- src/gui/windows/npcdialog.cpp | 96 +++++++++++++++++++++++++++++-------------- src/gui/windows/npcdialog.h | 3 ++ 2 files changed, 69 insertions(+), 30 deletions(-) (limited to 'src/gui/windows') diff --git a/src/gui/windows/npcdialog.cpp b/src/gui/windows/npcdialog.cpp index 54ba7ca60..66cdc4bb3 100644 --- a/src/gui/windows/npcdialog.cpp +++ b/src/gui/windows/npcdialog.cpp @@ -63,7 +63,7 @@ #include "resources/inventory/complexinventory.h" -#include "resources/item/item.h" +#include "resources/item/complexitem.h" #include "net/npchandler.h" #include "net/packetlimiter.h" @@ -129,7 +129,7 @@ NpcDialog::NpcDialog(const BeingId npcId) : // TRANSLATORS: npc dialog button mResetButton(new Button(this, _("Reset"), "reset", this)), mInventory(new Inventory(InventoryType::Craft, 1)), - mComplexInventory(new ComplexInventory(InventoryType::Npc, 1)), + mComplexInventory(new ComplexInventory(InventoryType::Craft, 1)), mItemContainer(new ItemContainer(this, mInventory, 10000, ShowEmptyRows_true)), mItemScrollArea(new ScrollArea(this, mItemContainer, @@ -473,38 +473,22 @@ void NpcDialog::action(const ActionEvent &event) } std::string str; - const int sz = mInventory->getSize(); + const int sz = mComplexInventory->getSize(); if (sz == 0) { str = ""; } else { - const Item *item = mInventory->getItem(0); - if (item) - { - str = strprintf("%d,%d", - item->getTag(), - item->getQuantity()); - } - else - { - str = ""; - } + const ComplexItem *item = dynamic_cast( + mComplexInventory->getItem(0)); + str = complexItemToStr(item); for (int f = 1; f < sz; f ++) { str.append("|"); - item = mInventory->getItem(f); - if (item) - { - str.append(strprintf("%d,%d", - item->getTag(), - item->getQuantity())); - } - else - { - str.append(""); - } + item = dynamic_cast( + mComplexInventory->getItem(f)); + str.append(complexItemToStr(item)); } } @@ -543,9 +527,11 @@ void NpcDialog::action(const ActionEvent &event) break; case NPC_INPUT_ITEM: case NPC_INPUT_ITEM_INDEX: - case NPC_INPUT_ITEM_CRAFT: mInventory->clear(); break; + case NPC_INPUT_ITEM_CRAFT: + mComplexInventory->clear(); + break; case NPC_INPUT_NONE: case NPC_INPUT_LIST: default: @@ -566,9 +552,11 @@ void NpcDialog::action(const ActionEvent &event) { case NPC_INPUT_ITEM: case NPC_INPUT_ITEM_INDEX: - case NPC_INPUT_ITEM_CRAFT: mInventory->clear(); break; + case NPC_INPUT_ITEM_CRAFT: + mComplexInventory->clear(); + break; case NPC_INPUT_STRING: case NPC_INPUT_INTEGER: case NPC_INPUT_LIST: @@ -611,8 +599,19 @@ void NpcDialog::action(const ActionEvent &event) { Item *const item = inventoryWindow->getSelectedItem(); Inventory *const inventory = PlayerInfo::getInventory(); - if (mInventory->addVirtualItem(item, 0) && inventory) - inventory->virtualRemove(item, 1); + if (inventory) + { + if (mInputState == NPC_INPUT_ITEM_CRAFT) + { + if (mComplexInventory->addVirtualItem(item, 0, 1)) + inventory->virtualRemove(item, 1); + } + else + { + if (mInventory->addVirtualItem(item, 0, 1)) + inventory->virtualRemove(item, 1); + } + } } } else if (eventId.find("skin_") == 0) @@ -792,7 +791,7 @@ void NpcDialog::itemCraftRequest(const int size) { mActionState = NPC_ACTION_INPUT; mInputState = NPC_INPUT_ITEM_CRAFT; - mInventory->resize(size); + mComplexInventory->resize(size); buildLayout(); } @@ -988,6 +987,11 @@ void NpcDialog::placeItemInputControls() mItemContainer->setMaxColumns(10000); } + if (mInputState == NPC_INPUT_ITEM_CRAFT) + mItemContainer->setInventory(mComplexInventory); + else + mItemContainer->setInventory(mInventory); + if (mDialogInfo && mDialogInfo->hideText) { if (mShowAvatar) @@ -1334,3 +1338,35 @@ void NpcDialog::restoreVirtuals() if (inventory) inventory->restoreVirtuals(); } + +std::string NpcDialog::complexItemToStr(const ComplexItem *const item) +{ + std::string str; + if (item) + { + const std::vector &items = item->getChilds(); + const int sz = items.size(); + logger->log("complexItemToStr size=%d", sz); + if (!sz) + return str; + + const Item *item2 = items[0]; + + str = strprintf("%d,%d", + item2->getInvIndex(), + item2->getQuantity()); + for (int f = 1; f < sz; f ++) + { + str.append(";"); + item2 = items[f]; + str.append(strprintf("%d,%d", + item2->getInvIndex(), + item2->getQuantity())); + } + } + else + { + str = ""; + } + return str; +} diff --git a/src/gui/windows/npcdialog.h b/src/gui/windows/npcdialog.h index 7868fd7d1..db9310f29 100644 --- a/src/gui/windows/npcdialog.h +++ b/src/gui/windows/npcdialog.h @@ -36,6 +36,7 @@ class Being; class Button; class BrowserBox; class ComplexInventory; +class ComplexItem; class Container; class ExtendedListBox; class ItemLinkHandler; @@ -253,6 +254,8 @@ class NpcDialog final : public Window, void restoreVirtuals(); + std::string complexItemToStr(const ComplexItem *const item); + BeingId mNpcId; int mDefaultInt; -- cgit v1.2.3-70-g09d2