[android] quick fix of Framework::SetMaxWorldRect() dragging bug at first startup.

This commit is contained in:
vng 2012-02-16 22:56:03 +03:00 committed by Alex Zolotarev
parent 02b17c2a4a
commit 6ae97fe981
2 changed files with 36 additions and 23 deletions

View file

@ -107,6 +107,8 @@ bool Navigator::CanShrinkInto(ScreenBase const & screen, m2::RectD const & bound
ScreenBase const Navigator::ShrinkInto(ScreenBase const & screen, m2::RectD const & boundRect)
{
ASSERT ( CanShrinkInto(screen, boundRect), () );
ScreenBase res = screen;
/* if (m_doSupportRotation)
@ -124,6 +126,7 @@ ScreenBase const Navigator::ShrinkInto(ScreenBase const & screen, m2::RectD cons
res.SetOrg(clipRect.Center());
ASSERT ( boundRect.IsRectInside(res.ClipRect()), () );
return res;
}
@ -139,8 +142,20 @@ ScreenBase const Navigator::RotateInto(ScreenBase const & screen, m2::RectD cons
return screen; //@TODO
}
ScreenBase const Navigator::ScaleInto(ScreenBase const & screen, m2::RectD const & boundRect)
namespace
{
/// @todo Review this logic in future.
/// Fix bug with floating point calculations (before Android release).
void ReduceRectHack(m2::RectD & r)
{
r.Inflate(-1.0E-9, -1.0E-9);
}
}
ScreenBase const Navigator::ScaleInto(ScreenBase const & screen, m2::RectD boundRect)
{
ReduceRectHack(boundRect);
ScreenBase res = screen;
/* if (m_doSupportRotation)
@ -181,8 +196,10 @@ ScreenBase const Navigator::ScaleInto(ScreenBase const & screen, m2::RectD const
return res;
}
ScreenBase const Navigator::ShrinkAndScaleInto(ScreenBase const & screen, m2::RectD const & boundRect)
ScreenBase const Navigator::ShrinkAndScaleInto(ScreenBase const & screen, m2::RectD boundRect)
{
ReduceRectHack(boundRect);
ScreenBase res = screen;
/* if (m_doSupportRotation)
@ -298,26 +315,22 @@ void Navigator::DoDrag(m2::PointD const & pt, double /*timeInSec*/)
//LOG(LDEBUG, (pt.x, pt.y));
//m_Screen = m_StartScreen;
ScreenBase tmp = m_StartScreen;
tmp = ShrinkInto(tmp, m_worldRect);
ScreenBase const s = ShrinkInto(m_StartScreen, m_worldRect);
double dx = pt.x - m_StartPt1.x;
double dy = pt.y - m_StartPt1.y;
ScreenBase tmp = s;
tmp.Move(dx, 0);
if (!CheckBorders(tmp))
dx = 0;
tmp = m_StartScreen;
tmp = ShrinkInto(tmp, m_worldRect);
tmp = s;
tmp.Move(0, dy);
if (!CheckBorders(tmp))
dy = 0;
tmp = m_StartScreen;
tmp = ShrinkInto(tmp, m_worldRect);
tmp = s;
tmp.Move(dx, dy);
if (CheckBorders(tmp))
@ -390,7 +403,7 @@ void Navigator::ScaleToPoint(m2::PointD const & pt, double factor, double /*time
ScaleImpl(pt, endPt, pt, startPt, factor > 1);
}
bool Navigator::CheckMaxScale(ScreenBase const & screen)
bool Navigator::CheckMaxScale(ScreenBase const & screen) const
{
m2::RectD r = screen.ClipRect();
// multiple by 2 to allow scale on zero level
@ -398,7 +411,7 @@ bool Navigator::CheckMaxScale(ScreenBase const & screen)
return (r.SizeX() <= maxSize || r.SizeY() <= maxSize);
}
bool Navigator::CheckMinScale(ScreenBase const & screen)
bool Navigator::CheckMinScale(ScreenBase const & screen) const
{
m2::PointD const pt0 = screen.PtoG(m_Screen.PixelRect().Center() - m2::PointD(m_pxMinWidth / 2, 0));
m2::PointD const pt1 = screen.PtoG(m_Screen.PixelRect().Center() + m2::PointD(m_pxMinWidth / 2, 0));
@ -407,9 +420,9 @@ bool Navigator::CheckMinScale(ScreenBase const & screen)
return metresDiff >= m_metresMinWidth - 1;
}
bool Navigator::CheckBorders(ScreenBase const & screen)
bool Navigator::CheckBorders(ScreenBase const & screen) const
{
m2::RectD ScreenBounds = screen.ClipRect();
m2::RectD const ScreenBounds = screen.ClipRect();
return ScreenBounds.IsRectInside(m_worldRect) || m_worldRect.IsRectInside(ScreenBounds);
}

View file

@ -66,18 +66,18 @@ private:
m2::RectD m_worldRect;
unsigned m_pxMinWidth;
double m_metresMinWidth;
bool CheckMinScale(ScreenBase const & screen);
bool CheckMaxScale(ScreenBase const & screen);
bool CheckBorders(ScreenBase const & screen);
bool CheckMinScale(ScreenBase const & screen) const;
bool CheckMaxScale(ScreenBase const & screen) const;
bool CheckBorders(ScreenBase const & screen) const;
bool CanShrinkInto(ScreenBase const & screen, m2::RectD const & boundRect);
ScreenBase const ShrinkInto(ScreenBase const & screen, m2::RectD const & boundRect);
static bool CanShrinkInto(ScreenBase const & screen, m2::RectD const & boundRect);
static ScreenBase const ShrinkInto(ScreenBase const & screen, m2::RectD const & boundRect);
bool CanRotateInto(ScreenBase const & screen, m2::RectD const & boundRect);
ScreenBase const RotateInto(ScreenBase const & screen, m2::RectD const & boundRect);
static bool CanRotateInto(ScreenBase const & screen, m2::RectD const & boundRect);
static ScreenBase const RotateInto(ScreenBase const & screen, m2::RectD const & boundRect);
ScreenBase const ScaleInto(ScreenBase const & screen, m2::RectD const & boundRect);
ScreenBase const ShrinkAndScaleInto(ScreenBase const & screen, m2::RectD const & boundRect);
static ScreenBase const ScaleInto(ScreenBase const & screen, m2::RectD boundRect);
static ScreenBase const ShrinkAndScaleInto(ScreenBase const & screen, m2::RectD boundRect);
// Internal screen corresponding to the state when navigation began with StartDrag or StartScale.
ScreenBase m_StartScreen;