diff options
author | Juha Alanen <juha.alanen@mapbox.com> | 2019-10-30 11:57:20 +0200 |
---|---|---|
committer | Juha Alanen <juha.alanen@mapbox.com> | 2019-11-21 12:31:34 +0200 |
commit | 2ae8e1782b503cefa798c3c2e80b44687b19bdbb (patch) | |
tree | 32abfe9e7dec7b2a765b33184b75d48dd32e536c | |
parent | 18bf745049e1df650cbd40dcfb5f36361678c7c7 (diff) | |
download | qtlocation-mapboxgl-2ae8e1782b503cefa798c3c2e80b44687b19bdbb.tar.gz |
[glfw] Update feature state only when the layer is visible
-rw-r--r-- | platform/glfw/glfw_view.cpp | 70 | ||||
-rw-r--r-- | platform/glfw/glfw_view.hpp | 1 |
2 files changed, 38 insertions, 33 deletions
diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp index 9a2fefaade..bf235300a5 100644 --- a/platform/glfw/glfw_view.cpp +++ b/platform/glfw/glfw_view.cpp @@ -130,6 +130,7 @@ GLFWView::GLFWView(bool fullscreen_, bool benchmark_) printf("- Press `B` to cycle through the color, stencil, and depth buffer\n"); printf("- Press `D` to cycle through camera bounds: inside, crossing IDL at left, crossing IDL at right, and disabled\n"); printf("- Press `T` to add custom geometry source\n"); + printf("- Press `F` to enable feature-state demo\n"); printf("\n"); printf("- Press `1` through `6` to add increasing numbers of point annotations for testing\n"); printf("- Press `7` through `0` to add increasing numbers of shape annotations for testing\n"); @@ -606,39 +607,9 @@ void GLFWView::onMouseMove(GLFWwindow *window, double x, double y) { view->lastX = x; view->lastY = y; - auto &style = view->map->getStyle(); - if (style.getLayer("state-fills")) { - auto screenCoordinate = mbgl::ScreenCoordinate{view->lastX, view->lastY}; - const mbgl::RenderedQueryOptions queryOptions({{{"state-fills"}}, {}}); - auto result = view->rendererFrontend->getRenderer()->queryRenderedFeatures(screenCoordinate, queryOptions); - using namespace mbgl; - FeatureState newState; - - if (result.size() > 0) { - FeatureIdentifier id = result[0].id; - optional<std::string> idStr = featureIDtoString(id); - - if (idStr) { - if (view->featureID && (*view->featureID != *idStr)) { - newState["hover"] = false; - view->rendererFrontend->getRenderer()->setFeatureState("states", {}, *view->featureID, newState); - view->featureID = nullopt; - } - - if (!view->featureID) { - newState["hover"] = true; - view->featureID = featureIDtoString(id); - view->rendererFrontend->getRenderer()->setFeatureState("states", {}, *view->featureID, newState); - } - } - } else { - if (view->featureID) { - newState["hover"] = false; - view->rendererFrontend->getRenderer()->setFeatureState("states", {}, *view->featureID, newState); - view->featureID = nullopt; - } - } - view->invalidate(); + auto layer = view->map->getStyle().getLayer("state-fills"); + if (layer && layer->getVisibility() == mbgl::style::VisibilityType::Visible) { + view->updateFeatureState(window); } } @@ -810,3 +781,36 @@ void GLFWView::toggleCustomSource() { mbgl::style::VisibilityType::None : mbgl::style::VisibilityType::Visible); } } + +void GLFWView::updateFeatureState(GLFWwindow *window_) { + auto *view = reinterpret_cast<GLFWView *>(glfwGetWindowUserPointer(window_)); + auto screenCoordinate = mbgl::ScreenCoordinate{view->lastX, view->lastY}; + const mbgl::RenderedQueryOptions queryOptions({{{"state-fills"}}, {}}); + auto result = view->rendererFrontend->getRenderer()->queryRenderedFeatures(screenCoordinate, queryOptions); + using namespace mbgl; + FeatureState newState; + + if (!result.empty()) { + FeatureIdentifier id = result[0].id; + optional<std::string> idStr = featureIDtoString(id); + + if (idStr) { + if (view->featureID && (*view->featureID != *idStr)) { + newState["hover"] = false; + view->rendererFrontend->getRenderer()->setFeatureState("states", {}, *view->featureID, newState); + view->featureID = nullopt; + } + + if (!view->featureID) { + newState["hover"] = true; + view->featureID = featureIDtoString(id); + view->rendererFrontend->getRenderer()->setFeatureState("states", {}, *view->featureID, newState); + } + } + } else if (view->featureID) { + newState["hover"] = false; + view->rendererFrontend->getRenderer()->setFeatureState("states", {}, *view->featureID, newState); + view->featureID = nullopt; + } + view->invalidate(); +} diff --git a/platform/glfw/glfw_view.hpp b/platform/glfw/glfw_view.hpp index dbe6ceb046..015c67aee0 100644 --- a/platform/glfw/glfw_view.hpp +++ b/platform/glfw/glfw_view.hpp @@ -87,6 +87,7 @@ private: void addAnimatedAnnotation(); void updateAnimatedAnnotations(); void toggleCustomSource(); + void updateFeatureState(GLFWwindow *window); void clearAnnotations(); void popAnnotation(); |