From c7f54151ba693e7f57378b77cc567d5aa26cf4cf Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Sat, 14 Feb 2015 23:28:02 +0300
Subject: Enable publish button in personal buy shop only if it allowed by
 server.

---
 src/CMakeLists.txt                         |  2 ++
 src/Makefile.am                            |  2 ++
 src/gui/windows/shopwindow.cpp             | 16 ++++++++++---
 src/gui/windows/shopwindow.h               |  7 +++++-
 src/listeners/buyingstoreslotslistener.cpp | 36 ++++++++++++++++++++++++++++
 src/listeners/buyingstoreslotslistener.h   | 38 ++++++++++++++++++++++++++++++
 src/net/eathena/buyingstorehandler.cpp     |  5 ++--
 7 files changed, 100 insertions(+), 6 deletions(-)
 create mode 100644 src/listeners/buyingstoreslotslistener.cpp
 create mode 100644 src/listeners/buyingstoreslotslistener.h

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 1bd78b525..1820c1412 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -822,6 +822,8 @@ SET(SRCS
     listeners/banklistener.cpp
     listeners/banklistener.h
     listeners/baselistener.hpp
+    listeners/buyingstoreslotslistener.cpp
+    listeners/buyingstoreslotslistener.h
     listeners/charrenamelistener.cpp
     listeners/charrenamelistener.h
     actormanager.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index 38a6753b7..993ee575f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -951,6 +951,8 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \
 	      listeners/banklistener.cpp \
 	      listeners/banklistener.h \
 	      listeners/baselistener.hpp \
+	      listeners/buyingstoreslotslistener.cpp \
+	      listeners/buyingstoreslotslistener.h \
 	      listeners/charrenamelistener.cpp \
 	      listeners/charrenamelistener.h \
 	      actormanager.cpp \
diff --git a/src/gui/windows/shopwindow.cpp b/src/gui/windows/shopwindow.cpp
index 307c6ac61..6490ff746 100644
--- a/src/gui/windows/shopwindow.cpp
+++ b/src/gui/windows/shopwindow.cpp
@@ -88,6 +88,7 @@ ShopWindow::ShopWindow() :
     SelectionListener(),
     VendingModeListener(),
     VendingSlotsListener(),
+    BuyingStoreSlotsListener(),
     // TRANSLATORS: shop window button
     mCloseButton(new Button(this, _("Close"), "close", this)),
     mBuyShopItems(new ShopItems),
@@ -117,6 +118,7 @@ ShopWindow::ShopWindow() :
     mRandCounter(0),
     mTradeMoney(0),
     mSellShopSize(0),
+    mBuyShopSize(0),
     isBuySelected(true),
     mHaveVending(serverFeatures->haveVending()),
     mEnableVending(false)
@@ -412,7 +414,10 @@ void ShopWindow::updateButtonsAndLabels()
         {
             mPublishButton->setCaption(_("Publish"));
             mPublishButton->adjustSize();
-            mPublishButton->setEnabled(true);
+            if (mBuyShopSize > 0)
+                mPublishButton->setEnabled(true);
+            else
+                mPublishButton->setEnabled(false);
         }
     }
     else
@@ -428,8 +433,7 @@ void ShopWindow::updateButtonsAndLabels()
             else
                 mPublishButton->setCaption(_("Publish"));
             mPublishButton->adjustSize();
-            if (!isBuySelected
-                && sellNotEmpty
+            if (sellNotEmpty
                 && mSellShopSize > 0
                 && localPlayer
                 && localPlayer->getHaveCart())
@@ -1053,3 +1057,9 @@ void ShopWindow::setShopName(const std::string &name)
     serverConfig.setValue("sellShopName", mSellShopName);
     updateShopName();
 }
+
+void ShopWindow::buyingStoreSlotsChanged(const int slots)
+{
+    mBuyShopSize = slots;
+    updateButtonsAndLabels();
+}
diff --git a/src/gui/windows/shopwindow.h b/src/gui/windows/shopwindow.h
index 0acc814b1..e3398d093 100644
--- a/src/gui/windows/shopwindow.h
+++ b/src/gui/windows/shopwindow.h
@@ -26,6 +26,7 @@
 #include "gui/widgets/window.h"
 
 #include "listeners/actionlistener.h"
+#include "listeners/buyingstoreslotslistener.h"
 #include "listeners/selectionlistener.h"
 #include "listeners/vendingmodelistener.h"
 #include "listeners/vendingslotslistener.h"
@@ -48,7 +49,8 @@ class ShopWindow final : public Window,
                          public ActionListener,
                          public SelectionListener,
                          public VendingModeListener,
-                         public VendingSlotsListener
+                         public VendingSlotsListener,
+                         public BuyingStoreSlotsListener
 {
     public:
         enum ShopMode
@@ -143,6 +145,8 @@ class ShopWindow final : public Window,
 
         void vendingSlotsChanged(const int slots) override final;
 
+        void buyingStoreSlotsChanged(const int slots) override final;
+
         void vendingEnabled(const bool b) override final;
 
         void setShopName(const std::string &name);
@@ -184,6 +188,7 @@ class ShopWindow final : public Window,
         int mRandCounter;
         int mTradeMoney;
         int mSellShopSize;
+        int mBuyShopSize;
         bool isBuySelected;
         bool mHaveVending;
         bool mEnableVending;
diff --git a/src/listeners/buyingstoreslotslistener.cpp b/src/listeners/buyingstoreslotslistener.cpp
new file mode 100644
index 000000000..0ab1155df
--- /dev/null
+++ b/src/listeners/buyingstoreslotslistener.cpp
@@ -0,0 +1,36 @@
+/*
+ *  The ManaPlus Client
+ *  Copyright (C) 2014-2015  The ManaPlus Developers
+ *
+ *  This file is part of The ManaPlus Client.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "listeners/buyingstoreslotslistener.h"
+
+#include "debug.h"
+
+defineListener(BuyingStoreSlotsListener)
+
+void BuyingStoreSlotsListener::distributeEvent(const int slots)
+{
+    FOR_EACH (std::vector<BuyingStoreSlotsListener*>::iterator,
+              it, mListeners)
+    {
+        BuyingStoreSlotsListener *const listener = *it;
+        if (listener)
+            listener->buyingStoreSlotsChanged(slots);
+    }
+}
diff --git a/src/listeners/buyingstoreslotslistener.h b/src/listeners/buyingstoreslotslistener.h
new file mode 100644
index 000000000..dc180a9cc
--- /dev/null
+++ b/src/listeners/buyingstoreslotslistener.h
@@ -0,0 +1,38 @@
+/*
+ *  The ManaPlus Client
+ *  Copyright (C) 2014-2015  The ManaPlus Developers
+ *
+ *  This file is part of The ManaPlus Client.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LISTENERS_BUYINGSTORESLOTSLISTENER_H
+#define LISTENERS_BUYINGSTORESLOTSLISTENER_H
+
+#include "listeners/baselistener.hpp"
+
+#include "localconsts.h"
+
+class BuyingStoreSlotsListener notfinal
+{
+    public:
+        virtual void buyingStoreSlotsChanged(const int slots) = 0;
+
+        static void distributeEvent(const int slots);
+
+    defineListenerHeader(BuyingStoreSlotsListener)
+};
+
+#endif  // LISTENERS_BUYINGSTORESLOTSLISTENER_H
diff --git a/src/net/eathena/buyingstorehandler.cpp b/src/net/eathena/buyingstorehandler.cpp
index 649b2b39e..8781a13ee 100644
--- a/src/net/eathena/buyingstorehandler.cpp
+++ b/src/net/eathena/buyingstorehandler.cpp
@@ -25,6 +25,8 @@
 
 #include "being/being.h"
 
+#include "listeners/buyingstoreslotslistener.h"
+
 #include "net/ea/eaprotocol.h"
 
 #include "net/eathena/messageout.h"
@@ -111,8 +113,7 @@ void BuyingStoreHandler::handleMessage(Net::MessageIn &msg)
 
 void BuyingStoreHandler::processBuyingStoreOpen(Net::MessageIn &msg)
 {
-    // +++ need create store dialog
-    msg.readUInt8("slots");
+    BuyingStoreSlotsListener::distributeEvent(msg.readUInt8("slots"));
 }
 
 void BuyingStoreHandler::processBuyingStoreCreateFailed(Net::MessageIn &msg)
-- 
cgit v1.2.3-70-g09d2