From 1ec82e44a0ec44a3d342a68b42b318e4413410dc Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 17 Jun 2012 23:07:29 +0300 Subject: Fix double click support in gui class. Add double click support to inventory and storage windows. --- src/gui/gui.cpp | 6 +++++ src/gui/gui.h | 2 ++ src/gui/inventorywindow.cpp | 48 +++++++++++++++++++++++++++++++++++++++ src/gui/widgets/itemcontainer.cpp | 9 +++++++- src/gui/widgets/itemcontainer.h | 4 ++++ 5 files changed, 68 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index f513c31a1..afced01b2 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -581,3 +581,9 @@ void Gui::distributeMouseEvent(gcn::Widget* source, int type, int button, } } } + +void Gui::resetClickCount() +{ + mClickCount = 1; + mLastMousePressTimeStamp = 0; +} diff --git a/src/gui/gui.h b/src/gui/gui.h index 845c07660..9468d2b68 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -121,6 +121,8 @@ class Gui : public gcn::Gui bool handleKeyInput2(); + void resetClickCount(); + /** * Cursors are in graphic order from left to right. * CURSOR_POINTER should be left untouched. diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp index c20dd0036..ccfb12d8a 100644 --- a/src/gui/inventorywindow.cpp +++ b/src/gui/inventorywindow.cpp @@ -31,6 +31,7 @@ #include "playerinfo.h" #include "units.h" +#include "gui/gui.h" #include "gui/itemamountwindow.h" #include "gui/setup.h" #include "gui/sdlinput.h" @@ -322,7 +323,9 @@ void InventoryWindow::action(const gcn::ActionEvent &event) Net::getInventoryHandler()->equipItem(item); } else + { Net::getInventoryHandler()->useItem(item); + } } if (event.getId() == "equip") { @@ -334,7 +337,9 @@ void InventoryWindow::action(const gcn::ActionEvent &event) Net::getInventoryHandler()->equipItem(item); } else + { Net::getInventoryHandler()->useItem(item); + } } else if (event.getId() == "drop") { @@ -391,6 +396,11 @@ void InventoryWindow::mouseClicked(gcn::MouseEvent &event) { Window::mouseClicked(event); + const int clicks = event.getClickCount(); + + if (clicks == 2 && gui) + gui->resetClickCount(); + const bool mod = (isStorageActive() && inputManager.isActionActive( Input::KEY_MOD)); @@ -469,6 +479,44 @@ void InventoryWindow::mouseClicked(gcn::MouseEvent &event) tradeWindow->tradeItem(item, item->getQuantity(), true); } } + else if (clicks == 2) + { + if (mInventory->isMainInventory()) + { + if (isStorageActive()) + { + ItemAmountWindow::showWindow(ItemAmountWindow::StoreAdd, + inventoryWindow, item); + } + else if (tradeWindow && tradeWindow->isVisible()) + { + ItemAmountWindow::showWindow(ItemAmountWindow::TradeAdd, + tradeWindow, item); + } + else + { + if (item->isEquipment()) + { + if (item->isEquipped()) + Net::getInventoryHandler()->unequipItem(item); + else + Net::getInventoryHandler()->equipItem(item); + } + else + { + Net::getInventoryHandler()->useItem(item); + } + } + } + else + { + if (isStorageActive()) + { + ItemAmountWindow::showWindow(ItemAmountWindow::StoreRemove, + inventoryWindow, item); + } + } + } } } diff --git a/src/gui/widgets/itemcontainer.cpp b/src/gui/widgets/itemcontainer.cpp index 5994b1e1a..3f3bbe937 100644 --- a/src/gui/widgets/itemcontainer.cpp +++ b/src/gui/widgets/itemcontainer.cpp @@ -30,6 +30,7 @@ #include "logger.h" #include "gui/chatwindow.h" +#include "gui/gui.h" #include "gui/itempopup.h" #include "gui/outfitwindow.h" #include "gui/palette.h" @@ -167,6 +168,7 @@ ItemContainer::ItemContainer(Inventory *inventory, bool forceQuantity): mSortType(0), mItemPopup(new ItemPopup), mShowMatrix(nullptr), + mClicks(1), mEquipedColor(Theme::getThemeColor(Theme::ITEM_EQUIPPED)), mUnEquipedColor(Theme::getThemeColor(Theme::ITEM_NOT_EQUIPPED)) { @@ -347,6 +349,8 @@ void ItemContainer::mousePressed(gcn::MouseEvent &event) return; const int button = event.getButton(); + mClicks = event.getClickCount(); + if (button == gcn::MouseEvent::LEFT || button == gcn::MouseEvent::RIGHT) { const int index = getSlotIndex(event.getX(), event.getY()); @@ -359,7 +363,7 @@ void ItemContainer::mousePressed(gcn::MouseEvent &event) if (item && mDescItems && chatWindow) chatWindow->addItemText(item->getInfo().getName()); - if (mSelectedIndex == index) + if (mSelectedIndex == index && mClicks != 2) { mSelectionStatus = SEL_DESELECTING; } @@ -400,6 +404,9 @@ void ItemContainer::mouseDragged(gcn::MouseEvent &event) void ItemContainer::mouseReleased(gcn::MouseEvent &event) { + if (mClicks == 2) + return; + switch (mSelectionStatus) { case SEL_SELECTING: diff --git a/src/gui/widgets/itemcontainer.h b/src/gui/widgets/itemcontainer.h index ae6e4a35d..0ad95fd1b 100644 --- a/src/gui/widgets/itemcontainer.h +++ b/src/gui/widgets/itemcontainer.h @@ -126,6 +126,9 @@ class ItemContainer : public gcn::Widget, void updateMatrix(); + bool getClickCount() + { return mClicks; } + private: enum Direction { @@ -197,6 +200,7 @@ class ItemContainer : public gcn::Widget, ItemPopup *mItemPopup; int *mShowMatrix; + int mClicks; typedef std::list SelectionListenerList; typedef SelectionListenerList::iterator SelectionListenerIterator; -- cgit v1.2.3-60-g2f50