diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/enums/dragdropsource.h | 3 | ||||
-rw-r--r-- | src/enums/inventorytype.h | 1 | ||||
-rw-r--r-- | src/gui/popups/popupmenu.cpp | 1 | ||||
-rw-r--r-- | src/gui/widgets/itemcontainer.cpp | 15 | ||||
-rw-r--r-- | src/gui/windows/inventorywindow.cpp | 4 | ||||
-rw-r--r-- | src/gui/windows/itemamountwindow.cpp | 9 | ||||
-rw-r--r-- | src/gui/windows/itemamountwindow.h | 3 | ||||
-rw-r--r-- | src/gui/windows/mailedit.cpp | 82 | ||||
-rw-r--r-- | src/gui/windows/mailedit.h | 13 | ||||
-rw-r--r-- | src/gui/windows/mailwindow.cpp | 4 | ||||
-rw-r--r-- | src/inventory.cpp | 5 |
11 files changed, 126 insertions, 14 deletions
diff --git a/src/enums/dragdropsource.h b/src/enums/dragdropsource.h index c9271abce..aecd46287 100644 --- a/src/enums/dragdropsource.h +++ b/src/enums/dragdropsource.h @@ -36,7 +36,8 @@ enum DragDropSource DRAGDROP_SOURCE_SHORTCUTS, DRAGDROP_SOURCE_CRAFT, DRAGDROP_SOURCE_NPC, - DRAGDROP_SOURCE_EQUIPMENT + DRAGDROP_SOURCE_EQUIPMENT, + DRAGDROP_SOURCE_MAIL }; #endif // ENUMS_DRAGDROPSOURCE_H diff --git a/src/enums/inventorytype.h b/src/enums/inventorytype.h index a492de2ce..37fad1890 100644 --- a/src/enums/inventorytype.h +++ b/src/enums/inventorytype.h @@ -34,6 +34,7 @@ namespace InventoryType NPC, #ifdef EATHENA_SUPPORT VENDING, + MAIL, #endif TYPE_END }; diff --git a/src/gui/popups/popupmenu.cpp b/src/gui/popups/popupmenu.cpp index a2d8b1ef5..f01a57a4e 100644 --- a/src/gui/popups/popupmenu.cpp +++ b/src/gui/popups/popupmenu.cpp @@ -1716,6 +1716,7 @@ void PopupMenu::showPopup(Window *const parent, case InventoryType::NPC: #ifdef EATHENA_SUPPORT case InventoryType::VENDING: + case InventoryType::MAIL: #endif case InventoryType::TYPE_END: default: diff --git a/src/gui/widgets/itemcontainer.cpp b/src/gui/widgets/itemcontainer.cpp index 6d2c72c5c..723f043d7 100644 --- a/src/gui/widgets/itemcontainer.cpp +++ b/src/gui/widgets/itemcontainer.cpp @@ -421,6 +421,11 @@ void ItemContainer::mousePressed(MouseEvent &event) case InventoryType::CART: src = DRAGDROP_SOURCE_CART; break; +#ifdef EATHENA_SUPPORT + case InventoryType::MAIL: + src = DRAGDROP_SOURCE_MAIL; + break; +#endif default: #ifdef EATHENA_SUPPORT case InventoryType::VENDING: @@ -520,6 +525,11 @@ void ItemContainer::mouseReleased(MouseEvent &event) case InventoryType::NPC: dst = DRAGDROP_SOURCE_NPC; break; +#ifdef EATHENA_SUPPORT + case InventoryType::MAIL: + dst = DRAGDROP_SOURCE_MAIL; + break; +#endif case InventoryType::CART: dst = DRAGDROP_SOURCE_CART; break; @@ -585,7 +595,8 @@ void ItemContainer::mouseReleased(MouseEvent &event) inventory = PlayerInfo::getInventory(); } else if (src == DRAGDROP_SOURCE_INVENTORY - && dst == DRAGDROP_SOURCE_NPC) + && (dst == DRAGDROP_SOURCE_NPC + || dst == DRAGDROP_SOURCE_MAIL)) { inventory = PlayerInfo::getInventory(); const Item *const item = inventory->getItem(dragDrop.getTag()); @@ -603,7 +614,7 @@ void ItemContainer::mouseReleased(MouseEvent &event) } return; } - else if (src == DRAGDROP_SOURCE_NPC) + else if (src == DRAGDROP_SOURCE_NPC || src == DRAGDROP_SOURCE_MAIL) { inventory = PlayerInfo::getInventory(); const Item *const item = inventory->getItem(dragDrop.getTag()); diff --git a/src/gui/windows/inventorywindow.cpp b/src/gui/windows/inventorywindow.cpp index 28367d2c0..5712bb436 100644 --- a/src/gui/windows/inventorywindow.cpp +++ b/src/gui/windows/inventorywindow.cpp @@ -120,6 +120,7 @@ InventoryWindow::InventoryWindow(Inventory *const inventory) : case InventoryType::NPC: #ifdef EATHENA_SUPPORT case InventoryType::VENDING: + case InventoryType::MAIL: #endif case InventoryType::TYPE_END: default: @@ -303,6 +304,7 @@ InventoryWindow::InventoryWindow(Inventory *const inventory) : case InventoryType::NPC: #ifdef EATHENA_SUPPORT case InventoryType::VENDING: + case InventoryType::MAIL: #endif case InventoryType::TYPE_END: break; @@ -362,6 +364,7 @@ void InventoryWindow::storeSortOrder() const case InventoryType::NPC: #ifdef EATHENA_SUPPORT case InventoryType::VENDING: + case InventoryType::MAIL: #endif case InventoryType::TYPE_END: default: @@ -808,6 +811,7 @@ void InventoryWindow::close() case InventoryType::NPC: #ifdef EATHENA_SUPPORT case InventoryType::VENDING: + case InventoryType::MAIL: #endif case InventoryType::TYPE_END: break; diff --git a/src/gui/windows/itemamountwindow.cpp b/src/gui/windows/itemamountwindow.cpp index 7198d087a..d1cf9138c 100644 --- a/src/gui/windows/itemamountwindow.cpp +++ b/src/gui/windows/itemamountwindow.cpp @@ -35,6 +35,7 @@ #include "gui/popups/itempopup.h" +#include "gui/windows/mailedit.h" #include "gui/windows/shopwindow.h" #include "gui/windows/tradewindow.h" @@ -93,6 +94,10 @@ void ItemAmountWindow::finish(const Item *const item, if (shopWindow) shopWindow->addSellItem(item, amount, price); break; + case MailAdd: + if (mailEditWindow) + mailEditWindow->addItem(item, amount); + break; default: break; } @@ -234,6 +239,10 @@ ItemAmountWindow::ItemAmountWindow(const Usage usage, Window *const parent, // TRANSLATORS: amount window message setCaption(_("Select amount of items to store.")); break; + case MailAdd: + // TRANSLATORS: amount window message + setCaption(_("Select amount of items to send.")); + break; case CartAdd: // TRANSLATORS: amount window message setCaption(_("Select amount of items to store to cart.")); diff --git a/src/gui/windows/itemamountwindow.h b/src/gui/windows/itemamountwindow.h index 8ce4f13c6..92d0341e0 100644 --- a/src/gui/windows/itemamountwindow.h +++ b/src/gui/windows/itemamountwindow.h @@ -56,7 +56,8 @@ class ItemAmountWindow final : public Window, CartRemove, ItemSplit, ShopBuyAdd, - ShopSellAdd + ShopSellAdd, + MailAdd }; A_DELETE_COPY(ItemAmountWindow) diff --git a/src/gui/windows/mailedit.cpp b/src/gui/windows/mailedit.cpp index 14e36063c..ba3972992 100644 --- a/src/gui/windows/mailedit.cpp +++ b/src/gui/windows/mailedit.cpp @@ -20,16 +20,24 @@ #include "gui/windows/mailedit.h" +#include "inventory.h" +#include "item.h" + +#include "being/playerinfo.h" #include "net/mailhandler.h" +#include "gui/windows/inventorywindow.h" +#include "gui/windows/itemamountwindow.h" #include "gui/windows/setupwindow.h" #include "gui/widgets/button.h" #include "gui/widgets/containerplacer.h" #include "gui/widgets/inttextfield.h" +#include "gui/widgets/itemcontainer.h" #include "gui/widgets/label.h" #include "gui/widgets/layout.h" #include "gui/widgets/layouttype.h" +#include "gui/widgets/scrollarea.h" #include "gui/widgets/textfield.h" #include "utils/gettext.h" @@ -37,14 +45,18 @@ #include "debug.h" +MailEdit *mailEditWindow = nullptr; + MailEdit::MailEdit() : // TRANSLATORS: mail edit window name - Window(_("Edit mail"), true, nullptr, "mailedit.xml"), + Window(_("Edit mail"), false, nullptr, "mailedit.xml"), ActionListener(), // TRANSLATORS: mail edit window button mSendButton(new Button(this, _("Send"), "send", this)), // TRANSLATORS: mail edit window button mCloseButton(new Button(this, _("Close"), "close", this)), + // TRANSLATORS: mail edit window button + mAddButton(new Button(this, _("Add"), "add", this)), // TRANSLATORS: mail edit window label mToLabel(new Label(this, _("To:"))), // TRANSLATORS: mail edit window label @@ -52,11 +64,17 @@ MailEdit::MailEdit() : // TRANSLATORS: mail edit window label mMoneyLabel(new Label(this, _("Money:"))), // TRANSLATORS: mail edit window label + mItemLabel(new Label(this, _("Item:"))), + // TRANSLATORS: mail edit window label mMessageLabel(new Label(this, _("Message:"))), mToField(new TextField(this)), mSubjectField(new TextField(this)), mMoneyField(new IntTextField(this, 0, 0, 10000000)), - mMessageField(new TextField(this)) + mMessageField(new TextField(this)), + mInventory(new Inventory(InventoryType::MAIL, 1)), + mItemContainer(new ItemContainer(this, mInventory)), + mItemScrollArea(new ScrollArea(this, mItemContainer, + getOptionBool("showitemsbackground"), "mailedit_listbackground.xml")) { setWindowName("MailEdit"); setCloseButton(true); @@ -77,17 +95,26 @@ MailEdit::MailEdit() : mToField->setWidth(100); mSubjectField->setWidth(100); mMessageField->setWidth(100); + mItemScrollArea->setHeight(70); + + mItemScrollArea->setHorizontalScrollPolicy(ScrollArea::SHOW_NEVER); + mItemScrollArea->setVerticalScrollPolicy(ScrollArea::SHOW_NEVER); placer(0, 0, mToLabel); - placer(1, 0, mToField, 2); + placer(1, 0, mToField, 3); placer(0, 1, mSubjectLabel); - placer(1, 1, mSubjectField, 2); + placer(1, 1, mSubjectField, 3); placer(0, 2, mMoneyLabel); - placer(1, 2, mMoneyField, 2); - placer(0, 3, mMessageLabel); - placer(1, 3, mMessageField, 2); - placer(0, 4, mSendButton); - placer(2, 4, mCloseButton); + placer(1, 2, mMoneyField, 3); +// placer(0, 3, mItemScrollArea, 3); + placer(0, 3, mItemLabel); + placer(1, 3, mItemScrollArea, 2, 2); + placer(3, 4, mAddButton, 1); + + placer(0, 5, mMessageLabel); + placer(1, 5, mMessageField, 3); + placer(0, 6, mSendButton); + placer(3, 6, mCloseButton); loadWindowState(); enableVisibleSound(true); @@ -95,6 +122,7 @@ MailEdit::MailEdit() : MailEdit::~MailEdit() { + mailEditWindow = nullptr; } void MailEdit::action(const ActionEvent &event) @@ -109,8 +137,44 @@ void MailEdit::action(const ActionEvent &event) const int money = mMoneyField->getValue(); if (money) mailHandler->setAttachMoney(money); + const Item *const tempItem = mInventory->getItem(0); + if (tempItem) + { + const Inventory *const inv = PlayerInfo::getInventory(); + const Item *const item = inv->findItem(tempItem->getId(), 1); + if (item) + { + mailHandler->setAttach(item->getInvIndex(), + tempItem->getQuantity()); + } + } + mailHandler->send(mToField->getText(), mSubjectField->getText(), mMessageField->getText()); } + else if (eventId == "add") + { + Item *const item = inventoryWindow->getSelectedItem(); + + if (!item) + return; + + ItemAmountWindow::showWindow(ItemAmountWindow::MailAdd, + this, item); + } +} + +void MailEdit::addItem(const Item *const item, const int amount) +{ + mInventory->addItem(item->getId(), + item->getType(), + amount, + item->getRefine(), + item->getColor(), + item->getIdentified(), + item->getDamaged(), + item->getFavorite(), + Equipm_false, + Equipped_false); } diff --git a/src/gui/windows/mailedit.h b/src/gui/windows/mailedit.h index 5cd482a53..57ae40828 100644 --- a/src/gui/windows/mailedit.h +++ b/src/gui/windows/mailedit.h @@ -29,7 +29,11 @@ class Button; class IntTextField; +class Inventory; +class Item; +class ItemContainer; class Label; +class ScrollArea; class TextField; class MailEdit final : public Window, @@ -44,18 +48,27 @@ class MailEdit final : public Window, void action(const ActionEvent &event) override final; + void addItem(const Item *const item, const int amount); + private: Button *mSendButton; Button *mCloseButton; + Button *mAddButton; Label *mToLabel; Label *mSubjectLabel; Label *mMoneyLabel; + Label *mItemLabel; Label *mMessageLabel; TextField *mToField; TextField *mSubjectField; IntTextField *mMoneyField; TextField *mMessageField; + Inventory *mInventory; + ItemContainer *mItemContainer; + ScrollArea *mItemScrollArea; }; +extern MailEdit *mailEditWindow; + #endif // EATHENA_SUPPORT #endif // GUI_WINDOWS_MAILEDIT_H diff --git a/src/gui/windows/mailwindow.cpp b/src/gui/windows/mailwindow.cpp index e9933b307..ef6444405 100644 --- a/src/gui/windows/mailwindow.cpp +++ b/src/gui/windows/mailwindow.cpp @@ -109,7 +109,8 @@ void MailWindow::action(const ActionEvent &event) } else if (eventId == "new") { - new MailEdit(); + if (!mailEditWindow) + mailEditWindow = new MailEdit(); } else if (eventId == "open") { @@ -124,6 +125,7 @@ void MailWindow::action(const ActionEvent &event) void MailWindow::clear() { delete_all(mMessages); + mMessages.clear(); mMailModel->clear(); mListBox->setSelected(-1); } diff --git a/src/inventory.cpp b/src/inventory.cpp index c2e9daf1e..f2acdbeda 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -315,6 +315,11 @@ std::string Inventory::getName() const // TRANSLATORS: inventory type name return N_("Npc"); } + case InventoryType::MAIL: + { + // TRANSLATORS: inventory type name + return N_("Mail"); + } case InventoryType::TRADE: { // TRANSLATORS: inventory type name |