summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/gui/windows/npcselldialog.cpp120
-rw-r--r--src/gui/windows/npcselldialog.h49
-rw-r--r--src/gui/windows/selldialog.cpp59
-rw-r--r--src/gui/windows/selldialog.h11
-rw-r--r--src/net/ea/buysellhandler.cpp4
7 files changed, 185 insertions, 62 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 7a8591193..f8f63f26c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -382,6 +382,8 @@ SET(SRCS
gui/windows/npcdialog.h
gui/windows/npcpostdialog.cpp
gui/windows/npcpostdialog.h
+ gui/windows/npcselldialog.cpp
+ gui/windows/npcselldialog.h
gui/windows/okdialog.cpp
gui/windows/okdialog.h
gui/windows/outfitwindow.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index 55b944f67..693901ce3 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -504,6 +504,8 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \
gui/windows/npcdialog.h \
gui/windows/npcpostdialog.cpp \
gui/windows/npcpostdialog.h \
+ gui/windows/npcselldialog.cpp \
+ gui/windows/npcselldialog.h \
gui/windows/okdialog.cpp \
gui/windows/okdialog.h \
gui/windows/outfitwindow.cpp \
diff --git a/src/gui/windows/npcselldialog.cpp b/src/gui/windows/npcselldialog.cpp
new file mode 100644
index 000000000..b975bb6d1
--- /dev/null
+++ b/src/gui/windows/npcselldialog.cpp
@@ -0,0 +1,120 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2014 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 "gui/windows/npcselldialog.h"
+
+#include "shopitem.h"
+#include "units.h"
+
+#include "being/playerinfo.h"
+
+#include "gui/windows/confirmdialog.h"
+#include "gui/windows/setupwindow.h"
+#include "gui/windows/tradewindow.h"
+
+#include "gui/models/shopitems.h"
+
+#include "gui/widgets/button.h"
+#include "gui/widgets/containerplacer.h"
+#include "gui/widgets/label.h"
+#include "gui/widgets/layout.h"
+#include "gui/widgets/layouttype.h"
+#include "gui/widgets/scrollarea.h"
+#include "gui/widgets/shoplistbox.h"
+#include "gui/widgets/slider.h"
+
+#include "net/buysellhandler.h"
+#include "net/net.h"
+#include "net/npchandler.h"
+
+#include "resources/iteminfo.h"
+
+#include "utils/delete2.h"
+#include "utils/gettext.h"
+
+#include "debug.h"
+
+NpcSellDialog::NpcSellDialog(const int npcId) :
+ SellDialog(npcId)
+{
+}
+
+void NpcSellDialog::sellAction(const ActionEvent &event)
+{
+ if (mAmountItems <= 0 || mAmountItems > mMaxItems)
+ return;
+
+ const std::string &eventId = event.getId();
+ const int selectedItem = mShopItemList->getSelected();
+ ShopItem *const item = mShopItems->at(selectedItem);
+ if (!item || PlayerInfo::isItemProtected(item->getId()))
+ return;
+ if (eventId == "presell")
+ {
+ const ItemInfo &info = ItemDB::get(item->getId());
+ if (info.isProtected())
+ {
+ ConfirmDialog *const dialog = new ConfirmDialog(
+ // TRANSLATORS: sell confirmation header
+ _("sell item"),
+ // TRANSLATORS: sell confirmation message
+ strprintf(_("Do you really want to sell %s?"),
+ info.getName().c_str()), SOUND_REQUEST, false, true);
+ dialog->postInit();
+ dialog->addActionListener(this);
+ return;
+ }
+ }
+ // Attempt sell
+ mPlayerMoney += mAmountItems * mShopItems->at(selectedItem)->getPrice();
+ mMaxItems -= mAmountItems;
+ while (mAmountItems > 0)
+ {
+ // This order is important, item->getCurrentInvIndex() would
+ // return the inventory index of the next Duplicate otherwise.
+ const int itemIndex = item->getCurrentInvIndex();
+ const int sellCount = item->sellCurrentDuplicate(mAmountItems);
+ npcHandler->sellItem(mNpcId, itemIndex, sellCount);
+ mAmountItems -= sellCount;
+ }
+
+ mPlayerMoney += mAmountItems * mShopItems->at(selectedItem)->getPrice();
+ mAmountItems = 1;
+ mSlider->setValue(0);
+
+ if (mMaxItems)
+ {
+ updateButtonsAndLabels();
+ }
+ else
+ {
+ // All were sold
+ mShopItemList->setSelected(-1);
+ delete mShopItems->at(selectedItem);
+ mShopItems->erase(selectedItem);
+
+ Rect scroll;
+ scroll.y = mShopItemList->getRowHeight() * (selectedItem + 1);
+ scroll.height = mShopItemList->getRowHeight();
+ mShopItemList->showPart(scroll);
+ }
+}
diff --git a/src/gui/windows/npcselldialog.h b/src/gui/windows/npcselldialog.h
new file mode 100644
index 000000000..a79220a85
--- /dev/null
+++ b/src/gui/windows/npcselldialog.h
@@ -0,0 +1,49 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2014 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 GUI_WINDOWS_NPCSELLDIALOG_H
+#define GUI_WINDOWS_NPCSELLDIALOG_H
+
+#include "gui/windows/selldialog.h"
+
+/**
+ * The sell dialog.
+ *
+ * \ingroup Interface
+ */
+class NpcSellDialog final : public SellDialog
+{
+ public:
+ /**
+ * Constructor.
+ *
+ * @see Window::Window
+ */
+ explicit NpcSellDialog(const int npcId);
+
+ A_DELETE_COPY(NpcSellDialog)
+
+ protected:
+ void sellAction(const ActionEvent &event) override final;
+};
+
+#endif // GUI_WINDOWS_NPCSELLDIALOG_H
diff --git a/src/gui/windows/selldialog.cpp b/src/gui/windows/selldialog.cpp
index fc9ec4b66..cd8c03bdc 100644
--- a/src/gui/windows/selldialog.cpp
+++ b/src/gui/windows/selldialog.cpp
@@ -247,60 +247,7 @@ void SellDialog::action(const ActionEvent &event)
{
if (mNpcId != -1)
{
- ShopItem *const item = mShopItems->at(selectedItem);
- if (PlayerInfo::isItemProtected(item->getId()))
- return;
- if (eventId == "presell")
- {
- const ItemInfo &info = ItemDB::get(item->getId());
- if (info.isProtected())
- {
- ConfirmDialog *const dialog = new ConfirmDialog(
- // TRANSLATORS: sell confirmation header
- _("sell item"),
- // TRANSLATORS: sell confirmation message
- strprintf(_("Do you really want to sell %s?"),
- info.getName().c_str()), SOUND_REQUEST, false, true);
- dialog->postInit();
- dialog->addActionListener(this);
- return;
- }
- }
- // Attempt sell
- mPlayerMoney +=
- mAmountItems * mShopItems->at(selectedItem)->getPrice();
- mMaxItems -= mAmountItems;
- while (mAmountItems > 0)
- {
- // This order is important, item->getCurrentInvIndex() would
- // return the inventory index of the next Duplicate otherwise.
- const int itemIndex = item->getCurrentInvIndex();
- const int sellCount = item->sellCurrentDuplicate(mAmountItems);
- npcHandler->sellItem(mNpcId, itemIndex, sellCount);
- mAmountItems -= sellCount;
- }
-
- mPlayerMoney +=
- mAmountItems * mShopItems->at(selectedItem)->getPrice();
- mAmountItems = 1;
- mSlider->setValue(0);
-
- if (mMaxItems)
- {
- updateButtonsAndLabels();
- }
- else
- {
- // All were sold
- mShopItemList->setSelected(-1);
- delete mShopItems->at(selectedItem);
- mShopItems->erase(selectedItem);
-
- Rect scroll;
- scroll.y = mShopItemList->getRowHeight() * (selectedItem + 1);
- scroll.height = mShopItemList->getRowHeight();
- mShopItemList->showPart(scroll);
- }
+ sellAction(event);
}
else
{
@@ -368,8 +315,8 @@ void SellDialog::updateButtonsAndLabels()
mQuantityLabel->setCaption(strprintf("%d / %d", mAmountItems, mMaxItems));
// TRANSLATORS: sell dialog label
mMoneyLabel->setCaption(strprintf(_("Price: %s / Total: %s"),
- Units::formatCurrency(income).c_str(),
- Units::formatCurrency(mPlayerMoney + income).c_str()));
+ Units::formatCurrency(income).c_str(),
+ Units::formatCurrency(mPlayerMoney + income).c_str()));
if (item)
item->update();
}
diff --git a/src/gui/windows/selldialog.h b/src/gui/windows/selldialog.h
index 0cfffbf38..81aaabbb2 100644
--- a/src/gui/windows/selldialog.h
+++ b/src/gui/windows/selldialog.h
@@ -41,9 +41,9 @@ class Slider;
*
* \ingroup Interface
*/
-class SellDialog final : public Window,
- private ActionListener,
- private SelectionListener
+class SellDialog notfinal : public Window,
+ public ActionListener,
+ private SelectionListener
{
public:
/**
@@ -113,7 +113,7 @@ class SellDialog final : public Window,
*/
static void closeAll();
- private:
+ protected:
typedef std::list<SellDialog*> DialogList;
static DialogList instances;
@@ -122,6 +122,9 @@ class SellDialog final : public Window,
*/
void updateButtonsAndLabels();
+ virtual void sellAction(const ActionEvent &event A_UNUSED)
+ { }
+
std::string mNick;
Button *mSellButton;
diff --git a/src/net/ea/buysellhandler.cpp b/src/net/ea/buysellhandler.cpp
index 6bdc33305..fe2f7ffe0 100644
--- a/src/net/ea/buysellhandler.cpp
+++ b/src/net/ea/buysellhandler.cpp
@@ -31,7 +31,7 @@
#include "gui/windows/chatwindow.h"
#include "gui/windows/buyselldialog.h"
-#include "gui/windows/selldialog.h"
+#include "gui/windows/npcselldialog.h"
#include "gui/windows/buydialog.h"
#include "gui/windows/shopwindow.h"
@@ -146,7 +146,7 @@ void BuySellHandler::processNpcSell(Net::MessageIn &msg) const
const int n_items = (msg.getLength() - 4) / 10;
if (n_items > 0)
{
- SellDialog *const dialog = new SellDialog(mNpcId);
+ SellDialog *const dialog = new NpcSellDialog(mNpcId);
dialog->setMoney(PlayerInfo::getAttribute(Attributes::MONEY));
for (int k = 0; k < n_items; k++)