diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-01-28 21:27:04 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-02-02 00:13:44 +0300 |
commit | b6a0e05498b2b1a64d9b407fb2416dbaa0faf407 (patch) | |
tree | 7a1023dabcdf250e0983edff3ab1a2a14226f300 /src/gui/windows | |
parent | 6930045257ca767dbfc095f95a440028d5b2213e (diff) | |
download | manaplus-b6a0e05498b2b1a64d9b407fb2416dbaa0faf407.tar.gz manaplus-b6a0e05498b2b1a64d9b407fb2416dbaa0faf407.tar.bz2 manaplus-b6a0e05498b2b1a64d9b407fb2416dbaa0faf407.tar.xz manaplus-b6a0e05498b2b1a64d9b407fb2416dbaa0faf407.zip |
eathena: add support for creating vending shop.
Diffstat (limited to 'src/gui/windows')
-rw-r--r-- | src/gui/windows/shopwindow.cpp | 101 | ||||
-rw-r--r-- | src/gui/windows/shopwindow.h | 10 |
2 files changed, 94 insertions, 17 deletions
diff --git a/src/gui/windows/shopwindow.cpp b/src/gui/windows/shopwindow.cpp index 9240b8e8c..5d013430a 100644 --- a/src/gui/windows/shopwindow.cpp +++ b/src/gui/windows/shopwindow.cpp @@ -58,7 +58,9 @@ #include "enums/being/attributes.h" #include "net/chathandler.h" +#include "net/serverfeatures.h" #include "net/tradehandler.h" +#include "net/vendinghandler.h" #include "resources/iteminfo.h" @@ -80,6 +82,7 @@ ShopWindow::ShopWindow() : Window(_("Personal Shop"), false, nullptr, "shop.xml"), ActionListener(), SelectionListener(), + VendingSlotsListener(), // TRANSLATORS: shop window button mCloseButton(new Button(this, _("Close"), "close", this)), mBuyShopItems(new ShopItems), @@ -94,21 +97,21 @@ ShopWindow::ShopWindow() : mAddButton(new Button(this, _("Add"), "add", this)), // TRANSLATORS: shop window label mDeleteButton(new Button(this, _("Delete"), "delete", this)), - // TRANSLATORS: shop window label - mAnnounceButton(new Button(this, _("Announce"), "announce", this)), - // TRANSLATORS: shop window checkbox - mAnnounceLinks(new CheckBox(this, _("Show links in announce"), false, - this, "link announce")), + mAnnounceButton(nullptr), + mPublishButton(nullptr), + mAnnounceLinks(nullptr), mTabs(nullptr), - mAcceptPlayer(""), - mTradeNick(""), + mAcceptPlayer(), + mTradeNick(), mSelectedItem(-1), mAnnonceTime(0), mLastRequestTimeList(0), mLastRequestTimeItem(0), mRandCounter(0), mTradeMoney(0), - isBuySelected(true) + mSellShopSize(0), + isBuySelected(true), + mHaveVending(serverFeatures->haveVending()) { mBuyShopItemList->postInit(); mSellShopItemList->postInit(); @@ -138,8 +141,6 @@ ShopWindow::ShopWindow() : // TRANSLATORS: shop window tab name mTabs->addButton(_("Sell"), "sell", false); - mAnnounceCounter[BUY] = 0; - mAnnounceCounter[SELL] = 0; loadList(); @@ -156,11 +157,27 @@ ShopWindow::ShopWindow() : placer(0, 0, mTabs, 8).setPadding(3); + if (isBuySelected) + { + // TRANSLATORS: shop window button + mPublishButton = new Button(this, _("Publish"), "publish", this); + placer(2, 6, mPublishButton); + } + else + { + // TRANSLATORS: shop window button + mAnnounceButton = new Button(this, _("Announce"), "announce", this); + // TRANSLATORS: shop window checkbox + mAnnounceLinks = new CheckBox(this, _("Show links in announce"), false, + this, "link announce"); + + placer(2, 6, mAnnounceButton); + placer(0, 7, mAnnounceLinks, 7); + } + placer(0, 1, mScrollArea, 8, 5).setPadding(3); placer(0, 6, mAddButton); placer(1, 6, mDeleteButton); - placer(2, 6, mAnnounceButton); - placer(0, 7, mAnnounceLinks, 7); placer(7, 7, mCloseButton); Layout &layout = getLayout(); @@ -251,11 +268,42 @@ void ShopWindow::action(const ActionEvent &event) isBuySelected = false; updateSelection(); } + else if (eventId == "publish") + { + std::vector<ShopItem*> &oldItems = mSellShopItems->items(); + std::vector<ShopItem*> items; + Inventory *const inv = PlayerInfo::getCartInventory(); + if (!inv) + return; + FOR_EACH (std::vector<ShopItem*>::iterator, it, oldItems) + { + ShopItem *const item = *it; + // +++ need add colors + Item *const cartItem = inv->findItem(item->getId(), 1); + if (!cartItem) + continue; + item->setInvIndex(cartItem->getInvIndex()); + const int amount = cartItem->getQuantity(); + if (!amount) + continue; + if (item->getQuantity() < amount) + item->setQuantity(amount); + items.push_back(item); + if (static_cast<signed int>(items.size()) >= mSellShopSize) + break; + } + if (!items.empty()) + { + vendingHandler->createShop("test shop", true, items); + mSellShopSize = 0; + } + } if (mSelectedItem < 1) return; - const Inventory *const inv = PlayerInfo::getInventory(); + const Inventory *const inv = mHaveVending + ? PlayerInfo::getCartInventory() : PlayerInfo::getInventory(); if (!inv) return; @@ -310,6 +358,7 @@ void ShopWindow::updateButtonsAndLabels() { mAddButton->setEnabled(mSelectedItem != -1); bool allowDel(false); + const bool sellNotEmpty = mSellShopItems->getNumberOfElements() > 0; if (isBuySelected) { allowDel = mBuyShopItemList->getSelected() != -1 @@ -317,10 +366,22 @@ void ShopWindow::updateButtonsAndLabels() } else { - allowDel = mSellShopItemList->getSelected() != -1 - && mSellShopItems->getNumberOfElements() > 0; + allowDel = mSellShopItemList->getSelected() != -1 && sellNotEmpty; } mDeleteButton->setEnabled(allowDel); + if (mPublishButton + && !isBuySelected + && sellNotEmpty + && mSellShopSize > 0 + && localPlayer + && localPlayer->getHaveCart()) + { + mPublishButton->setEnabled(true); + } + else + { + mPublishButton->setEnabled(false); + } } void ShopWindow::setVisible(bool visible) @@ -795,6 +856,11 @@ void ShopWindow::processRequest(const std::string &nick, std::string data, void ShopWindow::updateTimes() { BLOCK_START("ShopWindow::updateTimes") + if (!mAnnounceButton) + { + BLOCK_END("ShopWindow::updateTimes") + return; + } if (mAnnonceTime + (2 * 60) < cur_time || mAnnonceTime > cur_time) { @@ -887,3 +953,8 @@ void ShopWindow::updateSelection() mScrollArea->setContent(mCurrentShopItemList); updateButtonsAndLabels(); } + +void ShopWindow::vendingSlotsChanged(const int slots) +{ + mSellShopSize = slots; +} diff --git a/src/gui/windows/shopwindow.h b/src/gui/windows/shopwindow.h index a3409bbe7..06f0a997d 100644 --- a/src/gui/windows/shopwindow.h +++ b/src/gui/windows/shopwindow.h @@ -27,6 +27,7 @@ #include "listeners/actionlistener.h" #include "listeners/selectionlistener.h" +#include "listeners/vendingslotslistener.h" class Button; class CheckBox; @@ -44,7 +45,8 @@ class TabStrip; */ class ShopWindow final : public Window, public ActionListener, - public SelectionListener + public SelectionListener, + public VendingSlotsListener { public: enum ShopMode @@ -137,6 +139,8 @@ class ShopWindow final : public Window, bool isShopEmpty() const A_WARN_UNUSED; + void vendingSlotsChanged(const int slots) override final; + private: void startTrade(); @@ -158,6 +162,7 @@ class ShopWindow final : public Window, Button *mAddButton; Button *mDeleteButton; Button *mAnnounceButton; + Button *mPublishButton; CheckBox *mAnnounceLinks; TabStrip *mTabs; std::string mAcceptPlayer; @@ -168,8 +173,9 @@ class ShopWindow final : public Window, int mLastRequestTimeItem; int mRandCounter; int mTradeMoney; - int mAnnounceCounter[2]; + int mSellShopSize; bool isBuySelected; + bool mHaveVending; }; extern ShopWindow *shopWindow; |