[core] Added viewport centering animation

This commit is contained in:
Igor Khmurets 2014-03-12 19:04:58 +03:00 committed by Alex Zolotarev
parent 5f70ce2e67
commit 6f4dd2d12c
6 changed files with 23 additions and 41 deletions

View file

@ -838,6 +838,16 @@ void Framework::SetViewportCenter(m2::PointD const & pt)
Invalidate();
}
shared_ptr<MoveScreenTask> Framework::SetViewportCenterAnimated(m2::PointD const & endPt)
{
anim::Controller::Guard guard(GetAnimController());
ScreenBase const & s = m_navigator.Screen();
m2::PointD const & startPt = s.GetOrg();
double const speed = m_navigator.ComputeMoveSpeed(startPt, endPt);
return m_animator.MoveScreen(startPt, endPt, speed);
}
m2::AnyRectD Framework::ToRotated(m2::RectD const & rect) const
{
double const dx = rect.SizeX();

View file

@ -39,6 +39,8 @@
#include "../std/scoped_ptr.hpp"
#include "../std/target_os.hpp"
#include "move_screen_task.hpp"
#include "track.hpp"
//#define DRAW_TOUCH_POINTS
@ -320,6 +322,7 @@ public:
m2::PointD GetViewportCenter() const;
void SetViewportCenter(m2::PointD const & pt);
shared_ptr<MoveScreenTask> SetViewportCenterAnimated(m2::PointD const & endPt);
/// Set correct viewport, parse API, show balloon.
bool ShowMapForURL(string const & url);

View file

@ -135,13 +135,6 @@ namespace location
setIsVisible(false);
}
double State::ComputeMoveSpeed(m2::PointD const & globalPt0,
m2::PointD const & globalPt1,
ScreenBase const & s)
{
return max(0.1, min(0.5, 0.5 * s.GtoP(globalPt0).Length(s.GtoP(globalPt1)) / 50.0));
}
bool State::HasPosition() const
{
return m_hasPosition;
@ -528,30 +521,12 @@ namespace location
void State::AnimateToPosition()
{
anim::Controller * controller = m_framework->GetAnimController();
anim::Controller::Guard guard(controller);
m2::PointD startPt = m_framework->GetNavigator().Screen().GetOrg();
m2::PointD endPt = Position();
ScreenBase const & s = m_framework->GetNavigator().Screen();
double speed = ComputeMoveSpeed(startPt, endPt, s);
m_framework->GetAnimator().MoveScreen(startPt, endPt, speed);
m_framework->SetViewportCenterAnimated(Position());
}
void State::AnimateToPositionAndEnqueueFollowing()
{
anim::Controller * controller = m_framework->GetAnimController();
anim::Controller::Guard guard(controller);
m2::PointD const startPt = m_framework->GetNavigator().Screen().GetOrg();
m2::PointD const endPt = Position();
ScreenBase const & s = m_framework->GetNavigator().Screen();
double const speed = ComputeMoveSpeed(startPt, endPt, s);
shared_ptr<MoveScreenTask> const & t = m_framework->GetAnimator().MoveScreen(startPt, endPt, speed);
shared_ptr<MoveScreenTask> const & t = m_framework->SetViewportCenterAnimated(Position());
t->Lock();
t->AddCallback(anim::Task::EEnded, bind(&State::SetIsCentered, this, true));
@ -561,16 +536,7 @@ namespace location
void State::AnimateToPositionAndEnqueueLocationProcessMode(location::ELocationProcessMode mode)
{
anim::Controller * controller = m_framework->GetAnimController();
anim::Controller::Guard guard(controller);
m2::PointD const startPt = m_framework->GetNavigator().Screen().GetOrg();
m2::PointD const endPt = Position();
ScreenBase const & s = m_framework->GetNavigator().Screen();
double const speed = ComputeMoveSpeed(startPt, endPt, s);
shared_ptr<MoveScreenTask> const & t = m_framework->GetAnimator().MoveScreen(startPt, endPt, speed);
shared_ptr<MoveScreenTask> const & t = m_framework->SetViewportCenterAnimated(Position());
t->Lock();
t->AddCallback(anim::Task::EEnded, bind(&State::SetIsCentered, this, true));

View file

@ -104,10 +104,6 @@ namespace location
void CallCompassStatusListeners(ECompassProcessMode mode);
double ComputeMoveSpeed(m2::PointD const & globalPt0,
m2::PointD const & globalPt1,
ScreenBase const & s);
void CheckCompassFollowing();
void FollowCompass();

View file

@ -75,6 +75,11 @@ void Navigator::CenterViewport(m2::PointD const & p)
m_StartScreen.SetOrg(pt);
}
double Navigator::ComputeMoveSpeed(m2::PointD const & p0, m2::PointD const & p1) const
{
return max(0.1, min(0.5, 0.5 * GtoP(p0).Length(GtoP(p1)) / 50.0));
}
void Navigator::SaveState()
{
m2::AnyRectD r = m_Screen.GlobalRect();

View file

@ -16,6 +16,8 @@ public:
void CenterViewport(m2::PointD const & p);
void SetFromRects(m2::AnyRectD const & glbRect, m2::RectD const & pxRect);
double ComputeMoveSpeed(m2::PointD const & p0, m2::PointD const & p1) const;
void SaveState();
/// @return false if can't load previously saved values
bool LoadState();