diff --git a/map/framework.cpp b/map/framework.cpp index 370ae5fda4..9707736c34 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -26,6 +26,8 @@ #include "drape_frontend/watch/cpu_drawer.hpp" #include "drape_frontend/watch/feature_processor.hpp" +#include "drape/constants.hpp" + #include "indexer/categories_holder.hpp" #include "indexer/classificator.hpp" #include "indexer/classificator_loader.hpp" @@ -287,7 +289,6 @@ Framework::Framework() , m_storage(platform::migrate::NeedMigrate() ? COUNTRIES_OBSOLETE_FILE : COUNTRIES_FILE) , m_bmManager(*this) , m_isRenderingEnabled(true) - , m_fixedSearchResults(0) , m_lastReportedCountry(kInvalidCountryId) { m_startBackgroundTime = my::Timer::LocalTime(); @@ -723,6 +724,9 @@ void Framework::FillInfoFromFeatureType(FeatureType const & ft, place_page::Info if (ftypes::IsAddressObjectChecker::Instance()(ft)) info.m_address = GetAddressInfoAtPoint(feature::GetCenter(ft)).FormatHouseAndStreet(); + + if (ftypes::IsBookingChecker::Instance()(ft)) + info.m_isSponsoredHotel = true; } void Framework::FillApiMarkInfo(ApiMarkPoint const & api, place_page::Info & info) const @@ -1358,9 +1362,7 @@ size_t Framework::ShowSearchResults(search::Results const & results) return count; } - m_fixedSearchResults = 0; FillSearchResultsMarks(results); - m_fixedSearchResults = count; // Setup viewport according to results. m2::AnyRectD viewport = m_currentModelView.GlobalRect(); @@ -1411,7 +1413,7 @@ void Framework::FillSearchResultsMarks(search::Results const & results) UserMarkControllerGuard guard(m_bmManager, UserMarkType::SEARCH_MARK); guard.m_controller.SetIsVisible(true); guard.m_controller.SetIsDrawable(true); - guard.m_controller.Clear(m_fixedSearchResults); + guard.m_controller.Clear(); size_t const count = results.GetCount(); for (size_t i = 0; i < count; ++i) @@ -1424,9 +1426,9 @@ void Framework::FillSearchResultsMarks(search::Results const & results) if (r.GetResultType() == search::Result::RESULT_FEATURE) mark->SetFoundFeature(r.GetFeatureID()); mark->SetMatchedName(r.GetString()); - - //TODO: extract from search::Result data for choosing custom symbol. - //mark->SetCustomSymbol("booking-search-result"); + + if (r.m_metadata.m_isSponsoredHotel) + mark->SetCustomSymbol("current-position"); //TODO: change icon } } } @@ -1439,8 +1441,6 @@ void Framework::CancelInteractiveSearch() m_lastInteractiveSearchParams.Clear(); CancelQuery(m_lastQueryHandle); } - - m_fixedSearchResults = 0; } bool Framework::GetDistanceAndAzimut(m2::PointD const & point, @@ -1881,12 +1881,15 @@ void Framework::SetMapSelectionListeners(TActivateMapSelectionFn const & activat } void Framework::ActivateMapSelection(bool needAnimation, df::SelectionShape::ESelectedObject selectionType, - place_page::Info const & info) const + place_page::Info const & info) { 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(), needAnimation)); + + SetDisplacementMode(info.m_isSponsoredHotel ? dp::displacement::kHotelMode : dp::displacement::kDefaultMode); + if (m_activateMapSelectionFn) m_activateMapSelectionFn(info); else @@ -1903,6 +1906,8 @@ void Framework::DeactivateMapSelection(bool notifyUI) if (somethingWasAlreadySelected) CallDrapeFunction(bind(&df::DrapeEngine::DeselectObject, _1)); + + SetDisplacementMode(dp::displacement::kDefaultMode); } void Framework::UpdatePlacePageInfoForCurrentSelection() diff --git a/map/framework.hpp b/map/framework.hpp index 783bbad242..5e44ad9786 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -259,7 +259,7 @@ public: private: void ActivateMapSelection(bool needAnimation, df::SelectionShape::ESelectedObject selectionType, - place_page::Info const & info) const; + place_page::Info const & info); void InvalidateUserMarks(); public: void DeactivateMapSelection(bool notifyUI); @@ -375,7 +375,6 @@ private: // Last search query params for the interactive search. search::SearchParams m_lastInteractiveSearchParams; - uint8_t m_fixedSearchResults; bool m_connectToGpsTrack; // need to connect to tracker when Drape is being constructed diff --git a/map/place_page_info.hpp b/map/place_page_info.hpp index 2c50821c3d..887d92b656 100644 --- a/map/place_page_info.hpp +++ b/map/place_page_info.hpp @@ -67,6 +67,8 @@ public: string m_apiUrl; /// Formatted feature address. string m_address; + /// Feature is a sponsored hotel. + bool m_isSponsoredHotel = false; /// Which country this MapObject is in. /// For a country point it will be set to topmost node for country. diff --git a/search/intermediate_result.cpp b/search/intermediate_result.cpp index 09a407b1c0..9c7bb82a26 100644 --- a/search/intermediate_result.cpp +++ b/search/intermediate_result.cpp @@ -52,6 +52,9 @@ void ProcessMetadata(FeatureType const & ft, Result::Metadata & meta) meta.m_stars = my::clamp(meta.m_stars, 0, 5); else meta.m_stars = 0; + + meta.m_isSponsoredHotel = ftypes::IsBookingChecker::Instance()(ft); + meta.m_isInitialized = true; } diff --git a/search/result.hpp b/search/result.hpp index d0cec78b53..896aa2c181 100644 --- a/search/result.hpp +++ b/search/result.hpp @@ -33,6 +33,7 @@ public: { string m_cuisine; // Valid only if not empty. Used for restaurants. int m_stars = 0; // Valid only if not 0. Used for hotels. + bool m_isSponsoredHotel = false; // Used for hotels. osm::YesNoUnknown m_isOpenNow = osm::Unknown; // Valid for any result. /// True if the struct is already assigned or need to be calculated otherwise.