summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2014-09-22 19:48:04 +0300
committerAndrei Karas <akaras@inbox.ru>2014-09-22 19:48:04 +0300
commitde4548a50ecb4d4700c9899044f50070f7d9a95a (patch)
treed54bc1bdf010b2a08cdf067fcaf64d92d42685b1
parentbf3c7384ad1b1fce8beac97f8715eb054158f72e (diff)
downloadmv-de4548a50ecb4d4700c9899044f50070f7d9a95a.tar.gz
mv-de4548a50ecb4d4700c9899044f50070f7d9a95a.tar.bz2
mv-de4548a50ecb4d4700c9899044f50070f7d9a95a.tar.xz
mv-de4548a50ecb4d4700c9899044f50070f7d9a95a.zip
Add egg selection dialog.
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/gui/widgets/selldialog.cpp141
-rw-r--r--src/gui/widgets/selldialog.h16
-rw-r--r--src/gui/windows/eggselectiondialog.cpp79
-rw-r--r--src/gui/windows/eggselectiondialog.h45
-rw-r--r--src/gui/windows/npcselldialog.cpp2
-rw-r--r--src/gui/windows/shopselldialog.cpp2
-rw-r--r--src/gui/windows/shopwindow.cpp1
-rw-r--r--src/net/ea/buysellhandler.cpp1
-rw-r--r--src/net/eathena/pethandler.cpp18
11 files changed, 246 insertions, 63 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 548383039..7c3c5b973 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -350,6 +350,8 @@ SET(SRCS
gui/windows/editdialog.h
gui/windows/editserverdialog.cpp
gui/windows/editserverdialog.h
+ gui/windows/eggselectiondialog.cpp
+ gui/windows/eggselectiondialog.h
gui/windows/emotewindow.cpp
gui/windows/emotewindow.h
gui/windows/equipmentwindow.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index b8f7569d3..8125db4b6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -472,6 +472,8 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \
gui/windows/editdialog.h \
gui/windows/editserverdialog.cpp \
gui/windows/editserverdialog.h \
+ gui/windows/eggselectiondialog.cpp \
+ gui/windows/eggselectiondialog.h \
gui/windows/emotewindow.cpp \
gui/windows/emotewindow.h \
gui/windows/equipmentwindow.cpp \
diff --git a/src/gui/widgets/selldialog.cpp b/src/gui/widgets/selldialog.cpp
index 85eda5f43..611850398 100644
--- a/src/gui/widgets/selldialog.cpp
+++ b/src/gui/widgets/selldialog.cpp
@@ -55,14 +55,30 @@
SellDialog::DialogList SellDialog::instances;
-SellDialog::SellDialog() :
+SellDialog::SellDialog(const bool isSell) :
// TRANSLATORS: sell dialog name
Window(_("Sell"), false, nullptr, "sell.xml"),
ActionListener(),
SelectionListener(),
+ mSellButton(nullptr),
+ mQuitButton(nullptr),
+ mAddMaxButton(nullptr),
+ mIncreaseButton(nullptr),
+ mDecreaseButton(nullptr),
+ mShopItemList(nullptr),
+ mScrollArea(nullptr),
+ mMoneyLabel(nullptr),
+ mQuantityLabel(nullptr),
+ mSlider(nullptr),
+ mShopItems(nullptr),
mPlayerMoney(0),
mMaxItems(0),
- mAmountItems(0)
+ mAmountItems(0),
+ mIsSell(isSell)
+{
+}
+
+void SellDialog::postInit()
{
setWindowName("Sell");
setResizable(true);
@@ -85,33 +101,14 @@ SellDialog::SellDialog() :
getOptionBool("showbackground"), "sell_background.xml");
mScrollArea->setHorizontalScrollPolicy(ScrollArea::SHOW_NEVER);
- mSlider = new Slider(this, 1.0, 1.0);
-
- mQuantityLabel = new Label(this, strprintf(
- "%d / %d", mAmountItems, mMaxItems));
- mQuantityLabel->setAlignment(Graphics::CENTER);
- // TRANSLATORS: sell dialog label
- mMoneyLabel = new Label(this, strprintf(_("Price: %s / Total: %s"),
- "", ""));
-
- // TRANSLATORS: sell dialog button
- mIncreaseButton = new Button(this, _("+"), "inc", this);
- // TRANSLATORS: sell dialog button
- mDecreaseButton = new Button(this, _("-"), "dec", this);
// TRANSLATORS: sell dialog button
mSellButton = new Button(this, _("Sell"), "presell", this);
// TRANSLATORS: sell dialog button
mQuitButton = new Button(this, _("Quit"), "quit", this);
- // TRANSLATORS: sell dialog button
- mAddMaxButton = new Button(this, _("Max"), "max", this);
- mDecreaseButton->adjustSize();
- mDecreaseButton->setWidth(mIncreaseButton->getWidth());
+ initButtons();
- mIncreaseButton->setEnabled(false);
- mDecreaseButton->setEnabled(false);
mSellButton->setEnabled(false);
- mSlider->setEnabled(false);
mShopItemList->setDistributeMousePressed(false);
mShopItemList->setPriceCheck(false);
@@ -119,21 +116,50 @@ SellDialog::SellDialog() :
mShopItemList->setActionEventId("sell");
mShopItemList->addActionListener(this);
- mSlider->setActionEventId("slider");
- mSlider->addActionListener(this);
-
ContainerPlacer placer;
placer = getPlacer(0, 0);
- placer(0, 0, mScrollArea, 8, 5).setPadding(3);
- placer(0, 5, mDecreaseButton);
- placer(1, 5, mSlider, 3);
- placer(4, 5, mIncreaseButton);
- placer(5, 5, mQuantityLabel, 2);
- placer(7, 5, mAddMaxButton);
- placer(0, 6, mMoneyLabel, 8);
- placer(6, 7, mSellButton);
- placer(7, 7, mQuitButton);
+ if (mIsSell)
+ {
+ // TRANSLATORS: sell dialog button
+ mIncreaseButton = new Button(this, _("+"), "inc", this);
+ // TRANSLATORS: sell dialog button
+ mDecreaseButton = new Button(this, _("-"), "dec", this);
+ // TRANSLATORS: sell dialog button
+ mAddMaxButton = new Button(this, _("Max"), "max", this);
+ mSlider = new Slider(this, 1.0, 1.0);
+
+ mQuantityLabel = new Label(this, strprintf(
+ "%d / %d", mAmountItems, mMaxItems));
+ mQuantityLabel->setAlignment(Graphics::CENTER);
+ // TRANSLATORS: sell dialog label
+ mMoneyLabel = new Label(this, strprintf(_("Price: %s / Total: %s"),
+ "", ""));
+
+ mDecreaseButton->adjustSize();
+ mDecreaseButton->setWidth(mIncreaseButton->getWidth());
+ mIncreaseButton->setEnabled(false);
+ mDecreaseButton->setEnabled(false);
+ mSlider->setEnabled(false);
+ mSlider->setActionEventId("slider");
+ mSlider->addActionListener(this);
+
+ placer(0, 0, mScrollArea, 8, 5).setPadding(3);
+ placer(0, 5, mDecreaseButton);
+ placer(1, 5, mSlider, 3);
+ placer(4, 5, mIncreaseButton);
+ placer(5, 5, mQuantityLabel, 2);
+ placer(7, 5, mAddMaxButton);
+ placer(0, 6, mMoneyLabel, 8);
+ placer(6, 7, mSellButton);
+ placer(7, 7, mQuitButton);
+ }
+ else
+ {
+ placer(0, 0, mScrollArea, 8, 5).setPadding(3);
+ placer(6, 5, mSellButton);
+ placer(7, 5, mQuitButton);
+ }
Layout &layout = getLayout();
layout.setRowHeight(0, LayoutType::SET);
@@ -203,26 +229,25 @@ void SellDialog::action(const ActionEvent &event)
mAmountItems = static_cast<int>(mSlider->getValue());
updateButtonsAndLabels();
}
- else if (eventId == "inc" && mAmountItems < mMaxItems)
+ else if (eventId == "inc" && mSlider && mAmountItems < mMaxItems)
{
mAmountItems++;
mSlider->setValue(mAmountItems);
updateButtonsAndLabels();
}
- else if (eventId == "dec" && mAmountItems > 1)
+ else if (eventId == "dec" && mSlider && mAmountItems > 1)
{
mAmountItems--;
mSlider->setValue(mAmountItems);
updateButtonsAndLabels();
}
- else if (eventId == "max")
+ else if (eventId == "max" && mSlider)
{
mAmountItems = mMaxItems;
mSlider->setValue(mAmountItems);
updateButtonsAndLabels();
}
- else if ((eventId == "presell" || eventId == "sell" || eventId == "yes")
- && mAmountItems > 0 && mAmountItems <= mMaxItems)
+ else if (eventId == "presell" || eventId == "sell" || eventId == "yes")
{
sellAction(event);
}
@@ -232,10 +257,12 @@ void SellDialog::valueChanged(const SelectionEvent &event A_UNUSED)
{
// Reset amount of items and update labels
mAmountItems = 1;
- mSlider->setValue(0);
-
+ if (mSlider)
+ {
+ mSlider->setValue(0);
+ mSlider->setScale(1, mMaxItems);
+ }
updateButtonsAndLabels();
- mSlider->setScale(1, mMaxItems);
}
void SellDialog::setMoney(const int amount)
@@ -274,16 +301,26 @@ void SellDialog::updateButtonsAndLabels()
// Update Buttons and slider
mSellButton->setEnabled(mAmountItems > 0);
- mDecreaseButton->setEnabled(mAmountItems > 1);
- mIncreaseButton->setEnabled(mAmountItems < mMaxItems);
- mSlider->setEnabled(mMaxItems > 1);
-
- // Update the quantity and money labels
- 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()));
+ if (mDecreaseButton)
+ mDecreaseButton->setEnabled(mAmountItems > 1);
+ if (mIncreaseButton)
+ mIncreaseButton->setEnabled(mAmountItems < mMaxItems);
+ if (mSlider)
+ mSlider->setEnabled(mMaxItems > 1);
+
+ if (mQuantityLabel)
+ {
+ // Update the quantity and money labels
+ mQuantityLabel->setCaption(strprintf("%d / %d",
+ mAmountItems, mMaxItems));
+ }
+ if (mMoneyLabel)
+ {
+ // TRANSLATORS: sell dialog label
+ mMoneyLabel->setCaption(strprintf(_("Price: %s / Total: %s"),
+ Units::formatCurrency(income).c_str(),
+ Units::formatCurrency(mPlayerMoney + income).c_str()));
+ }
if (item)
item->update();
}
diff --git a/src/gui/widgets/selldialog.h b/src/gui/widgets/selldialog.h
index 8ae2168d0..d147947b5 100644
--- a/src/gui/widgets/selldialog.h
+++ b/src/gui/widgets/selldialog.h
@@ -48,15 +48,8 @@ class SellDialog notfinal : public Window,
public:
/**
* Constructor.
- *
- * @see Window::Window
- */
- SellDialog();
-
- /**
- * Constructor.
*/
- explicit SellDialog(const std::string &nick);
+ explicit SellDialog(const bool isSell);
A_DELETE_COPY(SellDialog)
@@ -111,6 +104,8 @@ class SellDialog notfinal : public Window,
*/
static void closeAll();
+ void postInit();
+
protected:
typedef std::list<SellDialog*> DialogList;
static DialogList instances;
@@ -122,6 +117,9 @@ class SellDialog notfinal : public Window,
virtual void sellAction(const ActionEvent &event) = 0;
+ virtual void initButtons()
+ { }
+
Button *mSellButton;
Button *mQuitButton;
Button *mAddMaxButton;
@@ -137,6 +135,8 @@ class SellDialog notfinal : public Window,
int mPlayerMoney;
int mMaxItems;
int mAmountItems;
+
+ bool mIsSell;
};
#endif // GUI_WIDGETS_SELLDIALOG_H
diff --git a/src/gui/windows/eggselectiondialog.cpp b/src/gui/windows/eggselectiondialog.cpp
new file mode 100644
index 000000000..bac963235
--- /dev/null
+++ b/src/gui/windows/eggselectiondialog.cpp
@@ -0,0 +1,79 @@
+/*
+ * 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/eggselectiondialog.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/inventoryhandler.h"
+
+#include "utils/gettext.h"
+
+#include "debug.h"
+
+EggSelectionDialog::EggSelectionDialog() :
+ SellDialog(false)
+{
+ // TRANSLATORS: egg selection dialog name
+ setWindowName(_("Select egg"));
+ // TRANSLATORS: egg selection dialog name
+ setCaption(_("Select egg"));
+}
+
+void EggSelectionDialog::initButtons()
+{
+ logger->log("EggSelectionDialog::initButtons");
+ // TRANSLATORS: egg selection dialog button
+ mSellButton->setCaption(_("Select"));
+ mSellButton->adjustSize();
+}
+
+void EggSelectionDialog::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)
+ return;
+ inventoryHandler->selectEgg(item);
+}
diff --git a/src/gui/windows/eggselectiondialog.h b/src/gui/windows/eggselectiondialog.h
new file mode 100644
index 000000000..c8b310c8f
--- /dev/null
+++ b/src/gui/windows/eggselectiondialog.h
@@ -0,0 +1,45 @@
+/*
+ * 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_EGGSELECTIONDIALOG_H
+#define GUI_WINDOWS_EGGSELECTIONDIALOG_H
+
+#include "gui/widgets/selldialog.h"
+
+class EggSelectionDialog final : public SellDialog
+{
+ public:
+ /**
+ * Constructor.
+ *
+ * @see Window::Window
+ */
+ EggSelectionDialog();
+
+ A_DELETE_COPY(EggSelectionDialog)
+
+ protected:
+ void initButtons() override final;
+ void sellAction(const ActionEvent &event) override final;
+};
+
+#endif // GUI_WINDOWS_EGGSELECTIONDIALOG_H
diff --git a/src/gui/windows/npcselldialog.cpp b/src/gui/windows/npcselldialog.cpp
index a50c31e29..2e4cd6d07 100644
--- a/src/gui/windows/npcselldialog.cpp
+++ b/src/gui/windows/npcselldialog.cpp
@@ -54,7 +54,7 @@
#include "debug.h"
NpcSellDialog::NpcSellDialog(const int npcId) :
- SellDialog(),
+ SellDialog(true),
mNpcId(npcId)
{
}
diff --git a/src/gui/windows/shopselldialog.cpp b/src/gui/windows/shopselldialog.cpp
index 44b15fd42..08abd6047 100644
--- a/src/gui/windows/shopselldialog.cpp
+++ b/src/gui/windows/shopselldialog.cpp
@@ -54,7 +54,7 @@
#include "debug.h"
ShopSellDialog::ShopSellDialog(const std::string &nick) :
- SellDialog(),
+ SellDialog(true),
mNick(nick)
{
}
diff --git a/src/gui/windows/shopwindow.cpp b/src/gui/windows/shopwindow.cpp
index 0fb2a952f..8e5a847c0 100644
--- a/src/gui/windows/shopwindow.cpp
+++ b/src/gui/windows/shopwindow.cpp
@@ -653,6 +653,7 @@ void ShopWindow::showList(const std::string &nick, std::string data)
{
data = data.substr(2);
sellDialog = new ShopSellDialog(nick);
+ sellDialog->postInit();
}
else
{
diff --git a/src/net/ea/buysellhandler.cpp b/src/net/ea/buysellhandler.cpp
index fe2f7ffe0..b28681cb9 100644
--- a/src/net/ea/buysellhandler.cpp
+++ b/src/net/ea/buysellhandler.cpp
@@ -147,6 +147,7 @@ void BuySellHandler::processNpcSell(Net::MessageIn &msg) const
if (n_items > 0)
{
SellDialog *const dialog = new NpcSellDialog(mNpcId);
+ dialog->postInit();
dialog->setMoney(PlayerInfo::getAttribute(Attributes::MONEY));
for (int k = 0; k < n_items; k++)
diff --git a/src/net/eathena/pethandler.cpp b/src/net/eathena/pethandler.cpp
index bb513b6ac..9b2f3b22b 100644
--- a/src/net/eathena/pethandler.cpp
+++ b/src/net/eathena/pethandler.cpp
@@ -20,13 +20,20 @@
#include "net/eathena/pethandler.h"
+#include "inventory.h"
#include "notifymanager.h"
+#include "being/playerinfo.h"
+
#include "gui/chatconsts.h"
+#include "gui/windows/eggselectiondialog.h"
+
#include "net/chathandler.h"
#include "net/net.h"
+#include "net/ea/eaprotocol.h"
+
#include "net/eathena/menu.h"
#include "net/eathena/messageout.h"
#include "net/eathena/protocol.h"
@@ -149,9 +156,18 @@ void PetHandler::processEggsList(Net::MessageIn &msg)
{
const int count = (msg.readInt16("len") - 4) / 2;
menu = MenuType::Eggs;
+
+ SellDialog *const dialog = new EggSelectionDialog;
+ dialog->postInit();
+ Inventory *const inv = PlayerInfo::getInventory();
+
for (int f = 0; f < count; f ++)
{
- msg.readInt16("egg index");
+ const int index = msg.readInt16("index") - INVENTORY_OFFSET;
+ const Item *const item = inv->getItem(index);
+
+ if (item)
+ dialog->addItem(item, 0);
}
}