From de4548a50ecb4d4700c9899044f50070f7d9a95a Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 22 Sep 2014 19:48:04 +0300 Subject: Add egg selection dialog. --- src/CMakeLists.txt | 2 + src/Makefile.am | 2 + src/gui/widgets/selldialog.cpp | 141 +++++++++++++++++++++------------ src/gui/widgets/selldialog.h | 16 ++-- src/gui/windows/eggselectiondialog.cpp | 79 ++++++++++++++++++ src/gui/windows/eggselectiondialog.h | 45 +++++++++++ src/gui/windows/npcselldialog.cpp | 2 +- src/gui/windows/shopselldialog.cpp | 2 +- src/gui/windows/shopwindow.cpp | 1 + src/net/ea/buysellhandler.cpp | 1 + src/net/eathena/pethandler.cpp | 18 ++++- 11 files changed, 246 insertions(+), 63 deletions(-) create mode 100644 src/gui/windows/eggselectiondialog.cpp create mode 100644 src/gui/windows/eggselectiondialog.h 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(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 @@ -46,17 +46,10 @@ class SellDialog notfinal : public Window, private SelectionListener { 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 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 . + */ + +#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 . + */ + +#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); } } -- cgit v1.2.3-60-g2f50