[core] we need apply pixel offset for bookmarks, to bookmark look like it growing from selection center

This commit is contained in:
ExMix 2014-05-21 10:09:31 +03:00 committed by Alex Zolotarev
parent 6d5cc8dd48
commit 2491f9d4d2
5 changed files with 69 additions and 39 deletions

View file

@ -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;

View file

@ -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);
};

View file

@ -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;
};

View file

@ -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));

View file

@ -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;