diff options
author | ExMix <ExMix@Youris-MacBook-Pro.local> | 2013-05-23 16:58:43 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:55:54 +0300 |
commit | d69bd26e8b027b563dd38ed1527c1d51f57017dc (patch) | |
tree | 1a5bda8526766cd198bfd2f460f6d3e685118c36 /map | |
parent | 0b1a84735bba0be6361c6c882e74cc46f2fc5660 (diff) |
check balloon position (graphics::EPosition) dependent on balloon position on the screen.
animate screen to move when not all balloon on the screen
Diffstat (limited to 'map')
-rw-r--r-- | map/bookmark_balloon.cpp | 77 | ||||
-rw-r--r-- | map/bookmark_balloon.hpp | 9 |
2 files changed, 84 insertions, 2 deletions
diff --git a/map/bookmark_balloon.cpp b/map/bookmark_balloon.cpp index 62db7d2963..b68146164b 100644 --- a/map/bookmark_balloon.cpp +++ b/map/bookmark_balloon.cpp @@ -7,6 +7,7 @@ #include "../anim/value_interpolation.hpp" #define POPUP_PADDING 23 +#define ANIM_PADDING 8 class BookmarkBalloon::BalloonAnimTask : public anim::Task { @@ -85,10 +86,80 @@ private: BookmarkBalloon::BookmarkBalloon(Params const & p) : Balloon(p), + m_isPositionChecked(true), m_framework(p.m_framework) { } +void BookmarkBalloon::setIsPositionChecked(bool isChecked) +{ + m_isPositionChecked = isChecked; +} + +bool BookmarkBalloon::isPositionChecked() const +{ + return m_isPositionChecked; +} + +bool BookmarkBalloon::checkPosition() +{ + if (isPositionChecked()) + return false; + + setIsPositionChecked(true); + + bool result = false; + + bool needLayout = false; + m2::RectD balloonRect = roughBoundRect(); + if (balloonRect.minX() < 0) + { + setPosition(graphics::EPosLeft); + needLayout = true; + } + if (m_framework->GetNavigator().Screen().GetWidth() < balloonRect.maxX()) + { + setPosition(graphics::EPosRight); + needLayout = true; + } + + if (needLayout) + layout(); + + ScreenBase const & screen = m_framework->GetNavigator().Screen(); + + m2::PointD globalOrg = screen.GetOrg(); + m2::PointD pixelOrg = screen.GtoP(globalOrg); + + double k = visualScale(); + balloonRect = roughBoundRect(); + if (balloonRect.minX() < 0) + { + pixelOrg.x += (balloonRect.minX() - ANIM_PADDING * k); + result = true; + } + else if (balloonRect.maxX() > screen.GetWidth()) + { + pixelOrg.x += (balloonRect.maxX() - screen.GetWidth() + ANIM_PADDING * k); + result = true; + } + + if (balloonRect.minY() < 0) + { + pixelOrg.y += (balloonRect.minY() - ANIM_PADDING * k); + result = true; + } + else if (balloonRect.maxY() > screen.GetHeight()) + { + pixelOrg.y += (balloonRect.maxY() - screen.GetHeight() + ANIM_PADDING * k); + result = true; + } + + m_framework->GetAnimator().MoveScreen(globalOrg, screen.PtoG(pixelOrg), 0.5); + + return result; +} + void BookmarkBalloon::update() { Balloon::update(); @@ -98,6 +169,9 @@ void BookmarkBalloon::update() newPivot.y -= POPUP_PADDING * visualScale(); setPivot(newPivot); + if (checkPosition()) + setIsDirtyLayout(true); + if (m_currentAnimTask) { m_balloonScale = m_currentAnimTask->GetScale(); @@ -153,6 +227,9 @@ void BookmarkBalloon::cancelTask() void BookmarkBalloon::showAnimated() { + setPosition(graphics::EPosCenter); + setIsPositionChecked(false); + animTaskEnded(0); setIsVisible(true); } diff --git a/map/bookmark_balloon.hpp b/map/bookmark_balloon.hpp index 2a08a9c19d..9f2fc05fce 100644 --- a/map/bookmark_balloon.hpp +++ b/map/bookmark_balloon.hpp @@ -14,9 +14,14 @@ private: shared_ptr<BalloonAnimTask> m_currentAnimTask; m2::PointD m_glbPivot; - Framework const * m_framework; + Framework * m_framework; string m_bmkName; string m_bmkType; + bool m_isPositionChecked; + + void setIsPositionChecked(bool isChecked); + bool isPositionChecked() const; + bool checkPosition(); void createTask(double startScale, double endScale, double startOffset, double endOffset, @@ -32,7 +37,7 @@ public: struct Params : public base_t::Params { - Framework const * m_framework; + Framework * m_framework; }; BookmarkBalloon(Params const & p); |