From 2db195f663aacb83e7f10018d885dfb5c4d542f0 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Wed, 27 May 2020 05:46:45 +0300 Subject: [PATCH] [guides on map] Filter POI when guides layer is enabled --- drape_frontend/backend_renderer.cpp | 13 +++++- drape_frontend/backend_renderer.hpp | 6 ++- drape_frontend/drape_engine.cpp | 8 ++++ drape_frontend/drape_engine.hpp | 5 +++ drape_frontend/engine_context.cpp | 2 + drape_frontend/engine_context.hpp | 3 ++ drape_frontend/frontend_renderer.cpp | 1 + drape_frontend/message.hpp | 1 + drape_frontend/message_subclasses.hpp | 15 +++++++ drape_frontend/read_manager.cpp | 14 ++++++- drape_frontend/read_manager.hpp | 4 +- drape_frontend/rule_drawer.cpp | 35 ++++++++++++++++ indexer/ftypes_matcher.cpp | 57 +++++++++++++++++++++++++++ indexer/ftypes_matcher.hpp | 21 ++++++++++ map/bookmark_helpers.cpp | 2 +- map/framework.cpp | 12 +++--- map/guides_manager.cpp | 1 + 17 files changed, 188 insertions(+), 12 deletions(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 51f012aaf1..a2a9dcbd6c 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -35,7 +35,7 @@ BackendRenderer::BackendRenderer(Params && params) , m_model(params.m_model) , m_readManager(make_unique_dp(params.m_commutator, m_model, params.m_allow3dBuildings, params.m_trafficEnabled, - params.m_isolinesEnabled, + params.m_isolinesEnabled, params.m_guidesEnabled, std::move(params.m_isUGCFn))) , m_transitBuilder(make_unique_dp( std::bind(&BackendRenderer::FlushTransitRenderData, this, _1))) @@ -521,6 +521,7 @@ void BackendRenderer::AcceptMessage(ref_ptr message) MessagePriority::Normal); break; } + case Message::Type::EnableIsolines: { ref_ptr msg = message; @@ -531,6 +532,16 @@ void BackendRenderer::AcceptMessage(ref_ptr message) break; } + case Message::Type::EnableGuides: + { + ref_ptr msg = message; + m_readManager->SetGuidesEnabled(msg->IsEnabled()); + m_commutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(msg->IsEnabled()), + MessagePriority::Normal); + break; + } + case Message::Type::DrapeApiAddLines: { ref_ptr msg = message; diff --git a/drape_frontend/backend_renderer.hpp b/drape_frontend/backend_renderer.hpp index 10f4d142e6..b8692b9f46 100644 --- a/drape_frontend/backend_renderer.hpp +++ b/drape_frontend/backend_renderer.hpp @@ -44,8 +44,8 @@ public: ref_ptr factory, ref_ptr texMng, MapDataProvider const & model, TUpdateCurrentCountryFn const & updateCurrentCountryFn, ref_ptr requestedTiles, bool allow3dBuildings, bool trafficEnabled, - bool isolinesEnabled, bool simplifiedTrafficColors, TIsUGCFn && isUGCFn, - OnGraphicsContextInitialized const & onGraphicsContextInitialized) + bool isolinesEnabled, bool guidesEnabled, bool simplifiedTrafficColors, + TIsUGCFn && isUGCFn, OnGraphicsContextInitialized const & onGraphicsContextInitialized) : BaseRenderer::Params(apiVersion, commutator, factory, texMng, onGraphicsContextInitialized) , m_model(model) , m_updateCurrentCountryFn(updateCurrentCountryFn) @@ -53,6 +53,7 @@ public: , m_allow3dBuildings(allow3dBuildings) , m_trafficEnabled(trafficEnabled) , m_isolinesEnabled(isolinesEnabled) + , m_guidesEnabled(guidesEnabled) , m_simplifiedTrafficColors(simplifiedTrafficColors) , m_isUGCFn(std::move(isUGCFn)) {} @@ -63,6 +64,7 @@ public: bool m_allow3dBuildings; bool m_trafficEnabled; bool m_isolinesEnabled; + bool m_guidesEnabled; bool m_simplifiedTrafficColors; TIsUGCFn m_isUGCFn; }; diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index e8c7ce0213..fb0780e3fa 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -103,6 +103,7 @@ DrapeEngine::DrapeEngine(Params && params) params.m_allow3dBuildings, params.m_trafficEnabled, params.m_isolinesEnabled, + params.m_guidesEnabled, params.m_simplifiedTrafficColors, std::move(params.m_isUGCFn), params.m_onGraphicsContextInitialized); @@ -813,6 +814,13 @@ void DrapeEngine::EnableIsolines(bool enable) MessagePriority::Normal); } +void DrapeEngine::EnableGuides(bool enable) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(enable), + MessagePriority::Normal); +} + void DrapeEngine::SetFontScaleFactor(double scaleFactor) { double const kMinScaleFactor = 0.5; diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index 1aa29b91cd..6a69145eb2 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -64,6 +64,7 @@ public: bool allow3dBuildings, bool trafficEnabled, bool isolinesEnabled, + bool guidesEnabled, bool blockTapEvents, bool showChoosePositionMark, std::vector && boundAreaTriangles, @@ -86,6 +87,7 @@ public: , m_allow3dBuildings(allow3dBuildings) , m_trafficEnabled(trafficEnabled) , m_isolinesEnabled(isolinesEnabled) + , m_guidesEnabled(guidesEnabled) , m_blockTapEvents(blockTapEvents) , m_showChoosePositionMark(showChoosePositionMark) , m_boundAreaTriangles(std::move(boundAreaTriangles)) @@ -110,6 +112,7 @@ public: bool m_allow3dBuildings; bool m_trafficEnabled; bool m_isolinesEnabled; + bool m_guidesEnabled; bool m_blockTapEvents; bool m_showChoosePositionMark; std::vector m_boundAreaTriangles; @@ -227,6 +230,8 @@ public: void EnableIsolines(bool enable); + void EnableGuides(bool enable); + void SetFontScaleFactor(double scaleFactor); void RunScenario(ScenarioManager::ScenarioData && scenarioData, diff --git a/drape_frontend/engine_context.cpp b/drape_frontend/engine_context.cpp index 2fcdabf5da..1a43f4b2b3 100644 --- a/drape_frontend/engine_context.cpp +++ b/drape_frontend/engine_context.cpp @@ -15,6 +15,7 @@ EngineContext::EngineContext(TileKey tileKey, bool is3dBuildingsEnabled, bool isTrafficEnabled, bool isolinesEnabled, + bool guidesEnabled, int displacementMode, TIsUGCFn const & isUGCFn) : m_tileKey(tileKey) @@ -25,6 +26,7 @@ EngineContext::EngineContext(TileKey tileKey, , m_3dBuildingsEnabled(is3dBuildingsEnabled) , m_trafficEnabled(isTrafficEnabled) , m_isolinesEnabled(isolinesEnabled) + , m_guidesEnabled(guidesEnabled) , m_displacementMode(displacementMode) , m_isUGCFn(isUGCFn) {} diff --git a/drape_frontend/engine_context.hpp b/drape_frontend/engine_context.hpp index 363bd7c7f1..f19076da21 100644 --- a/drape_frontend/engine_context.hpp +++ b/drape_frontend/engine_context.hpp @@ -33,6 +33,7 @@ public: bool is3dBuildingsEnabled, bool isTrafficEnabled, bool isolinesEnabled, + bool guidesEnabled, int displacementMode, TIsUGCFn const & isUGCFn); @@ -40,6 +41,7 @@ public: bool Is3dBuildingsEnabled() const { return m_3dBuildingsEnabled; } bool IsTrafficEnabled() const { return m_trafficEnabled; } bool IsolinesEnabled() const { return m_isolinesEnabled; } + bool GuidesEnabled() const { return m_guidesEnabled; } bool IsUGC(FeatureID const & fid) { return m_isUGCFn ? m_isUGCFn(fid) : false; } int GetDisplacementMode() const { return m_displacementMode; } CustomFeaturesContextWeakPtr GetCustomFeaturesContext() const { return m_customFeaturesContext; } @@ -63,6 +65,7 @@ private: bool m_3dBuildingsEnabled; bool m_trafficEnabled; bool m_isolinesEnabled; + bool m_guidesEnabled; int m_displacementMode; TIsUGCFn m_isUGCFn; }; diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index a9a6c6a06d..e314f0ebe3 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -922,6 +922,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) case Message::Type::UpdateMetalines: case Message::Type::EnableUGCRendering: case Message::Type::EnableIsolines: + case Message::Type::EnableGuides: { m_forceUpdateScene = true; break; diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp index 96b632c518..15bddf2c55 100644 --- a/drape_frontend/message.hpp +++ b/drape_frontend/message.hpp @@ -103,6 +103,7 @@ public: NotifyRenderThread, NotifyGraphicsReady, EnableIsolines, + EnableGuides, }; virtual ~Message() = default; diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index 25db51fc10..12b15f2ccb 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -1133,6 +1133,21 @@ private: bool m_isEnabled = false; }; +class EnableGuidesMessage : public Message +{ +public: + explicit EnableGuidesMessage(bool isEnabled) + : m_isEnabled(isEnabled) + {} + + Type GetType() const override { return Type::EnableGuides; } + + bool IsEnabled() { return m_isEnabled; } + +private: + bool m_isEnabled = false; +}; + class EnableTransitSchemeMessage : public Message { public: diff --git a/drape_frontend/read_manager.cpp b/drape_frontend/read_manager.cpp index 74f3fae3fd..aba5fb34d9 100755 --- a/drape_frontend/read_manager.cpp +++ b/drape_frontend/read_manager.cpp @@ -45,13 +45,14 @@ bool ReadManager::LessByTileInfo::operator()(std::shared_ptr const & l ReadManager::ReadManager(ref_ptr commutator, MapDataProvider & model, bool allow3dBuildings, bool trafficEnabled, bool isolinesEnabled, - EngineContext::TIsUGCFn && isUGCFn) + bool guidesEnabled, EngineContext::TIsUGCFn && isUGCFn) : m_commutator(commutator) , m_model(model) , m_have3dBuildings(false) , m_allow3dBuildings(allow3dBuildings) , m_trafficEnabled(trafficEnabled) , m_isolinesEnabled(isolinesEnabled) + , m_guidesEnabled(guidesEnabled) , m_displacementMode(dp::displacement::kDefaultMode) , m_modeChanged(false) , m_ugcRenderingEnabled(false) @@ -240,7 +241,7 @@ void ReadManager::PushTaskBackForTileKey(TileKey const & tileKey, m_commutator, texMng, metalineMng, m_customFeaturesContext, m_have3dBuildings && m_allow3dBuildings, - m_trafficEnabled, m_isolinesEnabled, + m_trafficEnabled, m_isolinesEnabled, m_guidesEnabled, m_displacementMode, m_ugcRenderingEnabled ? m_isUGCFn : nullptr); std::shared_ptr tileInfo = std::make_shared(std::move(context)); @@ -344,6 +345,15 @@ void ReadManager::SetIsolinesEnabled(bool isolinesEnabled) } } +void ReadManager::SetGuidesEnabled(bool guidesEnabled) +{ + if (m_guidesEnabled != guidesEnabled) + { + m_modeChanged = true; + m_guidesEnabled = guidesEnabled; + } +} + void ReadManager::SetDisplacementMode(int displacementMode) { if (m_displacementMode != displacementMode) diff --git a/drape_frontend/read_manager.hpp b/drape_frontend/read_manager.hpp index ef98ca432b..0afeb6c604 100755 --- a/drape_frontend/read_manager.hpp +++ b/drape_frontend/read_manager.hpp @@ -33,7 +33,7 @@ class ReadManager { public: ReadManager(ref_ptr commutator, MapDataProvider & model, - bool allow3dBuildings, bool trafficEnabled, bool isolinesEnabled, + bool allow3dBuildings, bool trafficEnabled, bool isolinesEnabled, bool guidesEnabled, EngineContext::TIsUGCFn && isUGCFn); void Start(); @@ -52,6 +52,7 @@ public: void SetTrafficEnabled(bool trafficEnabled); void SetIsolinesEnabled(bool isolinesEnabled); + void SetGuidesEnabled(bool guidesEnabled); void SetDisplacementMode(int displacementMode); @@ -84,6 +85,7 @@ private: bool m_allow3dBuildings; bool m_trafficEnabled; bool m_isolinesEnabled; + bool m_guidesEnabled; int m_displacementMode; bool m_modeChanged; bool m_ugcRenderingEnabled; diff --git a/drape_frontend/rule_drawer.cpp b/drape_frontend/rule_drawer.cpp index 3479c177e9..3b0cf8f6bc 100644 --- a/drape_frontend/rule_drawer.cpp +++ b/drape_frontend/rule_drawer.cpp @@ -8,6 +8,10 @@ #include "drape/drape_diagnostics.hpp" +#include "indexer/categories_holder.hpp" +#include "indexer/classificator.hpp" +#include "search/utils.hpp" + #include "indexer/feature.hpp" #include "indexer/feature_algo.hpp" #include "indexer/feature_visibility.hpp" @@ -39,6 +43,7 @@ using namespace std::placeholders; namespace { +int constexpr kMinCountryZoom = 10; // The first zoom level in kAverageSegmentsCount. int constexpr kFirstZoomInAverageSegments = 10; std::vector const kAverageSegmentsCount = @@ -170,6 +175,23 @@ bool UsePreciseFeatureCenter(FeatureType & f) UNUSED_VALUE(f); return false; } + +bool IsGuidesLayerFeature(FeatureType & f) +{ + static auto const sightsTypes = search::GetCategoryTypes("Sights", "en", GetDefaultCategories()); + auto const fTypes = feature::TypesHolder(f); + for (auto type : fTypes) + { + ftype::TruncValue(type, 2); + if (find(sightsTypes.begin(), sightsTypes.end(), type) != sightsTypes.end()) + return true; + } + + return ftypes::IsHotelChecker::Instance()(fTypes) || + ftypes::IsTransportChecker::Instance()(fTypes) || + ftypes::IsOutdoorChecker::Instance()(fTypes) || + ftypes::IsParkingChecker::Instance()(fTypes); +} } // namespace namespace df @@ -316,6 +338,12 @@ void RuleDrawer::ProcessAreaStyle(FeatureType & f, Stylist const & s, applyPointStyle = m_globalRect.IsPointInside(featureCenter); } + if (m_context->GuidesEnabled() && m_context->GetTileKey().m_zoomLevel >= kMinCountryZoom && + !IsGuidesLayerFeature(f)) + { + applyPointStyle = false; + } + if (applyPointStyle || is3dBuilding) minVisibleScale = feature::GetMinDrawableScale(f); @@ -326,6 +354,7 @@ void RuleDrawer::ProcessAreaStyle(FeatureType & f, Stylist const & s, s.GetCaptionDescription(), hatchingArea); f.ForEachTriangle(apply, zoomLevel); apply.SetHotelData(ExtractHotelData(f)); + if (applyPointStyle) { if (UsePreciseFeatureCenter(f)) @@ -441,6 +470,12 @@ void RuleDrawer::ProcessPointStyle(FeatureType & f, Stylist const & s, if (m_customFeaturesContext && m_customFeaturesContext->NeedDiscardGeometry(f.GetID())) return; + if (m_context->GuidesEnabled() && m_context->GetTileKey().m_zoomLevel >= kMinCountryZoom && + !IsGuidesLayerFeature(f)) + { + return; + } + int const zoomLevel = m_context->GetTileKey().m_zoomLevel; bool const isSpeedCamera = ftypes::IsSpeedCamChecker::Instance()(f); if (isSpeedCamera && !GetStyleReader().IsCarNavigationStyle()) diff --git a/indexer/ftypes_matcher.cpp b/indexer/ftypes_matcher.cpp index 78e9a6f773..ca5ac65467 100644 --- a/indexer/ftypes_matcher.cpp +++ b/indexer/ftypes_matcher.cpp @@ -215,6 +215,63 @@ IsRailwayStationChecker::IsRailwayStationChecker() m_types.push_back(c.GetTypeByPath({"building", "train_station"})); } +IsOutdoorChecker::IsOutdoorChecker() +{ + Classificator const & c = classif(); + char const * arr[][2] = {{"natural", "bare_rock"}, + {"natural", "cave_entrance"}, + {"natural", "cliff"}, + {"natural", "peak"}, + {"natural", "rock"}, + {"natural", "volcano"}, + + {"natural", "geyser"}, + {"natural", "hot_spring"}, + {"natural", "lake"}, + {"natural", "pond"}, + {"natural", "salt_pond"}, + {"natural", "spring"}, + {"natural", "water"}, + {"natural", "wetland"}, + {"waterway", "waterfall"}, + + {"natural", "beach"}, + {"natural", "cape"}, + {"natural", "glacier"}}; + for (auto const & p : arr) + m_types.push_back(c.GetTypeByPath({p[0], p[1]})); +} + +IsTransportChecker::IsTransportChecker() +{ + Classificator const & c = classif(); + char const * arr[][2] = {{"aeroway", "aerodrome"}, + {"amenity", "bus_station"}, + {"amenity", "car_sharing"}, + {"amenity", "ferry_terminal"}, + {"amenity", "taxi"}, + {"building", "train_station"}, + {"highway", "bus_stop"}, + {"public_transport", "platform"}, + {"railway", "halt"}, + {"railway", "station"}, + {"railway", "tram_stop"}}; + for (auto const & p : arr) + m_types.push_back(c.GetTypeByPath({p[0], p[1]})); +} + +IsParkingChecker::IsParkingChecker() +{ + Classificator const & c = classif(); + char const * arr[][2] = {{"amenity", "bicycle_parking"}, + {"amenity", "motorcycle_parking"}, + {"amenity", "parking"}, + {"highway", "services"}, + {"tourism", "caravan_site"}}; + for (auto const & p : arr) + m_types.push_back(c.GetTypeByPath({p[0], p[1]})); +} + IsSubwayStationChecker::IsSubwayStationChecker() : BaseChecker(3 /* level */) { Classificator const & c = classif(); diff --git a/indexer/ftypes_matcher.hpp b/indexer/ftypes_matcher.hpp index e4c858fff1..c0bcfe671b 100644 --- a/indexer/ftypes_matcher.hpp +++ b/indexer/ftypes_matcher.hpp @@ -91,6 +91,27 @@ public: DECLARE_CHECKER_INSTANCE(IsRailwayStationChecker); }; +class IsOutdoorChecker : public BaseChecker +{ + IsOutdoorChecker(); +public: + DECLARE_CHECKER_INSTANCE(IsOutdoorChecker); +}; + +class IsTransportChecker : public BaseChecker +{ + IsTransportChecker(); +public: + DECLARE_CHECKER_INSTANCE(IsTransportChecker); +}; + +class IsParkingChecker : public BaseChecker +{ + IsParkingChecker(); +public: + DECLARE_CHECKER_INSTANCE(IsParkingChecker); +}; + class IsSubwayStationChecker : public BaseChecker { IsSubwayStationChecker(); diff --git a/map/bookmark_helpers.cpp b/map/bookmark_helpers.cpp index 118f496e80..5e68e610e7 100644 --- a/map/bookmark_helpers.cpp +++ b/map/bookmark_helpers.cpp @@ -135,7 +135,7 @@ std::map const kFeatureTypeToBookmarkMatchInfo = {"amenity-parking", {kml::BookmarkIcon::Parking, BookmarkBaseType::Parking}}, {"highway-services", {kml::BookmarkIcon::Parking, BookmarkBaseType::Parking}}, {"tourism-caravan_site", {kml::BookmarkIcon::Parking, BookmarkBaseType::Parking}}, - {"vending-parking_tickets", {kml::BookmarkIcon::Parking, BookmarkBaseType::Parking}}, + {"amenity-vending_machine-parking_tickets", {kml::BookmarkIcon::Parking, BookmarkBaseType::Parking}}, {"amenity-ice_cream", {kml::BookmarkIcon::Shop, BookmarkBaseType::Shop}}, {"amenity-marketplace", {kml::BookmarkIcon::Shop, BookmarkBaseType::Shop}}, diff --git a/map/framework.cpp b/map/framework.cpp index f5913a3ddd..b517d4e6fa 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1954,11 +1954,12 @@ void Framework::CreateDrapeEngine(ref_ptr contextFac bool allow3dBuildings; Load3dMode(allow3d, allow3dBuildings); - bool const isAutozoomEnabled = LoadAutoZoom(); - bool const trafficEnabled = m_trafficManager.IsEnabled(); + auto const isAutozoomEnabled = LoadAutoZoom(); + auto const trafficEnabled = m_trafficManager.IsEnabled(); auto const isolinesEnabled = m_isolinesManager.IsEnabled(); - bool const simplifiedTrafficColors = m_trafficManager.HasSimplifiedColorScheme(); - double const fontsScaleFactor = LoadLargeFontsSize() ? kLargeFontsScaleFactor : 1.0; + auto const guidesEnabled = m_guidesManager.IsEnabled(); + auto const simplifiedTrafficColors = m_trafficManager.HasSimplifiedColorScheme(); + auto const fontsScaleFactor = LoadLargeFontsSize() ? kLargeFontsScaleFactor : 1.0; df::DrapeEngine::Params p( params.m_apiVersion, contextFactory, @@ -1967,7 +1968,8 @@ void Framework::CreateDrapeEngine(ref_ptr contextFac move(isCountryLoadedByNameFn), move(updateCurrentCountryFn)), params.m_hints, params.m_visualScale, fontsScaleFactor, move(params.m_widgetsInitInfo), make_pair(params.m_initialMyPositionState, params.m_hasMyPositionState), - move(myPositionModeChangedFn), allow3dBuildings, trafficEnabled, isolinesEnabled, + move(myPositionModeChangedFn), allow3dBuildings, + trafficEnabled, isolinesEnabled, guidesEnabled, params.m_isChoosePositionMode, params.m_isChoosePositionMode, GetSelectedFeatureTriangles(), m_routingManager.IsRoutingActive() && m_routingManager.IsRoutingFollowing(), isAutozoomEnabled, simplifiedTrafficColors, move(overlaysShowStatsFn), move(isUGCFn), diff --git a/map/guides_manager.cpp b/map/guides_manager.cpp index aa5a6045c5..84d72b8b2e 100644 --- a/map/guides_manager.cpp +++ b/map/guides_manager.cpp @@ -107,6 +107,7 @@ void GuidesManager::SetEnabled(bool enabled) auto const newState = enabled ? GuidesState::Enabled : GuidesState::Disabled; if (newState == m_state) return; + m_drapeEngine.SafeCall(&df::DrapeEngine::EnableGuides, enabled); Clear(); m_shownGuides.clear();