From bb14866df0973f8e6dde0bf5680e6aabb26405f0 Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Thu, 15 Oct 2015 16:34:20 +0300 Subject: [PATCH] Fixed navigation animations, some other bugfixes --- data/styles/clear/include/defaults.mapcss | 22 +++++++++++++-- drape/drape_global.hpp | 8 +++--- drape_frontend/drape_engine.cpp | 8 ++++++ drape_frontend/drape_engine.hpp | 1 + drape_frontend/frontend_renderer.cpp | 6 ++--- drape_frontend/frontend_renderer.hpp | 3 ++- drape_frontend/gui/ruler_helper.cpp | 2 +- drape_frontend/line_shape.cpp | 3 +++ drape_frontend/message_subclasses.hpp | 13 +++++++-- drape_frontend/my_position_controller.cpp | 23 +++++++--------- drape_frontend/my_position_controller.hpp | 10 ++++--- drape_frontend/user_event_stream.cpp | 27 ++++++++++++++----- drape_frontend/user_event_stream.hpp | 7 +++-- .../MapViewControls/APIBar/MWMAPIBar.mm | 2 +- .../Search/MWMSearchManager.mm | 2 +- iphone/Maps/Classes/MapViewController.mm | 4 +-- map/framework.cpp | 5 ++-- 17 files changed, 101 insertions(+), 45 deletions(-) diff --git a/data/styles/clear/include/defaults.mapcss b/data/styles/clear/include/defaults.mapcss index 0c34a7a9dd..b69ac164f1 100644 --- a/data/styles/clear/include/defaults.mapcss +++ b/data/styles/clear/include/defaults.mapcss @@ -1,10 +1,28 @@ way::* { - linejoin: round; - linecap: round; text-position: line; } +way|z1-12::* +{ + linejoin: bevel; +} + +way|z13-::* +{ + linejoin: round; +} + +way|z1-15::* +{ + linecap: butt; +} + +way|z16-::* +{ + linecap: round; +} + *::* { text-halo-color: @white; diff --git a/drape/drape_global.hpp b/drape/drape_global.hpp index e5bb35497f..8487ad7f8d 100644 --- a/drape/drape_global.hpp +++ b/drape/drape_global.hpp @@ -49,14 +49,14 @@ enum Anchor enum LineCap { SquareCap = -1, - RoundCap = 0, - ButtCap = 1, + RoundCap = 0, + ButtCap = 1, }; enum LineJoin { - MiterJoin = -1, - BevelJoin = 0, + MiterJoin = -1, + BevelJoin = 0, RoundJoin = 1, }; diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 802c0434d1..a547a5ac07 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -261,6 +261,14 @@ void DrapeEngine::MyPositionNextMode() MessagePriority::High); } +void DrapeEngine::FollowRoute(int preferredZoomLevel) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(ChangeMyPositionModeMessage::TYPE_NEXT, + preferredZoomLevel), + MessagePriority::High); +} + void DrapeEngine::CancelMyPosition() { m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index 5bf59b001a..a42e5152b2 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -103,6 +103,7 @@ public: void AddRoute(m2::PolylineD const & routePolyline, vector const & turns, dp::Color const & color); void RemoveRoute(bool deactivateFollowing); + void FollowRoute(int preferredZoomLevel); void SetWidgetLayout(gui::TWidgetsLayoutInfo && info); gui::TWidgetsSizeInfo const & GetWidgetSizes(); diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index d97a08f63e..13efe7e6cd 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -232,7 +232,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) switch (msg->GetChangeType()) { case ChangeMyPositionModeMessage::TYPE_NEXT: - m_myPositionController->NextMode(); + m_myPositionController->NextMode(msg->GetPreferredZoomLevel()); break; case ChangeMyPositionModeMessage::TYPE_STOP_FOLLOW: m_myPositionController->StopLocationFollow(); @@ -905,9 +905,9 @@ void FrontendRenderer::ChangeModelView(m2::RectD const & rect) } void FrontendRenderer::ChangeModelView(m2::PointD const & userPos, double azimuth, - m2::PointD const & pxZero) + m2::PointD const & pxZero, int preferredZoomLevel) { - AddUserEvent(FollowAndRotateEvent(userPos, pxZero, azimuth, true)); + AddUserEvent(FollowAndRotateEvent(userPos, pxZero, azimuth, preferredZoomLevel, true)); } ScreenBase const & FrontendRenderer::UpdateScene(bool & modelViewChanged) diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 6aaa1ed9ce..75bfe35ef9 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -119,7 +119,8 @@ public: void ChangeModelView(m2::PointD const & center) override; void ChangeModelView(double azimuth) override; void ChangeModelView(m2::RectD const & rect) override; - void ChangeModelView(m2::PointD const & userPos, double azimuth, m2::PointD const & pxZero) override; + void ChangeModelView(m2::PointD const & userPos, double azimuth, + m2::PointD const & pxZero, int preferredZoomLevel) override; protected: void AcceptMessage(ref_ptr message) override; diff --git a/drape_frontend/gui/ruler_helper.cpp b/drape_frontend/gui/ruler_helper.cpp index 27719bde84..b12022ab1c 100644 --- a/drape_frontend/gui/ruler_helper.cpp +++ b/drape_frontend/gui/ruler_helper.cpp @@ -155,7 +155,7 @@ bool RulerHelper::IsVisible(ScreenBase const & screen) const float RulerHelper::GetRulerHalfHeight() const { - return 2 * df::VisualParams::Instance().GetVisualScale(); + return 1 * df::VisualParams::Instance().GetVisualScale(); } float RulerHelper::GetRulerPixelLength() const diff --git a/drape_frontend/line_shape.cpp b/drape_frontend/line_shape.cpp index 35c599e19c..b95494e917 100644 --- a/drape_frontend/line_shape.cpp +++ b/drape_frontend/line_shape.cpp @@ -399,6 +399,9 @@ public: void SubmitCap(LineSegment const & segment, bool isStart) { + if (m_params.m_cap == dp::ButtCap) + return; + EPointType const type = isStart ? StartPoint : EndPoint; float const sign = isStart ? -1.0 : 1.0; SubmitJoinImpl(glsl::vec3(segment.m_points[type], m_params.m_depth), GenerateCap(segment, type, sign, isStart)); diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index a6fe23c8b3..be785b7680 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -370,14 +370,23 @@ public: explicit ChangeMyPositionModeMessage(EChangeType changeType) : m_changeType(changeType) - { - } + , m_preferredZoomLevel(-1) + {} + + explicit ChangeMyPositionModeMessage(EChangeType changeType, int zoomLevel) + : m_changeType(changeType) + , m_preferredZoomLevel(zoomLevel) + {} EChangeType GetChangeType() const { return m_changeType; } Type GetType() const override { return Message::ChangeMyPostitionMode; } + void SetPreferredZoomLevel(int zoomLevel) { m_preferredZoomLevel = zoomLevel; } + int GetPreferredZoomLevel() const { return m_preferredZoomLevel; } + private: EChangeType const m_changeType; + int m_preferredZoomLevel; }; class CompassInfoMessage : public Message diff --git a/drape_frontend/my_position_controller.cpp b/drape_frontend/my_position_controller.cpp index 4ff23f34dd..c04f70ea02 100644 --- a/drape_frontend/my_position_controller.cpp +++ b/drape_frontend/my_position_controller.cpp @@ -205,7 +205,7 @@ void MyPositionController::SetFixedZoom() SetModeInfo(SetModeBit(m_modeInfo, FixedZoomBit)); } -void MyPositionController::NextMode() +void MyPositionController::NextMode(int preferredZoomLevel) { string const kAlohalyticsClickEvent = "$onClick"; location::EMyPositionMode currentMode = GetMode(); @@ -251,7 +251,7 @@ void MyPositionController::NextMode() } SetModeInfo(ChangeMode(m_modeInfo, newMode)); - Follow(); + Follow(preferredZoomLevel); } void MyPositionController::TurnOff() @@ -342,11 +342,8 @@ void MyPositionController::AnimateStateTransition(location::EMyPositionMode oldM ChangeModelView(m2::RectD(m_position - size, m_position + size)); } } - else if (newMode == location::MODE_ROTATE_AND_FOLLOW) - { - Follow(); - } - else if (oldMode == location::MODE_ROTATE_AND_FOLLOW && newMode == location::MODE_UNKNOWN_POSITION) + else if (oldMode == location::MODE_ROTATE_AND_FOLLOW && + (newMode == location::MODE_FOLLOW || newMode == location::MODE_UNKNOWN_POSITION)) { ChangeModelView(0.0); ChangeModelView(m_position); @@ -473,19 +470,19 @@ void MyPositionController::ChangeModelView(m2::RectD const & rect) } void MyPositionController::ChangeModelView(m2::PointD const & userPos, double azimuth, - m2::PointD const & pxZero) + m2::PointD const & pxZero, int preferredZoomLevel) { if (m_listener) - m_listener->ChangeModelView(userPos, azimuth, pxZero); + m_listener->ChangeModelView(userPos, azimuth, pxZero, preferredZoomLevel); } -void MyPositionController::Follow() +void MyPositionController::Follow(int preferredZoomLevel) { location::EMyPositionMode currentMode = GetMode(); if (currentMode == location::MODE_FOLLOW) ChangeModelView(m_position); else if (currentMode == location::MODE_ROTATE_AND_FOLLOW) - ChangeModelView(m_position, m_drawDirection, GetRaFPixelBinding()); + ChangeModelView(m_position, m_drawDirection, GetRaFPixelBinding(), preferredZoomLevel); } m2::PointD MyPositionController::GetRaFPixelBinding() const @@ -557,8 +554,8 @@ void MyPositionController::DeactivateRouting() location::EMyPositionMode currentMode = GetMode(); if (currentMode == location::MODE_ROTATE_AND_FOLLOW) SetModeInfo(ChangeMode(m_modeInfo, location::MODE_FOLLOW)); - - ChangeModelView(0.0); + else + ChangeModelView(0.0); } } diff --git a/drape_frontend/my_position_controller.hpp b/drape_frontend/my_position_controller.hpp index 2fa07ef0cc..42a913c509 100644 --- a/drape_frontend/my_position_controller.hpp +++ b/drape_frontend/my_position_controller.hpp @@ -29,7 +29,8 @@ public: /// Somehow show map that "rect" will see virtual void ChangeModelView(m2::RectD const & rect) = 0; /// Show map where "usePos" (mercator) placed in "pxZero" on screen and map rotated around "userPos" - virtual void ChangeModelView(m2::PointD const & userPos, double azimuth, m2::PointD const & pxZero) = 0; + virtual void ChangeModelView(m2::PointD const & userPos, double azimuth, m2::PointD const & pxZero, + int preferredZoomLevel) = 0; }; // Render bits @@ -70,7 +71,7 @@ public: void StopLocationFollow(); void StopCompassFollow(); - void NextMode(); + void NextMode(int preferredZoomLevel = -1); void TurnOff(); void Invalidate(); @@ -102,9 +103,10 @@ private: void ChangeModelView(m2::PointD const & center); void ChangeModelView(double azimuth); void ChangeModelView(m2::RectD const & rect); - void ChangeModelView(m2::PointD const & userPos, double azimuth, m2::PointD const & pxZero); + void ChangeModelView(m2::PointD const & userPos, double azimuth, m2::PointD const & pxZero, + int preferredZoomLevel); - void Follow(); + void Follow(int preferredZoomLevel = -1); m2::PointD GetRaFPixelBinding() const; m2::PointD GetCurrentPixelBinding() const; diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp index a7e43e4812..7875a0c993 100644 --- a/drape_frontend/user_event_stream.cpp +++ b/drape_frontend/user_event_stream.cpp @@ -171,7 +171,8 @@ ScreenBase const & UserEventStream::ProcessEvents(bool & modelViewChange, bool & break; case UserEvent::EVENT_FOLLOW_AND_ROTATE: breakAnim = SetFollowAndRotate(e.m_followAndRotate.m_userPos, e.m_followAndRotate.m_pixelZero, - e.m_followAndRotate.m_azimuth, e.m_followAndRotate.m_isAnim); + e.m_followAndRotate.m_azimuth, e.m_followAndRotate.m_preferredZoomLevel, + e.m_followAndRotate.m_isAnim); TouchCancel(m_touches); break; default: @@ -298,14 +299,28 @@ bool UserEventStream::SetRect(m2::AnyRectD const & rect, bool isAnim, TAnimation return true; } -bool UserEventStream::SetFollowAndRotate(m2::PointD const & userPos, m2::PointD const & pixelPos, double azimuth, bool isAnim) +bool UserEventStream::SetFollowAndRotate(m2::PointD const & userPos, m2::PointD const & pixelPos, + double azimuth, int preferredZoomLevel, bool isAnim) { - // Extract target local rect from current animation to preserve final scale. + // Extract target local rect from current animation or calculate it from preferredZoomLevel + // to preserve final scale. m2::RectD targetLocalRect; - if (m_animation != nullptr) - targetLocalRect = m_animation->GetTargetRect(GetCurrentScreen()).GetLocalRect(); + if (preferredZoomLevel != -1) + { + ScreenBase newScreen = GetCurrentScreen(); + m2::RectD r = df::GetRectForDrawScale(preferredZoomLevel, m2::PointD::Zero()); + CheckMinGlobalRect(r); + CheckMinMaxVisibleScale(m_isCountryLoaded, r, preferredZoomLevel); + newScreen.SetFromRect(m2::AnyRectD(r)); + targetLocalRect = newScreen.GlobalRect().GetLocalRect(); + } else - targetLocalRect = GetCurrentRect().GetLocalRect(); + { + if (m_animation != nullptr) + targetLocalRect = m_animation->GetTargetRect(GetCurrentScreen()).GetLocalRect(); + else + targetLocalRect = GetCurrentRect().GetLocalRect(); + } if (isAnim) { diff --git a/drape_frontend/user_event_stream.hpp b/drape_frontend/user_event_stream.hpp index 9a77bae88c..d31d63e70e 100644 --- a/drape_frontend/user_event_stream.hpp +++ b/drape_frontend/user_event_stream.hpp @@ -128,16 +128,18 @@ struct SetAnyRectEvent struct FollowAndRotateEvent { FollowAndRotateEvent(m2::PointD const & userPos, m2::PointD const & pixelZero, - double azimuth, bool isAnim) + double azimuth, int preferredZoomLevel, bool isAnim) : m_userPos(userPos) , m_pixelZero(pixelZero) , m_azimuth(azimuth) + , m_preferredZoomLevel(preferredZoomLevel) , m_isAnim(isAnim) {} m2::PointD m_userPos; m2::PointD m_pixelZero; double m_azimuth; + int m_preferredZoomLevel; bool m_isAnim; }; @@ -251,7 +253,8 @@ private: bool SetRect(m2::RectD rect, int zoom, bool applyRotation, bool isAnim); bool SetRect(m2::AnyRectD const & rect, bool isAnim); bool SetRect(m2::AnyRectD const & rect, bool isAnim, TAnimationCreator const & animCreator); - bool SetFollowAndRotate(m2::PointD const & userPos, m2::PointD const & pixelPos, double azimuth, bool isAnim); + bool SetFollowAndRotate(m2::PointD const & userPos, m2::PointD const & pixelPos, + double azimuth, int preferredZoomLevel, bool isAnim); m2::AnyRectD GetCurrentRect() const; diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/APIBar/MWMAPIBar.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/APIBar/MWMAPIBar.mm index 046edcccae..83f899bc11 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/APIBar/MWMAPIBar.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/APIBar/MWMAPIBar.mm @@ -54,7 +54,7 @@ static NSString * const kKeyPath = @"subviews"; { [[Statistics instance] logEvent:kStatEventName(kStatAPI, kStatBack)]; Framework & f = GetFramework(); - f.DeactivateUserMark(); + f.ActivateUserMark(nullptr, true); UserMarkControllerGuard guard(f.GetBookmarkManager(), UserMarkType::API_MARK); guard.m_controller.Clear(); self.isVisible = NO; diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/Search/MWMSearchManager.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/Search/MWMSearchManager.mm index e6509b7fd1..041fd614d2 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/Search/MWMSearchManager.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/Search/MWMSearchManager.mm @@ -286,7 +286,7 @@ extern NSString * const kSearchStateKey = @"SearchStateKey"; UITextField * textField = self.searchTextField; f.SaveSearchQuery(make_pair(textField.textInputMode.primaryLanguage.UTF8String, textField.text.precomposedStringWithCompatibilityMapping.UTF8String)); - f.DeactivateUserMark(); + f.ActivateUserMark(nullptr, true); [self.searchTextField resignFirstResponder]; self.rootView.compact = YES; self.tableViewController.searchOnMap = YES; diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index 72c3595500..38e0bbbb5c 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -544,7 +544,7 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) if (f.GetRouter() == routing::RouterType::Pedestrian) [self countPedestrianRoute]; self.controlsManager.routeBuildingProgress = 100.; - f.DiactivateUserMark(); + f.ActivateUserMark(nullptr, true); [self.searchView setState:SearchViewStateHidden animated:YES]; if (self.forceRoutingStateChange == ForceRoutingStateChangeStartFollowing) [self.controlsManager routingNavigation]; @@ -815,7 +815,7 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) { Framework & f = GetFramework(); if (self.popoverVC) - f.DeactivateUserMark(); + f.ActivateUserMark(nullptr, true); double const sf = self.view.contentScaleFactor; diff --git a/map/framework.cpp b/map/framework.cpp index 57090dd912..f2dd6b1e5a 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1820,13 +1820,12 @@ void Framework::BuildRoute(m2::PointD const & start, m2::PointD const & finish, void Framework::FollowRoute() { ASSERT(m_drapeEngine != nullptr, ()); - m_drapeEngine->MyPositionNextMode(); - m2::PointD const & position = m_routingSession.GetUserCurrentPosition(); int const scale = (m_currentRouterType == RouterType::Pedestrian) ? scales::GetUpperComfortScale() : scales::GetNavigationScale(); - m_drapeEngine->SetModelViewCenter(position, scale, true); + + m_drapeEngine->FollowRoute(scale); } void Framework::SetRouter(RouterType type)