diff options
author | Guillaume Melquiond <guillaume.melquiond@gmail.com> | 2007-10-19 10:48:45 +0000 |
---|---|---|
committer | Guillaume Melquiond <guillaume.melquiond@gmail.com> | 2007-10-19 10:48:45 +0000 |
commit | 4ea68b6102053d591516ff3bc83512c71e2c8ce9 (patch) | |
tree | 33d36396a350525afc2726432f26418092e705a4 /src/gui | |
parent | 46d62ec078de6edabc1979dbdbe7d51189cf2143 (diff) | |
download | mana-4ea68b6102053d591516ff3bc83512c71e2c8ce9.tar.gz mana-4ea68b6102053d591516ff3bc83512c71e2c8ce9.tar.bz2 mana-4ea68b6102053d591516ff3bc83512c71e2c8ce9.tar.xz mana-4ea68b6102053d591516ff3bc83512c71e2c8ce9.zip |
Allowed dragging of already selected items.
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/itemcontainer.cpp | 69 | ||||
-rw-r--r-- | src/gui/itemcontainer.h | 3 |
2 files changed, 50 insertions, 22 deletions
diff --git a/src/gui/itemcontainer.cpp b/src/gui/itemcontainer.cpp index 78b62a28..c51204a7 100644 --- a/src/gui/itemcontainer.cpp +++ b/src/gui/itemcontainer.cpp @@ -46,6 +46,15 @@ static const int BOX_WIDTH = 36; static const int BOX_HEIGHT = 44; +enum +{ + SEL_NONE = 0, + SEL_SELECTED, + SEL_SELECTING, + SEL_DESELECTING, + SEL_DRAGGING +}; + ItemContainer::ItemContainer(Inventory *inventory, int gridColumns = 1, int gridRows = 1): mInventory(inventory), @@ -53,7 +62,7 @@ ItemContainer::ItemContainer(Inventory *inventory, mGridRows(gridRows), mSelectedItem(NULL), mHighlightedItem(NULL), - mDragged(false), + mSelectionStatus(SEL_NONE), mSwapItems(false) { setFocusable(true); @@ -104,7 +113,7 @@ ItemContainer::draw(gcn::Graphics *graphics) { if (item == mSelectedItem) { - if (mDragged) { + if (mSelectionStatus == SEL_DRAGGING) { // Reposition the coords to that of the cursor. itemX = mDragPosX - (BOX_WIDTH / 2); itemY = mDragPosY - (BOX_HEIGHT / 2); @@ -146,8 +155,7 @@ ItemContainer::selectNone() setSelectedItem(NULL); } -void -ItemContainer::setSelectedItem(Item *item) +void ItemContainer::setSelectedItem(Item *item) { if (mSelectedItem != item) { @@ -175,16 +183,16 @@ ItemContainer::keyPressed(gcn::KeyEvent &event) switch (event.getKey().getValue()) { case Key::LEFT: - moveHighlight(ItemContainer::MOVE_SELECTED_LEFT); + moveHighlight(MOVE_SELECTED_LEFT); break; case Key::RIGHT: - moveHighlight(ItemContainer::MOVE_SELECTED_RIGHT); + moveHighlight(MOVE_SELECTED_RIGHT); break; case Key::UP: - moveHighlight(ItemContainer::MOVE_SELECTED_UP); + moveHighlight(MOVE_SELECTED_UP); break; case Key::DOWN: - moveHighlight(ItemContainer::MOVE_SELECTED_DOWN); + moveHighlight(MOVE_SELECTED_DOWN); break; case Key::SPACE: keyAction(); @@ -220,14 +228,19 @@ ItemContainer::mousePressed(gcn::MouseEvent &event) Item *item = mInventory->getItem(index); - if (mSelectedItem && mSelectedItem == item) { - setSelectedItem(NULL); + if (mSelectedItem && mSelectedItem == item) + { + mSelectionStatus = SEL_DESELECTING; } - else if (item->getId()) { + else if (item->getId()) + { setSelectedItem(item); + mSelectionStatus = SEL_SELECTING; } - else { + else + { setSelectedItem(NULL); + mSelectionStatus = SEL_NONE; } } } @@ -235,11 +248,9 @@ ItemContainer::mousePressed(gcn::MouseEvent &event) void ItemContainer::mouseDragged(gcn::MouseEvent &event) { - if (mSelectedItem) + if (mSelectionStatus != SEL_NONE) { - if (!mDragged) { - mDragged = true; - } + mSelectionStatus = SEL_DRAGGING; mDragPosX = event.getX(); mDragPosY = event.getY(); } @@ -247,16 +258,29 @@ ItemContainer::mouseDragged(gcn::MouseEvent &event) void ItemContainer::mouseReleased(gcn::MouseEvent &event) { - if (!mDragged) return; - mDragged = false; - if (!mSelectedItem) return; + switch (mSelectionStatus) + { + case SEL_SELECTING: + mSelectionStatus = SEL_SELECTED; + return; + case SEL_DESELECTING: + setSelectedItem(NULL); + mSelectionStatus = SEL_NONE; + return; + case SEL_DRAGGING: + mSelectionStatus = SEL_SELECTED; + break; + default: + return; + }; + int index = getSlotIndex(event.getX(), event.getY()); if (index == Inventory::NO_SLOT_INDEX) return; Item *item = mInventory->getItem(index); if (item == mSelectedItem) return; player_node->moveInvItem(mSelectedItem, index); - item = mInventory->getItem(index); - setSelectedItem(item->getId() ? item : NULL); + setSelectedItem(NULL); + mSelectionStatus = SEL_NONE; } int @@ -282,6 +306,7 @@ ItemContainer::keyAction() if (mHighlightedItem == mSelectedItem) { setSelectedItem(NULL); + mSelectionStatus = SEL_NONE; } // Check and swap items if necessary. else if (mSwapItems && @@ -296,6 +321,7 @@ ItemContainer::keyAction() else if (mHighlightedItem->getId()) { setSelectedItem(mHighlightedItem); + mSelectionStatus = SEL_SELECTED; } // If the highlight is on a blank space then move it. else if (mSelectedItem) @@ -303,6 +329,7 @@ ItemContainer::keyAction() player_node->moveInvItem( mSelectedItem, mHighlightedItem->getInvIndex()); setSelectedItem(NULL); + mSelectionStatus = SEL_NONE; } } diff --git a/src/gui/itemcontainer.h b/src/gui/itemcontainer.h index 38dc9f6e..8be338dd 100644 --- a/src/gui/itemcontainer.h +++ b/src/gui/itemcontainer.h @@ -160,7 +160,8 @@ class ItemContainer : public gcn::Widget, int mGridColumns, mGridRows; Image *mSelImg; Item *mSelectedItem, *mHighlightedItem; - bool mDragged, mSwapItems; + int mSelectionStatus; + bool mSwapItems; int mDragPosX, mDragPosY; std::list<SelectionListener*> mListeners; |