diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 2fde91155d..c81d40faf6 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -540,10 +540,11 @@ void DrapeEngine::SetUserPositionPendingTimeoutListener(UserPositionPendingTimeo } void DrapeEngine::SelectObject(SelectionShape::ESelectedObject obj, m2::PointD const & pt, - FeatureID const & featureId, bool isAnim) + FeatureID const & featureId, bool isAnim, bool isGeometrySelectionAllowed) { m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, - make_unique_dp(obj, pt, featureId, isAnim), + make_unique_dp(obj, pt, featureId, + isAnim, isGeometrySelectionAllowed), MessagePriority::Normal); } diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index 82b5ddc605..60c2f787b0 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -173,7 +173,7 @@ public: void SetUserPositionPendingTimeoutListener(UserPositionPendingTimeoutHandler && fn); void SelectObject(SelectionShape::ESelectedObject obj, m2::PointD const & pt, - FeatureID const & featureID, bool isAnim); + FeatureID const & featureID, bool isAnim, bool isGeometrySelectionAllowed); void DeselectObject(); dp::DrapeID AddSubroute(SubrouteConstPtr subroute); diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index b4307179c4..f63b216697 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -506,7 +506,8 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) if (m_selectionShape == nullptr) { m_selectObjectMessage = make_unique_dp(msg->GetSelectedObject(), msg->GetPosition(), - msg->GetFeatureID(), msg->IsAnim()); + msg->GetFeatureID(), msg->IsAnim(), + msg->IsGeometrySelectionAllowed()); break; } ProcessSelection(msg); @@ -1343,10 +1344,13 @@ void FrontendRenderer::ProcessSelection(ref_ptr msg) m_selectionTrackInfo = SelectionTrackInfo(modelView.GlobalRect(), startPosition); } - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - make_unique_dp( - msg->GetFeatureID(), m_selectionShape->GetRecacheId()), - MessagePriority::Normal); + if (msg->IsGeometrySelectionAllowed()) + { + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp( + msg->GetFeatureID(), m_selectionShape->GetRecacheId()), + MessagePriority::Normal); + } } } diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index 0f01c1a9f6..8a845aa54b 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -534,12 +534,14 @@ public: {} SelectObjectMessage(SelectionShape::ESelectedObject selectedObject, - m2::PointD const & glbPoint, FeatureID const & featureID, bool isAnim) + m2::PointD const & glbPoint, FeatureID const & featureID, + bool isAnim, bool isGeometrySelectionAllowed) : m_selected(selectedObject) , m_glbPoint(glbPoint) , m_featureID(featureID) , m_isAnim(isAnim) , m_isDismiss(false) + , m_isGeometrySelectionAllowed(isGeometrySelectionAllowed) {} Type GetType() const override { return Type::SelectObject; } @@ -550,6 +552,7 @@ public: FeatureID const & GetFeatureID() const { return m_featureID; } bool IsAnim() const { return m_isAnim; } bool IsDismiss() const { return m_isDismiss; } + bool IsGeometrySelectionAllowed() const { return m_isGeometrySelectionAllowed; } private: SelectionShape::ESelectedObject m_selected; @@ -557,6 +560,7 @@ private: FeatureID m_featureID; bool m_isAnim; bool m_isDismiss; + bool m_isGeometrySelectionAllowed; }; class CheckSelectionGeometryMessage : public Message diff --git a/map/framework.cpp b/map/framework.cpp index ca58fb6ebf..7a7763bfaa 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -2409,7 +2409,13 @@ void Framework::ActivateMapSelection(bool needAnimation, df::SelectionShape::ESe ASSERT_NOT_EQUAL(selectionType, df::SelectionShape::OBJECT_EMPTY, ("Empty selections are impossible.")); m_selectedFeature = info.GetID(); if (m_drapeEngine != nullptr) - m_drapeEngine->SelectObject(selectionType, info.GetMercator(), info.GetID(), needAnimation); + { + bool isGeometrySelectionAllowed = false; + if (!m_lastTapEvent || !m_lastTapEvent->m_info.m_isLong) + isGeometrySelectionAllowed = true; + m_drapeEngine->SelectObject(selectionType, info.GetMercator(), info.GetID(), needAnimation, + isGeometrySelectionAllowed); + } SetDisplacementMode(DisplacementModeManager::SLOT_MAP_SELECTION, ftypes::IsHotelChecker::Instance()(info.GetTypes()) /* show */);