diff options
author | Andrei Karas <akaras@inbox.ru> | 2014-03-15 20:16:16 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2014-03-15 20:16:16 +0300 |
commit | 5c83a96b8ad85ad0562542b9720a0df6c5fb550c (patch) | |
tree | 1759cd93802d506583c7030119f1115b0444e226 /src/gui/viewport.cpp | |
parent | a260aeab234704ace8ba672b1d1ce57e18425e07 (diff) | |
parent | 22cb237571e06395ec241377721c02716f0ea8a7 (diff) | |
download | manaverse-5c83a96b8ad85ad0562542b9720a0df6c5fb550c.tar.gz manaverse-5c83a96b8ad85ad0562542b9720a0df6c5fb550c.tar.bz2 manaverse-5c83a96b8ad85ad0562542b9720a0df6c5fb550c.tar.xz manaverse-5c83a96b8ad85ad0562542b9720a0df6c5fb550c.zip |
Merge branch 'master' into stable
Diffstat (limited to 'src/gui/viewport.cpp')
-rw-r--r-- | src/gui/viewport.cpp | 326 |
1 files changed, 195 insertions, 131 deletions
diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index 96760f8c7..c2000b562 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -53,30 +53,34 @@ Viewport::Viewport() : WindowContainer(nullptr), MouseListener(), mMap(nullptr), + mPopupMenu(new PopupMenu), + mHoverBeing(nullptr), + mHoverItem(nullptr), + mHoverSign(nullptr), + mBeingPopup(new BeingPopup), + mTextPopup(new TextPopup), mScrollRadius(config.getIntValue("ScrollRadius")), mScrollLaziness(config.getIntValue("ScrollLaziness")), - mShowBeingPopup(config.getBoolValue("showBeingPopup")), - mSelfMouseHeal(config.getBoolValue("selfMouseHeal")), - mEnableLazyScrolling(config.getBoolValue("enableLazyScrolling")), mScrollCenterOffsetX(config.getIntValue("ScrollCenterOffsetX")), mScrollCenterOffsetY(config.getIntValue("ScrollCenterOffsetY")), - mMouseDirectionMove(config.getBoolValue("mouseDirectionMove")), mMouseX(0), mMouseY(0), + mMousePressX(0), + mMousePressY(0), mPixelViewX(0), mPixelViewY(0), - mShowDebugPath(false), + mShowDebugPath(Map::MAP_NORMAL), mCameraMode(0), - mPlayerFollowMouse(false), mLocalWalkTime(-1), - mPopupMenu(new PopupMenu), - mHoverBeing(nullptr), - mHoverItem(nullptr), - mHoverSign(nullptr), - mBeingPopup(new BeingPopup), - mTextPopup(new TextPopup), mCameraRelativeX(0), - mCameraRelativeY(0) + mCameraRelativeY(0), + mShowBeingPopup(config.getBoolValue("showBeingPopup")), + mSelfMouseHeal(config.getBoolValue("selfMouseHeal")), + mEnableLazyScrolling(config.getBoolValue("enableLazyScrolling")), + mMouseDirectionMove(config.getBoolValue("mouseDirectionMove")), + mLongMouseClick(config.getBoolValue("longmouseclick")), + mMouseClicked(false), + mPlayerFollowMouse(false) { mBeingPopup->postInit(); mPopupMenu->postInit(); @@ -91,6 +95,7 @@ Viewport::Viewport() : config.addListener("selfMouseHeal", this); config.addListener("enableLazyScrolling", this); config.addListener("mouseDirectionMove", this); + config.addListener("longmouseclick", this); setFocusable(true); } @@ -281,17 +286,13 @@ void Viewport::_followMouse() { // We create a mouse event and send it to mouseDragged. MouseEvent mouseEvent(nullptr, - 0, - false, - false, - false, MouseEvent::DRAGGED, MouseEvent::LEFT, mMouseX, mMouseY, 0); - mouseDragged(mouseEvent); + walkByMouse(mouseEvent); } } @@ -360,151 +361,170 @@ void Viewport::_drawPath(Graphics *const graphics, const Path &path, } } -void Viewport::mousePressed(MouseEvent &event) +bool Viewport::openContextMenu(const MouseEvent &event) { - if (event.getSource() != this) - return; - - // Check if we are alive and kickin' - if (!mMap || !player_node) - return; - - // Check if we are busy - // if commented, allow context menu if npc dialog open - if (PlayerInfo::isTalking()) - return; - + mPlayerFollowMouse = false; const int eventX = event.getX(); const int eventY = event.getY(); - const unsigned int eventButton = event.getButton(); - const int pixelX = eventX + mPixelViewX; - const int pixelY = eventY + mPixelViewY; - - // Right click might open a popup - if (eventButton == MouseEvent::RIGHT) + if (mHoverBeing) { - mPlayerFollowMouse = false; - if (mHoverBeing) - { - validateSpeed(); - if (actorManager) - { - std::vector<ActorSprite*> beings; - const int x = mMouseX + mPixelViewX; - const int y = mMouseY + mPixelViewY; - actorManager->findBeingsByPixel(beings, x, y, true); - if (beings.size() > 1) - { - mPopupMenu->showPopup(eventX, eventY, beings); - return; - } - else - { - mPopupMenu->showPopup(eventX, eventY, mHoverBeing); - return; - } - } - } - else if (mHoverItem) - { - validateSpeed(); - mPopupMenu->showPopup(eventX, eventY, mHoverItem); - return; - } - else if (mHoverSign) - { - validateSpeed(); - mPopupMenu->showPopup(eventX, eventY, mHoverSign); - return; - } - else if (mCameraMode) + validateSpeed(); + if (actorManager) { - mPopupMenu->showMapPopup(eventX, eventY, - (mMouseX + mPixelViewX) / mMap->getTileWidth(), - (mMouseY + mPixelViewY) / mMap->getTileHeight()); - return; + std::vector<ActorSprite*> beings; + const int x = mMouseX + mPixelViewX; + const int y = mMouseY + mPixelViewY; + actorManager->findBeingsByPixel(beings, x, y, true); + if (beings.size() > 1) + mPopupMenu->showPopup(eventX, eventY, beings); + else + mPopupMenu->showPopup(eventX, eventY, mHoverBeing); + return true; } } - - // If a popup is active, just remove it - if (mPopupMenu->isPopupVisible()) + else if (mHoverItem) { - mPlayerFollowMouse = false; - mPopupMenu->setVisible(false); - return; + validateSpeed(); + mPopupMenu->showPopup(eventX, eventY, mHoverItem); + return true; + } + else if (mHoverSign) + { + validateSpeed(); + mPopupMenu->showPopup(eventX, eventY, mHoverSign); + return true; + } + else if (mCameraMode) + { + mPopupMenu->showMapPopup(eventX, eventY, + (mMouseX + mPixelViewX) / mMap->getTileWidth(), + (mMouseY + mPixelViewY) / mMap->getTileHeight()); + return true; } + return false; +} - // Left click can cause different actions - if (eventButton == MouseEvent::LEFT) +bool Viewport::leftMouseAction() +{ + // Interact with some being + if (mHoverBeing) { - // Interact with some being - if (mHoverBeing) - { - if (!mHoverBeing->isAlive()) - return; + if (!mHoverBeing->isAlive()) + return true; - if (mHoverBeing->canTalk()) + if (mHoverBeing->canTalk()) + { + validateSpeed(); + mHoverBeing->talkTo(); + return true; + } + else + { + const ActorSprite::Type type = mHoverBeing->getType(); + if (type == ActorSprite::PLAYER) { validateSpeed(); - mHoverBeing->talkTo(); - return; - } - else - { - if (mHoverBeing->getType() == ActorSprite::PLAYER) + if (actorManager) { - validateSpeed(); - if (actorManager) - { - if (player_node != mHoverBeing || mSelfMouseHeal) - actorManager->heal(mHoverBeing); - if (player_node == mHoverBeing && mHoverItem) - player_node->pickUp(mHoverItem); - return; - } + if (player_node != mHoverBeing || mSelfMouseHeal) + actorManager->heal(mHoverBeing); + if (player_node == mHoverBeing && mHoverItem) + player_node->pickUp(mHoverItem); + return true; } - else if (player_node->withinAttackRange(mHoverBeing) || - inputManager.isActionActive(static_cast<int>( - Input::KEY_ATTACK))) + } + else if (type == ActorSprite::MONSTER || type == ActorSprite::NPC) + { + if (player_node->withinAttackRange(mHoverBeing) || + inputManager.isActionActive(static_cast<int>( + Input::KEY_ATTACK))) { validateSpeed(); - if (player_node != mHoverBeing) + if (!mStatsReUpdated && player_node != mHoverBeing) { player_node->attack(mHoverBeing, !inputManager.isActionActive( static_cast<int>(Input::KEY_STOP_ATTACK))); - return; + return true; } } else if (!inputManager.isActionActive(static_cast<int>( Input::KEY_ATTACK))) { validateSpeed(); - if (player_node != mHoverBeing) + if (!mStatsReUpdated && player_node != mHoverBeing) { player_node->setGotoTarget(mHoverBeing); - return; + return true; } } } } - // Picks up a item if we clicked on one - if (mHoverItem) - { - validateSpeed(); - player_node->pickUp(mHoverItem); - } - // Just walk around - else if (!inputManager.isActionActive(static_cast<int>( - Input::KEY_ATTACK))) - { - validateSpeed(); - player_node->stopAttack(); - player_node->cancelFollow(); - mPlayerFollowMouse = true; + } + // Picks up a item if we clicked on one + if (mHoverItem) + { + validateSpeed(); + player_node->pickUp(mHoverItem); + } + // Just walk around + else if (!inputManager.isActionActive(static_cast<int>( + Input::KEY_ATTACK))) + { + validateSpeed(); + player_node->stopAttack(); + player_node->cancelFollow(); + mPlayerFollowMouse = true; - // Make the player go to the mouse position - _followMouse(); + // Make the player go to the mouse position + _followMouse(); + } + return false; +} + +void Viewport::mousePressed(MouseEvent &event) +{ + if (event.getSource() != this || event.isConsumed()) + return; + + mMouseClicked = true; + // Check if we are alive and kickin' + if (!mMap || !player_node) + return; + + // Check if we are busy + // if commented, allow context menu if npc dialog open + if (PlayerInfo::isTalking()) + return; + + mMousePressX = event.getX(); + mMousePressY = event.getY(); + const unsigned int eventButton = event.getButton(); + const int pixelX = mMousePressX + mPixelViewX; + const int pixelY = mMousePressY + mPixelViewY; + + // Right click might open a popup + if (eventButton == MouseEvent::RIGHT) + { + if (openContextMenu(event)) + return; + } + + // If a popup is active, just remove it + if (mPopupMenu->isPopupVisible()) + { + mPlayerFollowMouse = false; + mPopupMenu->setVisible(false); + return; + } + + // Left click can cause different actions + if (!mLongMouseClick && eventButton == MouseEvent::LEFT) + { + if (leftMouseAction()) + { + mPlayerFollowMouse = false; + return; } } else if (eventButton == MouseEvent::MIDDLE) @@ -523,15 +543,16 @@ void Viewport::mousePressed(MouseEvent &event) } } -void Viewport::mouseDragged(MouseEvent &event) +void Viewport::walkByMouse(const MouseEvent &event) { if (!mMap || !player_node) return; - if (mPlayerFollowMouse && !inputManager.isActionActive( Input::KEY_STOP_ATTACK) && !inputManager.isActionActive( Input::KEY_UNTARGET)) { + if (!mMouseDirectionMove) + mPlayerFollowMouse = false; if (mLocalWalkTime != player_node->getActionTime()) { mLocalWalkTime = cur_time; @@ -644,10 +665,51 @@ void Viewport::mouseDragged(MouseEvent &event) } } -void Viewport::mouseReleased(MouseEvent &event A_UNUSED) +void Viewport::mouseDragged(MouseEvent &event) +{ + if (event.getSource() != this || event.isConsumed()) + return; + if (mMouseClicked) + { + if (abs(event.getX() - mMousePressX) > 32 + || abs(event.getY() - mMousePressY) > 32) + { + mPlayerFollowMouse = true; + } + } + + walkByMouse(event); +} + +void Viewport::mouseReleased(MouseEvent &event) { mPlayerFollowMouse = false; mLocalWalkTime = -1; + if (mLongMouseClick && mMouseClicked) + { + mMouseClicked = false; + if (event.getSource() != this || event.isConsumed()) + return; + const unsigned int eventButton = event.getButton(); + if (eventButton == MouseEvent::LEFT) + { + // long button press + if (gui && gui->isLongPress()) + { + if (openContextMenu(event)) + { + gui->resetClickCount(); + return; + } + } + else + { + if (leftMouseAction()) + return; + } + walkByMouse(event); + } + } } void Viewport::showPopup(Window *const parent, const int x, const int y, @@ -794,6 +856,8 @@ void Viewport::optionChanged(const std::string &name) mEnableLazyScrolling = config.getBoolValue("enableLazyScrolling"); else if (name == "mouseDirectionMove") mMouseDirectionMove = config.getBoolValue("mouseDirectionMove"); + else if (name == "longmouseclick") + mLongMouseClick = config.getBoolValue("longmouseclick"); } void Viewport::mouseMoved(MouseEvent &event A_UNUSED) |