diff options
Diffstat (limited to 'src/gui/widgets/itemcontainer.cpp')
-rw-r--r-- | src/gui/widgets/itemcontainer.cpp | 83 |
1 files changed, 70 insertions, 13 deletions
diff --git a/src/gui/widgets/itemcontainer.cpp b/src/gui/widgets/itemcontainer.cpp index fb5105b2..2cd0fa23 100644 --- a/src/gui/widgets/itemcontainer.cpp +++ b/src/gui/widgets/itemcontainer.cpp @@ -32,7 +32,6 @@ #include "gui/outfitwindow.h" #include "gui/palette.h" #include "gui/sdlinput.h" -#include "gui/theme.h" #include "gui/viewport.h" #include "net/net.h" @@ -40,6 +39,7 @@ #include "resources/image.h" #include "resources/iteminfo.h" +#include "resources/theme.h" #include "utils/stringutils.h" @@ -101,14 +101,38 @@ void ItemContainer::draw(gcn::Graphics *graphics) g->setFont(getFont()); + mFilteredMap.clear(); + int currentIndex = 0; + //Filter checking + for (int i = 0; i < mGridColumns; i++) + { + for (int j = 0; j < mGridRows; j++) + { + int itemIndex = j * mGridColumns + i; + Item *item = mInventory->getItem(itemIndex); + if (!item || item->getId() == 0) + continue; + + if (mFilter.size() > 0) + { + if (normalize(item->getInfo().getName()).find(mFilter) == std::string::npos) + continue; + } + + mFilteredMap[currentIndex] = item; + currentIndex++; + } + } + for (int i = 0; i < mGridColumns; i++) { for (int j = 0; j < mGridRows; j++) { int itemX = i * BOX_WIDTH; int itemY = j * BOX_HEIGHT; - int itemIndex = (j * mGridColumns) + i; - Item *item = mInventory->getItem(itemIndex); + int itemIndex = j * mGridColumns + i; + + Item *item = getItemAt(itemIndex); if (!item || item->getId() == 0) continue; @@ -178,7 +202,18 @@ void ItemContainer::setSelectedIndex(int newIndex) Item *ItemContainer::getSelectedItem() const { - return mInventory->getItem(mSelectedIndex); + return getItemAt(mSelectedIndex); +} + +Item *ItemContainer::getItemAt(int index) const +{ + std::map<int, Item*>::const_iterator i = mFilteredMap.find(index); + return i == mFilteredMap.end() ? 0 : i->second; +} + +void ItemContainer::setFilter(const std::string &filter) +{ + mFilter = normalize(filter); } void ItemContainer::distributeValueChangedEvent() @@ -243,9 +278,19 @@ void ItemContainer::mousePressed(gcn::MouseEvent &event) { const int index = getSlotIndex(event.getX(), event.getY()); if (index == Inventory::NO_SLOT_INDEX) + { + mSelectionStatus = SEL_DESELECTING; return; + } + + Item *item = getItemAt(index); + + if (!item) + { + mSelectionStatus = SEL_DESELECTING; + return; + } - Item *item = mInventory->getItem(index); // put item name into chat window if (mDescItems) @@ -255,7 +300,6 @@ void ItemContainer::mousePressed(gcn::MouseEvent &event) if (mSelectedIndex == index) { - mSelectionStatus = SEL_DESELECTING; } else if (item && item->getId()) { @@ -263,7 +307,7 @@ void ItemContainer::mousePressed(gcn::MouseEvent &event) mSelectionStatus = SEL_SELECTING; itemShortcut->setItemSelected(item->getId()); - if (item->isEquipment()) + if (item->getInfo().getEquippable()) outfitWindow->setItemSelected(item->getId()); } else @@ -305,7 +349,14 @@ void ItemContainer::mouseReleased(gcn::MouseEvent &event) return; if (index == mSelectedIndex || mSelectedIndex == -1) return; - Net::getInventoryHandler()->moveItem(mSelectedIndex, index); + + Item *item = getSelectedItem(); + { + Event event(Event::DoMove); + event.setItem("item", item); + event.setInt("newIndex", index); + event.trigger(Event::ItemChannel); + } selectNone(); } @@ -313,7 +364,7 @@ void ItemContainer::mouseReleased(gcn::MouseEvent &event) // Show ItemTooltip void ItemContainer::mouseMoved(gcn::MouseEvent &event) { - Item *item = mInventory->getItem(getSlotIndex(event.getX(), event.getY())); + Item *item = getItemAt(getSlotIndex(event.getX(), event.getY())); if (item) { @@ -372,8 +423,11 @@ void ItemContainer::keyAction() mSelectedIndex != -1 && mHighlightedIndex != -1) { - Net::getInventoryHandler()->moveItem( - mSelectedIndex, mHighlightedIndex); + Item *item = getSelectedItem(); + Event event(Event::DoMove); + event.setItem("item", item); + event.setInt("newIndex", mHighlightedIndex); + event.trigger(Event::ItemChannel); setSelectedIndex(mHighlightedIndex); } // If the highlight is on an item then select it. @@ -385,8 +439,11 @@ void ItemContainer::keyAction() // If the highlight is on a blank space then move it. else if (mSelectedIndex != -1) { - Net::getInventoryHandler()->moveItem( - mSelectedIndex, mHighlightedIndex); + Item *item = getSelectedItem(); + Event event(Event::DoMove); + event.setItem("item", item); + event.setInt("newIndex", mHighlightedIndex); + event.trigger(Event::ItemChannel); selectNone(); } } |