diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index eacafdd741..cfdfbbb7fe 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -163,8 +163,6 @@ - (void)layoutSubviews { - NSLog(@"layoutSubviews"); - CGFloat scaleFactor = 1.0; if ([self respondsToSelector:@selector(contentScaleFactor)]) scaleFactor = self.contentScaleFactor; diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index 40c247ca6b..ecb71ac277 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -136,12 +136,12 @@ typedef FrameWork framework_t; // restore previous screen position bool res = m_framework->LoadState(); + if (!res) + m_framework->SetMaxWorldRect(); + m_framework->initializeGL([(EAGLView*)self.view renderContext], resourceManager); - if (!res) - m_framework->ShowAll(); - else - m_framework->UpdateNow(); + m_framework->UpdateNow(); } return self; @@ -153,7 +153,6 @@ typedef FrameWork framework_t; if ((orientation == UIInterfaceOrientationLandscapeLeft) ||(orientation == UIInterfaceOrientationLandscapeRight)) std::swap(width, height); - NSLog(@"onResize: %d, %d", width, height); m_framework->OnSize(width, height); } diff --git a/map/framework.hpp b/map/framework.hpp index cc1b331d2d..33ec53081b 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -132,11 +132,6 @@ class FrameWork AddRedrawCommandSure(); } - void SetMaxWorldRect() - { - m_navigator.SetFromRect(m_model.GetWorldRect()); - } - threads::Mutex m_modelSyn; void AddMap(string const & datFile) @@ -273,6 +268,11 @@ public: //@{ public: + void SetMaxWorldRect() + { + m_navigator.SetFromRect(m_model.GetWorldRect()); + } + void UpdateNow() { AddRedrawCommand(); diff --git a/map/navigator.cpp b/map/navigator.cpp index dac4903839..ec99bc2406 100644 --- a/map/navigator.cpp +++ b/map/navigator.cpp @@ -17,7 +17,8 @@ #include "../base/start_mem_debug.hpp" Navigator::Navigator() - : m_orientation(EOrientation0) + : m_orientation(EOrientation0), + m_worldRect(MercatorBounds::minX, MercatorBounds::minY, MercatorBounds::maxX, MercatorBounds::maxY) { } @@ -25,7 +26,8 @@ Navigator::Navigator(ScreenBase const & screen) : m_StartScreen(screen), m_Screen(screen), m_InAction(false), - m_orientation(EOrientation0) + m_orientation(EOrientation0), + m_worldRect(MercatorBounds::minX, MercatorBounds::minY, MercatorBounds::maxX, MercatorBounds::maxY) { } @@ -38,8 +40,13 @@ void Navigator::SetMinScreenParams(unsigned pxMinWidth, double metresMinWidth) void Navigator::SetFromRect(m2::RectD const & r) { m_Screen.SetFromRect(r); + m_Screen = AdjustToBounds(m_Screen, m_worldRect, true); + if (!m_InAction) + { m_StartScreen.SetFromRect(r); + m_StartScreen = AdjustToBounds(m_StartScreen, m_worldRect, true); + } } void Navigator::CenterViewport(m2::PointD const & p) @@ -76,13 +83,16 @@ void Navigator::OnSize(int x0, int y0, int w, int h) { m_Screen.OnSize(x0, y0, w, h); - m_Screen = AdjustToBounds(m_Screen, m2::RectD(MercatorBounds::minX, MercatorBounds::minY, MercatorBounds::maxX, MercatorBounds::maxY)); + m_Screen = AdjustToBounds(m_Screen, m_worldRect, false); if (!m_InAction) + { m_StartScreen.OnSize(x0, y0, w, h); + m_StartScreen = AdjustToBounds(m_StartScreen, m_worldRect, false); + } } -ScreenBase const Navigator::AdjustToBounds(ScreenBase const & screen, m2::RectD const & boundRect) +ScreenBase const Navigator::AdjustToBounds(ScreenBase const & screen, m2::RectD const & boundRect, bool doScaleOnly) { ScreenBase res = screen; m2::RectD globalRect = res.GlobalRect(); @@ -92,44 +102,76 @@ ScreenBase const Navigator::AdjustToBounds(ScreenBase const & screen, m2::RectD if (globalRect.minX() < boundRect.minX()) { - globalRect.Offset(m2::PointD(boundRect.minX() - globalRect.minX(), 0)); - - if (globalRect.maxX() > boundRect.maxX()) + if (doScaleOnly) { - double k = (globalRect.Center().x - boundRect.maxX()) / (globalRect.Center().x - globalRect.maxX()); + double k = (globalRect.Center().x - boundRect.minX()) / (globalRect.Center().x - globalRect.minX()); globalRect.Scale(k); } + else + { + globalRect.Offset(m2::PointD(boundRect.minX() - globalRect.minX(), 0)); + + if (globalRect.maxX() > boundRect.maxX()) + { + double k = (globalRect.Center().x - boundRect.maxX()) / (globalRect.Center().x - globalRect.maxX()); + globalRect.Scale(k); + } + } } if (globalRect.maxX() > boundRect.maxX()) { - globalRect.Offset(m2::PointD(boundRect.maxX() - globalRect.maxX(), 0)); - if (globalRect.minX() < boundRect.minX()) + if (doScaleOnly) { - double k = (globalRect.Center().x - boundRect.minX()) / (globalRect.Center().x - globalRect.minX()); + double k = (globalRect.Center().x - boundRect.maxX()) / (globalRect.Center().x - globalRect.maxX()); globalRect.Scale(k); } + else + { + globalRect.Offset(m2::PointD(boundRect.maxX() - globalRect.maxX(), 0)); + if (globalRect.minX() < boundRect.minX()) + { + double k = (globalRect.Center().x - boundRect.minX()) / (globalRect.Center().x - globalRect.minX()); + globalRect.Scale(k); + } + } } if (globalRect.minY() < boundRect.minY()) { - globalRect.Offset(m2::PointD(boundRect.minY() - globalRect.minY(), 0)); - - if (globalRect.maxY() > boundRect.maxY()) + if (doScaleOnly) { - double k = (globalRect.Center().y - boundRect.maxY()) / (globalRect.Center().y - globalRect.maxY()); + double k = (globalRect.Center().y - boundRect.minY()) / (globalRect.Center().y - globalRect.minY()); globalRect.Scale(k); } + else + { + globalRect.Offset(m2::PointD(boundRect.minY() - globalRect.minY(), 0)); + + if (globalRect.maxY() > boundRect.maxY()) + { + double k = (globalRect.Center().y - boundRect.maxY()) / (globalRect.Center().y - globalRect.maxY()); + globalRect.Scale(k); + } + } } if (globalRect.maxY() > boundRect.maxY()) { - globalRect.Offset(m2::PointD(boundRect.maxY() - globalRect.maxY(), 0)); - if (globalRect.minY() < boundRect.minY()) + if (doScaleOnly) { - double k = (globalRect.Center().y - boundRect.minY()) / (globalRect.Center().y - globalRect.minY()); + double k = (globalRect.Center().y - boundRect.maxY()) / (globalRect.Center().y - globalRect.maxY()); globalRect.Scale(k); } + else + { + globalRect.Offset(m2::PointD(boundRect.maxY() - globalRect.maxY(), 0)); + if (globalRect.minY() < boundRect.minY()) + { + double k = (globalRect.Center().y - boundRect.minY()) / (globalRect.Center().y - globalRect.minY()); + globalRect.Scale(k); + } + } } res.SetFromRect(globalRect); @@ -242,7 +284,7 @@ bool Navigator::CheckMaxScale(ScreenBase const & screen) { m2::RectD r = screen.ClipRect(); // multiple by 2 to allow scale on zero level - double const maxSize = (MercatorBounds::maxX - MercatorBounds::minX); + double const maxSize = m_worldRect.SizeX(); return (r.SizeX() <= maxSize || r.SizeY() <= maxSize); } @@ -258,11 +300,7 @@ bool Navigator::CheckMinScale(ScreenBase const & screen) bool Navigator::CheckBorders(ScreenBase const & screen) { m2::RectD ScreenBounds = screen.GlobalRect(); - - m2::RectD WorldBounds(MercatorBounds::minX, MercatorBounds::minY, - MercatorBounds::maxX, MercatorBounds::maxY); - - return ScreenBounds.IsRectInside(WorldBounds) || WorldBounds.IsRectInside(ScreenBounds); + return ScreenBounds.IsRectInside(m_worldRect) || m_worldRect.IsRectInside(ScreenBounds); } bool Navigator::ScaleImpl(m2::PointD const & newPt1, m2::PointD const & newPt2, @@ -279,7 +317,7 @@ bool Navigator::ScaleImpl(m2::PointD const & newPt1, m2::PointD const & newPt2, return false; // if (!skipMaxScaleAndBordersCheck && !CheckBorders(tmp)) -// tmp = AdjustToBounds(tmp, m2::RectD(MercatorBounds::minX, MercatorBounds::minY, MercatorBounds::maxX, MercatorBounds::maxY)); +// tmp = AdjustToBounds(tmp, m_worldRect); if (!CheckMinScale(tmp)) return false; diff --git a/map/navigator.hpp b/map/navigator.hpp index cb1000984b..cd7c06727d 100644 --- a/map/navigator.hpp +++ b/map/navigator.hpp @@ -62,7 +62,7 @@ public: private: - + m2::RectD m_worldRect; unsigned m_pxMinWidth; double m_metresMinWidth; bool CheckMinScale(ScreenBase const & screen); @@ -70,7 +70,7 @@ private: bool CheckBorders(ScreenBase const & screen); // adjusting screen to specified limits - ScreenBase const AdjustToBounds(ScreenBase const & screen, m2::RectD const & boundRect); + ScreenBase const AdjustToBounds(ScreenBase const & screen, m2::RectD const & boundRect, bool doScaleOnly); // Internal screen corresponding to the state when navigation began with StartDrag or StartScale. ScreenBase m_StartScreen; // Internal screen to do GtoP() and PtoG() calculations. It is always up to date with navigation. diff --git a/qt/draw_widget.cpp b/qt/draw_widget.cpp index 2423f5ecf4..dbae4ef454 100644 --- a/qt/draw_widget.cpp +++ b/qt/draw_widget.cpp @@ -34,6 +34,11 @@ namespace qt connect(m_pScale, SIGNAL(actionTriggered(int)), this, SLOT(ScaleChanged(int))); } + void DrawWidget::UpdateNow() + { + m_framework.UpdateNow(); + } + bool DrawWidget::LoadState() { pair widthAndHeight; @@ -44,7 +49,7 @@ namespace qt bool res = m_framework.LoadState(); - m_framework.UpdateNow(); +// m_framework.UpdateNow(); if (!res) return false; diff --git a/qt/draw_widget.hpp b/qt/draw_widget.hpp index 812fa30d00..d6df4e02c3 100644 --- a/qt/draw_widget.hpp +++ b/qt/draw_widget.hpp @@ -64,6 +64,8 @@ namespace qt /// @return false if can't load previously saved values bool LoadState(); + void UpdateNow(); + protected: static const uint32_t ini_file_version = 0; diff --git a/qt/mainwindow.cpp b/qt/mainwindow.cpp index 99b3dc6868..0aa8c8c79b 100644 --- a/qt/mainwindow.cpp +++ b/qt/mainwindow.cpp @@ -154,6 +154,8 @@ void MainWindow::LoadState() showMaximized(); m_pDrawWidget->ShowAll(); } + else + m_pDrawWidget->UpdateNow(); } void MainWindow::CreateClassifPanel()