From 2491f9d4d2117dc70cf8327144d4af98e5a965e1 Mon Sep 17 00:00:00 2001 From: ExMix Date: Wed, 21 May 2014 10:09:31 +0300 Subject: [PATCH] [core] we need apply pixel offset for bookmarks, to bookmark look like it growing from selection center --- map/bookmark.cpp | 6 +++ map/bookmark.hpp | 1 + map/user_mark.hpp | 1 + map/user_mark_container.cpp | 81 +++++++++++++++++++------------------ map/user_mark_container.hpp | 19 +++++++++ 5 files changed, 69 insertions(+), 39 deletions(-) diff --git a/map/bookmark.cpp b/map/bookmark.cpp index 4bf12a38e8..990cb177d7 100644 --- a/map/bookmark.cpp +++ b/map/bookmark.cpp @@ -36,6 +36,12 @@ double Bookmark::GetAnimScaleFactor() const return m_animScaleFactor; } +m2::PointD const & Bookmark::GetPixelOffset() const +{ + static m2::PointD s_offset(0.0, 3.0); + return s_offset; +} + shared_ptr Bookmark::CreateAnimTask(Framework & fm) { m_animScaleFactor = 0.0; diff --git a/map/bookmark.hpp b/map/bookmark.hpp index f3716d0f17..d184c845d3 100644 --- a/map/bookmark.hpp +++ b/map/bookmark.hpp @@ -110,6 +110,7 @@ public: virtual graphics::DisplayList * GetDisplayList(UserMarkDLCache * cache) const; virtual double GetAnimScaleFactor() const; + virtual m2::PointD const & GetPixelOffset() const; shared_ptr CreateAnimTask(Framework & fm); }; diff --git a/map/user_mark.hpp b/map/user_mark.hpp index 2f7ed6aa53..67ba5b8615 100644 --- a/map/user_mark.hpp +++ b/map/user_mark.hpp @@ -120,4 +120,5 @@ public: bool IsCustomDrawable() const { return true; } virtual graphics::DisplayList * GetDisplayList(UserMarkDLCache * cache) const = 0; virtual double GetAnimScaleFactor() const = 0; + virtual m2::PointD const & GetPixelOffset() const = 0; }; diff --git a/map/user_mark_container.cpp b/map/user_mark_container.cpp index cf4fec6976..3f47021cd9 100644 --- a/map/user_mark_container.cpp +++ b/map/user_mark_container.cpp @@ -70,44 +70,6 @@ namespace m2::AnyRectD const & m_rect; m2::PointD m_globalCenter; }; - - void DrawUserMarkImpl(double scale, - PaintOverlayEvent const & event, - graphics::DisplayList * dl, - UserMark const * mark) - { - ScreenBase modelView = event.GetModelView(); - graphics::Screen * screen = event.GetDrawer()->screen(); - m2::PointD pxPoint = modelView.GtoP(mark->GetOrg()); - math::Matrix m = math::Shift(math::Scale(math::Identity(), - scale, scale), - pxPoint.x, pxPoint.y); - dl->draw(screen, m); - } - - void DefaultDrawUserMark(double scale, - PaintOverlayEvent const & event, - UserMarkDLCache * cache, - UserMarkDLCache::Key const & defaultKey, - UserMark const * mark) - { - DrawUserMarkImpl(scale, event, cache->FindUserMark(defaultKey), mark); - } - - void DrawUserMark(double scale, - PaintOverlayEvent const & event, - UserMarkDLCache * cache, - UserMarkDLCache::Key const & defaultKey, - UserMark const * mark) - { - if (mark->IsCustomDrawable()) - { - ICustomDrawable const * drawable = static_cast(mark); - DrawUserMarkImpl(drawable->GetAnimScaleFactor(), event, drawable->GetDisplayList(cache), mark); - } - else - DefaultDrawUserMark(scale, event, cache, defaultKey, mark); - } } UserMarkContainer::UserMarkContainer(double layerDepth, Framework & framework) @@ -145,7 +107,8 @@ void UserMarkContainer::Draw(PaintOverlayEvent const & e, UserMarkDLCache * cach } UserMarkDLCache::Key defaultKey(GetTypeName(), graphics::EPosCenter, m_layerDepth); - for_each(m_userMarks.begin(), m_userMarks.end(), bind(&DrawUserMark, 1.0, e, cache, defaultKey, _1)); + for_each(m_userMarks.begin(), m_userMarks.end(), bind(&UserMarkContainer::DrawUserMark, this, + 1.0, e, cache, defaultKey, _1)); } void UserMarkContainer::ActivateMark(UserMark const * mark) @@ -242,6 +205,46 @@ void UserMarkContainer::DeleteUserMark(UserMark const * mark) DeleteUserMark(distance(m_userMarks.begin(), it)); } +void UserMarkContainer::DrawUserMarkImpl(double scale, + m2::PointD const & pixelOfsset, + PaintOverlayEvent const & event, + graphics::DisplayList * dl, + UserMark const * mark) const +{ + ScreenBase modelView = event.GetModelView(); + graphics::Screen * screen = event.GetDrawer()->screen(); + m2::PointD pxPoint = modelView.GtoP(mark->GetOrg()); + pxPoint += (pixelOfsset * m_framework.GetVisualScale()); + math::Matrix m = math::Shift(math::Scale(math::Identity(), + scale, scale), + pxPoint.x, pxPoint.y); + dl->draw(screen, m); +} + +void UserMarkContainer::DrawUserMark(double scale, + PaintOverlayEvent const & event, + UserMarkDLCache * cache, + UserMarkDLCache::Key const & defaultKey, + UserMark const * mark) const +{ + if (mark->IsCustomDrawable()) + { + ICustomDrawable const * drawable = static_cast(mark); + DrawUserMarkImpl(drawable->GetAnimScaleFactor(), drawable->GetPixelOffset(), event, drawable->GetDisplayList(cache), mark); + } + else + DefaultDrawUserMark(scale, event, cache, defaultKey, mark); +} + +void UserMarkContainer::DefaultDrawUserMark(double scale, + PaintOverlayEvent const & event, + UserMarkDLCache * cache, + UserMarkDLCache::Key const & defaultKey, + const UserMark * mark) const +{ + DrawUserMarkImpl(scale, m2::PointD(0.0, 0.0), event, cache->FindUserMark(defaultKey), mark); +} + void UserMarkContainer::StartActivationAnim() { m_animTask.reset(new PinAnimation(m_framework)); diff --git a/map/user_mark_container.hpp b/map/user_mark_container.hpp index 366abc8ca9..3294d1ebde 100644 --- a/map/user_mark_container.hpp +++ b/map/user_mark_container.hpp @@ -91,6 +91,25 @@ private: void DeleteUserMark(size_t index); void DeleteUserMark(UserMark const * mark); +private: + void DrawUserMark(double scale, + PaintOverlayEvent const & event, + UserMarkDLCache * cache, + UserMarkDLCache::Key const & defaultKey, + UserMark const * mark) const; + + void DefaultDrawUserMark(double scale, + PaintOverlayEvent const & event, + UserMarkDLCache * cache, + UserMarkDLCache::Key const & defaultKey, + UserMark const * mark) const; + + void DrawUserMarkImpl(double scale, + const m2::PointD & pixelOfsset, + PaintOverlayEvent const & event, + graphics::DisplayList * dl, + UserMark const * mark) const; + private: Controller m_controller; bool m_isVisible;