From 602fd127d09c995bc5470218c862b2cebfc558d5 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 3 May 2015 20:09:53 +0300 Subject: Add filter into buy dialogs. --- src/gui/models/shopitems.cpp | 18 +++++++++++++++++- src/gui/models/shopitems.h | 7 +++++++ src/gui/windows/buydialog.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ src/gui/windows/buydialog.h | 5 +++++ 4 files changed, 72 insertions(+), 1 deletion(-) (limited to 'src/gui') 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::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 &items() A_WARN_UNUSED { return mShopItems; } + std::vector &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 mAllShopItems; + std::vector 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 &items = mShopItems->allItems(); + std::string filterStr = filter; + toLower(filterStr); + FOR_EACH (std::vector::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 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; -- cgit v1.2.3-70-g09d2