forked from organicmaps/organicmaps
[core] we need apply pixel offset for bookmarks, to bookmark look like it growing from selection center
This commit is contained in:
parent
6d5cc8dd48
commit
2491f9d4d2
5 changed files with 69 additions and 39 deletions
|
@ -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<anim::Task> Bookmark::CreateAnimTask(Framework & fm)
|
||||
{
|
||||
m_animScaleFactor = 0.0;
|
||||
|
|
|
@ -110,6 +110,7 @@ public:
|
|||
|
||||
virtual graphics::DisplayList * GetDisplayList(UserMarkDLCache * cache) const;
|
||||
virtual double GetAnimScaleFactor() const;
|
||||
virtual m2::PointD const & GetPixelOffset() const;
|
||||
shared_ptr<anim::Task> CreateAnimTask(Framework & fm);
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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<double, 3, 3> m = math::Shift(math::Scale(math::Identity<double, 3>(),
|
||||
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<ICustomDrawable const *>(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<double, 3, 3> m = math::Shift(math::Scale(math::Identity<double, 3>(),
|
||||
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<ICustomDrawable const *>(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));
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue