diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 1efedb6852..43dd97b0f6 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -205,6 +205,14 @@ void DrapeEngine::Rotate(double azimuth, bool isAnim) AddUserEvent(make_unique_dp(azimuth, isAnim, nullptr /* parallelAnimCreator */)); } +void DrapeEngine::ScaleAndSetCenter(m2::PointD const & centerPt, double scaleFactor, bool isAnim, + bool trackVisibleViewport) +{ + PostUserEvent(make_unique_dp(scaleFactor, centerPt, isAnim, + trackVisibleViewport, + nullptr /* parallelAnimCreator */)); +} + void DrapeEngine::SetModelViewCenter(m2::PointD const & centerPt, int zoom, bool isAnim, bool trackVisibleViewport) { diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index a50f6e5c31..fd628bd67b 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -139,6 +139,9 @@ public: void Move(double factorX, double factorY, bool isAnim); void Rotate(double azimuth, bool isAnim); + void ScaleAndSetCenter(m2::PointD const & centerPt, double scaleFactor, bool isAnim, + bool trackVisibleViewport); + // If zoom == -1 then current zoom will not be changed. void SetModelViewCenter(m2::PointD const & centerPt, int zoom, bool isAnim, bool trackVisibleViewport); diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp index 540e9ef054..6a84146766 100644 --- a/drape_frontend/user_event_stream.cpp +++ b/drape_frontend/user_event_stream.cpp @@ -398,7 +398,8 @@ bool UserEventStream::OnSetRect(ref_ptr rectEvent) bool UserEventStream::OnSetCenter(ref_ptr centerEvent) { m2::PointD const & center = centerEvent->GetCenter(); - double zoom = centerEvent->GetZoom(); + auto const zoom = centerEvent->GetZoom(); + auto const scaleFactor = centerEvent->GetScaleFactor(); if (centerEvent->TrackVisibleViewport()) { @@ -408,14 +409,19 @@ bool UserEventStream::OnSetCenter(ref_ptr centerEvent) ScreenBase screen = GetCurrentScreen(); - if (zoom == kDoNotChangeZoom) + if (zoom != kDoNotChangeZoom) { - GetTargetScreen(screen); + screen.SetFromParams(center, screen.GetAngle(), GetScreenScale(zoom)); screen.MatchGandP3d(center, m_visibleViewport.Center()); } + else if (scaleFactor > 0.0) + { + screen.SetOrg(center); + ApplyScale(m_visibleViewport.Center(), scaleFactor, screen); + } else { - screen.SetFromParams(center, screen.GetAngle(), GetScreenScale(zoom)); + GetTargetScreen(screen); screen.MatchGandP3d(center, m_visibleViewport.Center()); } diff --git a/drape_frontend/user_event_stream.hpp b/drape_frontend/user_event_stream.hpp index 97751ed33a..d7698621a1 100644 --- a/drape_frontend/user_event_stream.hpp +++ b/drape_frontend/user_event_stream.hpp @@ -164,22 +164,37 @@ public: TAnimationCreator const & parallelAnimCreator) : m_center(center) , m_zoom(zoom) + , m_scaleFactor(0.0) , m_isAnim(isAnim) , m_trackVisibleViewport(trackVisibleViewport) , m_parallelAnimCreator(parallelAnimCreator) {} + SetCenterEvent(double scaleFactor, m2::PointD const & center, + bool isAnim, bool trackVisibleViewport, + TAnimationCreator const & parallelAnimCreator) + : m_center(center) + , m_zoom(-1) + , m_scaleFactor(scaleFactor) + , m_isAnim(isAnim) + , m_trackVisibleViewport(trackVisibleViewport) + , m_parallelAnimCreator(parallelAnimCreator) + {} + EventType GetType() const override { return UserEvent::EventType::SetCenter; } m2::PointD const & GetCenter() const { return m_center; } int GetZoom() const { return m_zoom; } + double GetScaleFactor() const { return m_scaleFactor; } bool IsAnim() const { return m_isAnim; } bool TrackVisibleViewport() const { return m_trackVisibleViewport; } TAnimationCreator const & GetParallelAnimCreator() const { return m_parallelAnimCreator; } private: m2::PointD m_center; // center point in mercator - int m_zoom; // if zoom == -1, then zoom level will'n change + int m_zoom; // if zoom == -1, then zoom level will not change + double m_scaleFactor; // this parameter is used when zoom == -1, + // if scaleFactor <= 0.0, then scale will not change bool m_isAnim; bool m_trackVisibleViewport; TAnimationCreator m_parallelAnimCreator; diff --git a/map/guides_manager.cpp b/map/guides_manager.cpp index 5471e2e2f5..3e4c002592 100644 --- a/map/guides_manager.cpp +++ b/map/guides_manager.cpp @@ -390,8 +390,9 @@ void GuidesManager::UpdateGuidesMarks() void GuidesManager::OnClusterSelected(GuidesClusterMark const & mark, ScreenBase const & screen) { - m_drapeEngine.SafeCall(&df::DrapeEngine::Scale, 2.0, screen.GtoP(mark.GetPivot()), - true /* isAnim */); + m_drapeEngine.SafeCall(&df::DrapeEngine::ScaleAndSetCenter, mark.GetPivot(), + 2.0 /* scaleFactor */, true /* isAnim */, + false /* trackVisibleViewport */); m_statistics.LogItemSelected(LayersStatistics::LayerItemType::Cluster); }