diff --git a/drape/overlay_tree.cpp b/drape/overlay_tree.cpp index 3376218ad9..84a31866f5 100644 --- a/drape/overlay_tree.cpp +++ b/drape/overlay_tree.cpp @@ -199,48 +199,53 @@ void OverlayTree::InsertHandle(ref_ptr handle, if (boundToParent) handleToCompare = parentOverlay; - // In this loop we decide which element must be visible. - // If input element "handle" more priority than all "Intersected elements" - // than we remove all "Intersected elements" and insert input element "handle". - // But if some of already inserted elements more priority than we don't insert "handle". - for (auto const & rivalHandle : rivals) + bool const selected = m_selectedFeatureID.IsValid() && (handleToCompare->GetFeatureID() == m_selectedFeatureID); + + if (!selected) { - bool rejectByDepth = false; - if (modelView.isPerspective()) + // In this loop we decide which element must be visible. + // If input element "handle" has more priority than all "Intersected elements", + // then we remove all "Intersected elements" and insert input element "handle". + // But if some of already inserted elements have more priority, then we don't insert "handle". + for (auto const & rivalHandle : rivals) { - bool const pathTextComparation = handle->HasDynamicAttributes() || rivalHandle->HasDynamicAttributes(); - rejectByDepth = !pathTextComparation && - handleToCompare->GetPivot(modelView, true).y > rivalHandle->GetPivot(modelView, true).y; - } - - if (rejectByDepth || comparator.IsGreater(rivalHandle, handleToCompare)) - { - // Handle is displaced and bound to its parent, parent will be displaced too. - if (boundToParent) + bool rejectByDepth = false; + if (modelView.isPerspective()) { - DeleteHandle(parentOverlay); - - #ifdef DEBUG_OVERLAYS_OUTPUT - LOG(LINFO, ("Displace (0):", handle->GetOverlayDebugInfo(), "->", parentOverlay->GetOverlayDebugInfo())); - #endif - - #ifdef COLLECT_DISPLACEMENT_INFO - m_displacementInfo.emplace_back(DisplacementData(handle->GetExtendedPixelRect(modelView).Center(), - parentOverlay->GetExtendedPixelRect(modelView).Center(), - dp::Color(0, 255, 0, 255))); - #endif + bool const pathTextComparation = handle->HasDynamicAttributes() || rivalHandle->HasDynamicAttributes(); + rejectByDepth = !pathTextComparation && + handleToCompare->GetPivot(modelView, true).y > rivalHandle->GetPivot(modelView, true).y; } - #ifdef DEBUG_OVERLAYS_OUTPUT - LOG(LINFO, ("Displace (1):", rivalHandle->GetOverlayDebugInfo(), "->", handle->GetOverlayDebugInfo())); - #endif + if (rejectByDepth || comparator.IsGreater(rivalHandle, handleToCompare)) + { + // Handle is displaced and bound to its parent, parent will be displaced too. + if (boundToParent) + { + DeleteHandle(parentOverlay); - #ifdef COLLECT_DISPLACEMENT_INFO - m_displacementInfo.emplace_back(DisplacementData(rivalHandle->GetExtendedPixelRect(modelView).Center(), - handle->GetExtendedPixelRect(modelView).Center(), - dp::Color(0, 0, 255, 255))); - #endif - return; +#ifdef DEBUG_OVERLAYS_OUTPUT + LOG(LINFO, ("Displace (0):", handle->GetOverlayDebugInfo(), "->", parentOverlay->GetOverlayDebugInfo())); +#endif + +#ifdef COLLECT_DISPLACEMENT_INFO + m_displacementInfo.emplace_back(DisplacementData(handle->GetExtendedPixelRect(modelView).Center(), + parentOverlay->GetExtendedPixelRect(modelView).Center(), + dp::Color(0, 255, 0, 255))); +#endif + } + +#ifdef DEBUG_OVERLAYS_OUTPUT + LOG(LINFO, ("Displace (1):", rivalHandle->GetOverlayDebugInfo(), "->", handle->GetOverlayDebugInfo())); +#endif + +#ifdef COLLECT_DISPLACEMENT_INFO + m_displacementInfo.emplace_back(DisplacementData(rivalHandle->GetExtendedPixelRect(modelView).Center(), + handle->GetExtendedPixelRect(modelView).Center(), + dp::Color(0, 0, 255, 255))); +#endif + return; + } } } @@ -256,15 +261,15 @@ void OverlayTree::InsertHandle(ref_ptr handle, { Erase(*it); - #ifdef DEBUG_OVERLAYS_OUTPUT +#ifdef DEBUG_OVERLAYS_OUTPUT LOG(LINFO, ("Displace (2):", handle->GetOverlayDebugInfo(), "->", (*it)->GetOverlayDebugInfo())); - #endif +#endif - #ifdef COLLECT_DISPLACEMENT_INFO +#ifdef COLLECT_DISPLACEMENT_INFO m_displacementInfo.emplace_back(DisplacementData(handle->GetExtendedPixelRect(modelView).Center(), (*it)->GetExtendedPixelRect(modelView).Center(), dp::Color(0, 0, 255, 255))); - #endif +#endif it = m_handlesCache.erase(it); } @@ -278,15 +283,15 @@ void OverlayTree::InsertHandle(ref_ptr handle, { DeleteHandle(rivalHandle); - #ifdef DEBUG_OVERLAYS_OUTPUT +#ifdef DEBUG_OVERLAYS_OUTPUT LOG(LINFO, ("Displace (3):", handle->GetOverlayDebugInfo(), "->", rivalHandle->GetOverlayDebugInfo())); - #endif +#endif - #ifdef COLLECT_DISPLACEMENT_INFO +#ifdef COLLECT_DISPLACEMENT_INFO m_displacementInfo.emplace_back(DisplacementData(handle->GetExtendedPixelRect(modelView).Center(), rivalHandle->GetExtendedPixelRect(modelView).Center(), dp::Color(0, 0, 255, 255))); - #endif +#endif } } @@ -415,6 +420,11 @@ void OverlayTree::SetDisplacementMode(int displacementMode) m_frameCounter = kInvalidFrame; } +void OverlayTree::SetSelectedFeature(FeatureID const & featureID) +{ + m_selectedFeatureID = featureID; +} + #ifdef COLLECT_DISPLACEMENT_INFO OverlayTree::TDisplacementInfo const & OverlayTree::GetDisplacementInfo() const diff --git a/drape/overlay_tree.hpp b/drape/overlay_tree.hpp index bf13ae88b5..8a65e18afb 100644 --- a/drape/overlay_tree.hpp +++ b/drape/overlay_tree.hpp @@ -65,6 +65,8 @@ public: void SetDisplacementEnabled(bool enabled); void SetDisplacementMode(int displacementMode); + void SetSelectedFeature(FeatureID const & featureID); + #ifdef COLLECT_DISPLACEMENT_INFO struct DisplacementData { @@ -95,6 +97,8 @@ private: bool m_isDisplacementEnabled; int m_displacementMode; + FeatureID m_selectedFeatureID; + #ifdef COLLECT_DISPLACEMENT_INFO TDisplacementInfo m_displacementInfo; #endif diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index ecd729ae7a..d45db5ef08 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -305,10 +305,10 @@ FeatureID DrapeEngine::GetVisiblePOI(m2::PointD const & glbPoint) return result; } -void DrapeEngine::SelectObject(SelectionShape::ESelectedObject obj, m2::PointD const & pt, bool isAnim) +void DrapeEngine::SelectObject(SelectionShape::ESelectedObject obj, m2::PointD const & pt, FeatureID const & featureId, bool isAnim) { m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, - make_unique_dp(obj, pt, isAnim), + make_unique_dp(obj, pt, featureId, isAnim), MessagePriority::High); } diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index 8799059452..421509a1ea 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -116,7 +116,7 @@ public: void SetUserPositionListener(TUserPositionChangedFn && fn); FeatureID GetVisiblePOI(m2::PointD const & glbPoint); - void SelectObject(SelectionShape::ESelectedObject obj, m2::PointD const & pt, bool isAnim); + void SelectObject(SelectionShape::ESelectedObject obj, m2::PointD const & pt, FeatureID const & featureID, bool isAnim); void DeselectObject(); bool GetMyPosition(m2::PointD & myPosition); SelectionShape::ESelectedObject GetSelectedObject(); diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 1f1ffa9286..3b06a0adbf 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -440,10 +440,11 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) case Message::SelectObject: { ref_ptr msg = message; + m_overlayTree->SetSelectedFeature(msg->IsDismiss() ? FeatureID() : msg->GetFeatureID()); if (m_selectionShape == nullptr) { m_selectObjectMessage = make_unique_dp(msg->GetSelectedObject(), msg->GetPosition(), - msg->IsAnim()); + msg->GetFeatureID(), msg->IsAnim()); break; } ProcessSelection(msg); diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index 4122e85397..49e327af05 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -471,31 +471,33 @@ class SelectObjectMessage : public Message { public: struct DismissTag {}; + SelectObjectMessage(DismissTag) - : SelectObjectMessage(SelectionShape::OBJECT_EMPTY, m2::PointD::Zero(), false, true) + : m_selected(SelectionShape::OBJECT_EMPTY) + , m_glbPoint(m2::PointD::Zero()) + , m_isAnim(false) + , m_isDismiss(true) {} - SelectObjectMessage(SelectionShape::ESelectedObject selectedObject, m2::PointD const & glbPoint, bool isAnim) - : SelectObjectMessage(selectedObject, glbPoint, isAnim, false) + SelectObjectMessage(SelectionShape::ESelectedObject selectedObject, m2::PointD const & glbPoint, FeatureID const & featureID, bool isAnim) + : m_selected(selectedObject) + , m_glbPoint(glbPoint) + , m_featureID(featureID) + , m_isAnim(isAnim) + , m_isDismiss(false) {} Type GetType() const override { return SelectObject; } m2::PointD const & GetPosition() const { return m_glbPoint; } SelectionShape::ESelectedObject GetSelectedObject() const { return m_selected; } + FeatureID const & GetFeatureID() const { return m_featureID; } bool IsAnim() const { return m_isAnim; } bool IsDismiss() const { return m_isDismiss; } -private: - SelectObjectMessage(SelectionShape::ESelectedObject obj, m2::PointD const & pt, bool isAnim, bool isDismiss) - : m_selected(obj) - , m_glbPoint(pt) - , m_isAnim(isAnim) - , m_isDismiss(isDismiss) - {} - private: SelectionShape::ESelectedObject m_selected; m2::PointD m_glbPoint; + FeatureID m_featureID; bool m_isAnim; bool m_isDismiss; }; diff --git a/map/framework.cpp b/map/framework.cpp index d8e2b811fd..d5932d178d 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1929,7 +1929,7 @@ void Framework::ActivateMapSelection(bool needAnimation, df::SelectionShape::ESe { ASSERT_NOT_EQUAL(selectionType, df::SelectionShape::OBJECT_EMPTY, ("Empty selections are impossible.")); m_selectedFeature = info.GetID(); - CallDrapeFunction(bind(&df::DrapeEngine::SelectObject, _1, selectionType, info.GetMercator(), + CallDrapeFunction(bind(&df::DrapeEngine::SelectObject, _1, selectionType, info.GetMercator(), info.GetID(), needAnimation)); SetDisplacementMode(info.m_isSponsoredHotel ? dp::displacement::kHotelMode : dp::displacement::kDefaultMode);