Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/map
diff options
context:
space:
mode:
authorExMix <ExMix@Youris-MacBook-Pro.local>2013-05-23 16:58:43 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:55:54 +0300
commitd69bd26e8b027b563dd38ed1527c1d51f57017dc (patch)
tree1a5bda8526766cd198bfd2f460f6d3e685118c36 /map
parent0b1a84735bba0be6361c6c882e74cc46f2fc5660 (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.cpp77
-rw-r--r--map/bookmark_balloon.hpp9
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);