diff options
-rw-r--r-- | src/gui/models/shopitems.cpp | 18 | ||||
-rw-r--r-- | src/gui/models/shopitems.h | 7 | ||||
-rw-r--r-- | src/gui/windows/buydialog.cpp | 43 | ||||
-rw-r--r-- | src/gui/windows/buydialog.h | 5 | ||||
-rw-r--r-- | src/shopitem.cpp | 6 | ||||
-rw-r--r-- | src/shopitem.h | 7 |
6 files changed, 83 insertions, 3 deletions
diff --git a/src/gui/models/shopitems.cpp b/src/gui/models/shopitems.cpp index 1a9b89994..2fd399cb0 100644 --- a/src/gui/models/shopitems.cpp +++ b/src/gui/models/shopitems.cpp @@ -29,6 +29,7 @@ #include "debug.h" ShopItems::ShopItems(const bool mergeDuplicates) : + mAllShopItems(), mShopItems(), mMergeDuplicates(mergeDuplicates) { @@ -58,6 +59,7 @@ ShopItem *ShopItems::addItem(const int id, { ShopItem *const item = new ShopItem(-1, id, type, color, amount, price); mShopItems.push_back(item); + mAllShopItems.push_back(item); return item; } @@ -72,6 +74,7 @@ ShopItem *ShopItems::addItemNoDup(const int id, { item = new ShopItem(-1, id, type, color, amount, price); mShopItems.push_back(item); + mAllShopItems.push_back(item); } return item; } @@ -95,6 +98,7 @@ ShopItem *ShopItems::addItem2(const int inventoryIndex, { item = new ShopItem(inventoryIndex, id, type, color, quantity, price); mShopItems.push_back(item); + mAllShopItems.push_back(item); } return item; } @@ -127,7 +131,8 @@ void ShopItems::del(const unsigned int i) void ShopItems::clear() { - delete_all(mShopItems); + delete_all(mAllShopItems); + mAllShopItems.clear(); mShopItems.clear(); } @@ -146,3 +151,14 @@ ShopItem *ShopItems::findItem(const int id, const unsigned char color) const return nullptr; } + +void ShopItems::updateList() +{ + mShopItems.clear(); + FOR_EACH (std::vector<ShopItem*>::iterator, it, mAllShopItems) + { + ShopItem *const item = *it; + if (item && item->isVisible()) + mShopItems.push_back(item); + } +} diff --git a/src/gui/models/shopitems.h b/src/gui/models/shopitems.h index 880bc4f71..50269cff1 100644 --- a/src/gui/models/shopitems.h +++ b/src/gui/models/shopitems.h @@ -129,9 +129,14 @@ class ShopItems final : public ListModel std::vector<ShopItem*> &items() A_WARN_UNUSED { return mShopItems; } + std::vector<ShopItem*> &allItems() A_WARN_UNUSED + { return mAllShopItems; } + void setMergeDuplicates(const bool b) { mMergeDuplicates = b; } + void updateList(); + private: /** * Searches the current items in the shop for the specified @@ -143,6 +148,8 @@ class ShopItems final : public ListModel const unsigned char color) const A_WARN_UNUSED; /** The list of items in the shop. */ + std::vector<ShopItem*> mAllShopItems; + std::vector<ShopItem*> mShopItems; /** Look for duplicate entries on addition. */ diff --git a/src/gui/windows/buydialog.cpp b/src/gui/windows/buydialog.cpp index 2fbe58ed2..7f5c79cf5 100644 --- a/src/gui/windows/buydialog.cpp +++ b/src/gui/windows/buydialog.cpp @@ -44,6 +44,7 @@ #include "gui/widgets/scrollarea.h" #include "gui/widgets/shoplistbox.h" #include "gui/widgets/slider.h" +#include "gui/widgets/textfield.h" #include "net/adminhandler.h" #include "net/buysellhandler.h" @@ -177,6 +178,8 @@ BuyDialog::BuyDialog() : SelectionListener(), mSortModel(nullptr), mSortDropDown(nullptr), + mFilterTextField(new TextField(this, "", true, this, "namefilter", true)), + mFilterLabel(nullptr), mNpcId(Items), mMoney(0), mAmountItems(0), @@ -193,6 +196,8 @@ BuyDialog::BuyDialog(const int npcId) : SelectionListener(), mSortModel(nullptr), mSortDropDown(nullptr), + mFilterTextField(new TextField(this, "", true, this, "namefilter", true)), + mFilterLabel(nullptr), mNpcId(npcId), mMoney(0), mAmountItems(0), @@ -209,6 +214,8 @@ BuyDialog::BuyDialog(std::string nick) : SelectionListener(), mSortModel(new SortListModelBuy), mSortDropDown(new DropDown(this, mSortModel, false, false, this, "sort")), + mFilterTextField(new TextField(this, "", true, this, "namefilter", true)), + mFilterLabel(nullptr), mNpcId(Nick), mMoney(0), mAmountItems(0), @@ -287,6 +294,8 @@ void BuyDialog::init() mShopItemList->addActionListener(this); mShopItemList->addSelectionListener(this); + mFilterTextField->setWidth(100); + ContainerPlacer placer = getPlacer(0, 0); placer(0, 0, mScrollArea, 9, 5).setPadding(3); placer(0, 5, mDecreaseButton); @@ -298,7 +307,17 @@ void BuyDialog::init() placer(2, 6, mAmountField, 2); placer(0, 7, mMoneyLabel, 8); if (mSortDropDown) + { placer(0, 8, mSortDropDown, 2); + } + else + { + // TRANSLATORS: buy dialog label + mFilterLabel = new Label(this, _("Filter:")); + mFilterLabel->adjustSize(); + placer(0, 8, mFilterLabel, 2); + } + placer(2, 8, mFilterTextField, 2); placer(7, 8, mBuyButton); placer(8, 8, mQuitButton); @@ -422,6 +441,10 @@ void BuyDialog::action(const ActionEvent &event) config.setValue("buySortOrder", mSortDropDown->getSelected()); return; } + else if (eventId == "namefilter") + { + applyNameFilter(mFilterTextField->getText()); + } const int selectedItem = mShopItemList->getSelected(); @@ -624,3 +647,23 @@ void BuyDialog::closeAll() (*it)->close(); } } + +void BuyDialog::applyNameFilter(const std::string &filter) +{ + std::vector<ShopItem*> &items = mShopItems->allItems(); + std::string filterStr = filter; + toLower(filterStr); + FOR_EACH (std::vector<ShopItem*>::iterator, it, items) + { + ShopItem *const item = *it; + if (!item) + continue; + std::string name = item->getName(); + toLower(name); + if (name.find(filterStr) != std::string::npos) + item->setVisible(true); + else + item->setVisible(false); + } + mShopItems->updateList(); +} diff --git a/src/gui/windows/buydialog.h b/src/gui/windows/buydialog.h index a96e0ff28..504a63154 100644 --- a/src/gui/windows/buydialog.h +++ b/src/gui/windows/buydialog.h @@ -38,6 +38,7 @@ class IntTextField; class Label; class ScrollArea; class Slider; +class TextField; /** * The buy dialog. @@ -149,6 +150,8 @@ class BuyDialog final : public Window, private: void updateSlider(const int selectedItem); + void applyNameFilter(const std::string &filter); + typedef std::list<BuyDialog*> DialogList; static DialogList instances; @@ -167,6 +170,8 @@ class BuyDialog final : public Window, ShopItems *mShopItems; SortListModelBuy *mSortModel; DropDown *mSortDropDown; + TextField *mFilterTextField; + Label *mFilterLabel; int mNpcId; int mMoney; diff --git a/src/shopitem.cpp b/src/shopitem.cpp index 2b9923eb7..3fa7c6480 100644 --- a/src/shopitem.cpp +++ b/src/shopitem.cpp @@ -47,7 +47,8 @@ ShopItem::ShopItem(const int inventoryIndex, mDisplayName(), mDuplicates(), mPrice(price), - mShowQuantity(true) + mShowQuantity(true), + mVisible(true) { updateDisplayName(quantity); setInvIndex(inventoryIndex); @@ -67,7 +68,8 @@ ShopItem::ShopItem(const int id, mDisplayName(), mDuplicates(), mPrice(price), - mShowQuantity(false) + mShowQuantity(false), + mVisible(true) { updateDisplayName(0); setInvIndex(-1); diff --git a/src/shopitem.h b/src/shopitem.h index 9b85c8781..68bdc51b5 100644 --- a/src/shopitem.h +++ b/src/shopitem.h @@ -137,6 +137,12 @@ class ShopItem final : public Item const std::string &getDisplayName() const A_WARN_UNUSED { return mDisplayName; } + void setVisible(const bool b) + { mVisible = b; } + + bool isVisible() const + { return mVisible; } + protected: void updateDisplayName(const int quantity); @@ -153,6 +159,7 @@ class ShopItem final : public Item std::stack<DuplicateItem*> mDuplicates; /** <-- Stores duplicates */ int mPrice; bool mShowQuantity; + bool mVisible; }; #endif // SHOPITEM_H |