diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index f0c40fff36..8d9e6e97e3 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -452,17 +452,21 @@ void FrontendRenderer::TapDetected(m2::PointD const & pt, bool isLongTap) bool FrontendRenderer::SingleTouchFiltration(m2::PointD const & pt, TouchEvent::ETouchType type) { + float const rectHalfSize = 5; + m2::RectD r(-rectHalfSize, -rectHalfSize, rectHalfSize, rectHalfSize); + r.SetCenter(pt); + switch(type) { case TouchEvent::ETouchType::TOUCH_DOWN: - return m_guiRenderer->OnTouchDown(pt); + return m_guiRenderer->OnTouchDown(r); case TouchEvent::ETouchType::TOUCH_UP: - m_guiRenderer->OnTouchUp(pt); + m_guiRenderer->OnTouchUp(r); return false; case TouchEvent::ETouchType::TOUCH_CANCEL: - m_guiRenderer->OnTouchCancel(pt); + m_guiRenderer->OnTouchCancel(r); return false; case TouchEvent::ETouchType::TOUCH_MOVE: diff --git a/drape_gui/layer_render.cpp b/drape_gui/layer_render.cpp index de2af37fe3..26addceac5 100644 --- a/drape_gui/layer_render.cpp +++ b/drape_gui/layer_render.cpp @@ -180,11 +180,11 @@ void LayerRenderer::AddShapeRenderer(Skin::ElementName name, drape_ptrProcessTapEvent(pt); + m_activeOverlay = r.second->ProcessTapEvent(touchArea); if (m_activeOverlay != nullptr) { m_activeOverlay->OnTapBegin(); @@ -195,11 +195,11 @@ bool LayerRenderer::OnTouchDown(m2::PointD const & pt) return false; } -void LayerRenderer::OnTouchUp(m2::PointD const & pt) +void LayerRenderer::OnTouchUp(m2::RectD const & touchArea) { if (m_activeOverlay != nullptr) { - if (m_activeOverlay->IsTapped(pt)) + if (m_activeOverlay->IsTapped(touchArea)) m_activeOverlay->OnTap(); m_activeOverlay->OnTapEnd(); @@ -207,9 +207,9 @@ void LayerRenderer::OnTouchUp(m2::PointD const & pt) } } -void LayerRenderer::OnTouchCancel(m2::PointD const & pt) +void LayerRenderer::OnTouchCancel(m2::RectD const & touchArea) { - UNUSED_VALUE(pt); + UNUSED_VALUE(touchArea); if (m_activeOverlay != nullptr) { m_activeOverlay->OnTapEnd(); diff --git a/drape_gui/layer_render.hpp b/drape_gui/layer_render.hpp index 007f5bd87c..ea566ba732 100644 --- a/drape_gui/layer_render.hpp +++ b/drape_gui/layer_render.hpp @@ -30,9 +30,9 @@ public: void Render(ref_ptr mng, ScreenBase const & screen); void Merge(ref_ptr other); - bool OnTouchDown(m2::PointD const & pt); - void OnTouchUp(m2::PointD const & pt); - void OnTouchCancel(m2::PointD const & pt); + bool OnTouchDown(m2::RectD const & touchArea); + void OnTouchUp(m2::RectD const & touchArea); + void OnTouchCancel(m2::RectD const & touchArea); private: void DestroyRenderers(); diff --git a/drape_gui/shape.cpp b/drape_gui/shape.cpp index 2f0a928827..54d106a308 100644 --- a/drape_gui/shape.cpp +++ b/drape_gui/shape.cpp @@ -37,7 +37,7 @@ void Handle::GetPixelShape(const ScreenBase & screen, dp::OverlayHandle::Rects & UNUSED_VALUE(rects); } -bool TappableHandle::IsTapped(m2::PointD const & pt) const +bool TappableHandle::IsTapped(m2::RectD const & touchArea) const { if (!IsVisible() || !IsValid()) return false; @@ -46,7 +46,7 @@ bool TappableHandle::IsTapped(m2::PointD const & pt) const { m2::RectD rect(m_pivot.x - m_size.x * 0.5, m_pivot.y - m_size.y * 0.5, m_pivot.x + m_size.x * 0.5, m_pivot.y + m_size.y * 0.5); - return rect.IsPointInside(pt); + return rect.Intersect(touchArea); } else { @@ -131,12 +131,12 @@ void ShapeRenderer::ForEachShapeInfo(ShapeRenderer::TShapeInfoEditFn const & fn) }); } -ref_ptr ShapeRenderer::ProcessTapEvent(m2::PointD const & pt) +ref_ptr ShapeRenderer::ProcessTapEvent(m2::RectD const & touchArea) { ref_ptr resultHandle = nullptr; - ForEachShapeInfo([&resultHandle, &pt](ShapeControl::ShapeInfo & shapeInfo) + ForEachShapeInfo([&resultHandle, &touchArea](ShapeControl::ShapeInfo & shapeInfo) { - if (shapeInfo.m_handle->IsTapped(pt)) + if (shapeInfo.m_handle->IsTapped(touchArea)) { ASSERT(resultHandle == nullptr, ("Overlays cannot be intersected")); resultHandle = make_ref(shapeInfo.m_handle); diff --git a/drape_gui/shape.hpp b/drape_gui/shape.hpp index f1f27185cc..f9be811c79 100644 --- a/drape_gui/shape.hpp +++ b/drape_gui/shape.hpp @@ -22,7 +22,7 @@ public: void Update(ScreenBase const & screen) override; - virtual bool IsTapped(m2::PointD const & pt) const { return false; } + virtual bool IsTapped(m2::RectD const & touchArea) const { return false; } virtual void OnTapBegin(){} virtual void OnTap(){} virtual void OnTapEnd(){} @@ -47,7 +47,7 @@ public: : Handle(anchor, pivot, size) {} - bool IsTapped(m2::PointD const & pt) const override; + bool IsTapped(m2::RectD const & touchArea) const override; }; struct ShapeControl @@ -89,7 +89,7 @@ public: void AddShape(dp::GLState const & state, drape_ptr && bucket); void AddShapeControl(ShapeControl && control); - ref_ptr ProcessTapEvent(m2::PointD const & pt); + ref_ptr ProcessTapEvent(m2::RectD const & touchArea); private: friend void ArrangeShapes(ref_ptr,