Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaria Volvenkova <d.volvenkova@corp.mail.ru>2016-06-21 17:07:46 +0300
committerVladimir Byko-Ianko <v.bykoianko@corp.mail.ru>2016-06-24 16:02:06 +0300
commit6d433ff0cafe85066601bea7dd7b82400d71a51a (patch)
tree472152f737314f702eb89a9826e60fe0cb3e4e00
parent99ebfac3a1a4e7a0bd77e5c155f62fb9545732bb (diff)
Selected feature's overlays can't be displaced.
-rw-r--r--drape/overlay_tree.cpp94
-rw-r--r--drape/overlay_tree.hpp4
-rw-r--r--drape_frontend/drape_engine.cpp4
-rw-r--r--drape_frontend/drape_engine.hpp2
-rwxr-xr-xdrape_frontend/frontend_renderer.cpp3
-rw-r--r--drape_frontend/message_subclasses.hpp24
-rw-r--r--map/framework.cpp2
7 files changed, 75 insertions, 58 deletions
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<OverlayHandle> 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;
- }
+ bool rejectByDepth = false;
+ if (modelView.isPerspective())
+ {
+ 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)
+ if (rejectByDepth || comparator.IsGreater(rivalHandle, handleToCompare))
{
- DeleteHandle(parentOverlay);
+ // Handle is displaced and bound to its parent, parent will be displaced too.
+ if (boundToParent)
+ {
+ DeleteHandle(parentOverlay);
- #ifdef DEBUG_OVERLAYS_OUTPUT
- LOG(LINFO, ("Displace (0):", handle->GetOverlayDebugInfo(), "->", parentOverlay->GetOverlayDebugInfo()));
- #endif
+#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 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 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;
+#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<OverlayHandle> 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<OverlayHandle> 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<SelectObjectMessage>(obj, pt, isAnim),
+ make_unique_dp<SelectObjectMessage>(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> message)
case Message::SelectObject:
{
ref_ptr<SelectObjectMessage> msg = message;
+ m_overlayTree->SetSelectedFeature(msg->IsDismiss() ? FeatureID() : msg->GetFeatureID());
if (m_selectionShape == nullptr)
{
m_selectObjectMessage = make_unique_dp<SelectObjectMessage>(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);