diff --git a/map/search_mark.cpp b/map/search_mark.cpp index 1bb0808ee7..d3deb4f609 100644 --- a/map/search_mark.cpp +++ b/map/search_mark.cpp @@ -14,10 +14,10 @@ namespace std::vector const kSymbols = { "search-result", // Default. - "coloredmark-default-l", // Booking. + "coloredmark-default-l", // Booking. "search-adv", // Local Ads. "searchbookingadv-default-l", // Local Ads + Booking. - "coloredmark-default-l", // UGC. + "coloredmark-default-l", // UGC. "search-football", // FC 2018. "non-found-search-result", // NotFound. @@ -26,15 +26,17 @@ std::vector const kSymbols = std::vector const kPreparingSymbols = { "search-result", // Default. - "coloredmark-inactive", // Booking. + "coloredmark-inactive", // Booking. "search-adv", // Local Ads. "searchbookingadv-default-l", // Local Ads + Booking. - "coloredmark-inactive", // UGC. + "coloredmark-inactive", // UGC. "search-football", // FC 2018. "non-found-search-result", // NotFound. }; +std::string const kSaleBadgeName = "searchbooking-sale-1"; + float const kRatingThreshold = 6.0f; float const kMetricThreshold = 0.38f; @@ -124,7 +126,7 @@ drape_ptr SearchMarkPoint::GetBadgeNames( if (!IsBookingSpecialMark()) return nullptr; - auto const badgeName = GetBookingBadgeName(m_pricing); + auto const badgeName = m_hasSale ? kSaleBadgeName : GetBookingBadgeName(m_pricing); if (badgeName.empty() || !SearchMarks::GetSize(badgeName)) return nullptr; @@ -141,7 +143,7 @@ drape_ptr SearchMarkPoint::GetSymbolOffsets() if (!IsBookingSpecialMark()) return nullptr; - auto const badgeName = GetBookingBadgeName(m_pricing); + auto const badgeName = m_hasSale ? kSaleBadgeName : GetBookingBadgeName(m_pricing); if (badgeName.empty() || !SearchMarks::GetSize(badgeName)) return nullptr; @@ -232,6 +234,11 @@ void SearchMarkPoint::SetPricing(int pricing) SetAttributeValue(m_pricing, pricing); } +void SearchMarkPoint::SetSale(bool hasSale) +{ + SetAttributeValue(m_hasSale, hasSale); +} + bool SearchMarkPoint::IsBookingSpecialMark() const { return (m_type == SearchMarkType::Booking || m_type == SearchMarkType::LocalAdsBooking) && @@ -265,6 +272,7 @@ void SearchMarks::SetDrapeEngine(ref_ptr engine) symbols.insert(symbols.end(), kSymbols.begin(), kSymbols.end()); for (int pricing = 1; pricing <= 3; pricing++) symbols.push_back(GetBookingBadgeName(pricing)); + symbols.push_back(kSaleBadgeName); m_drapeEngine.SafeCall(&df::DrapeEngine::RequestSymbolsSize, symbols, [](std::map && sizes) @@ -316,7 +324,24 @@ boost::optional SearchMarks::GetSize(std::string const & symbolName) void SearchMarks::SetPreparingState(std::vector const & features, bool isPreparing) { - if (m_bmManager == nullptr) + FilterAndProcessMarks(features, [isPreparing](SearchMarkPoint * mark) + { + mark->SetPreparing(isPreparing); + }); +} + +void SearchMarks::SetSales(std::vector const & features, bool hasSale) +{ + FilterAndProcessMarks(features, [hasSale](SearchMarkPoint * mark) + { + mark->SetSale(hasSale); + }); +} + +void SearchMarks::FilterAndProcessMarks(std::vector const & features, + std::function && processor) +{ + if (m_bmManager == nullptr || processor == nullptr) return; ASSERT(std::is_sorted(features.begin(), features.end()), ()); @@ -326,6 +351,6 @@ void SearchMarks::SetPreparingState(std::vector const & features, boo { auto * mark = editSession.GetMarkForEdit(markId); if (std::binary_search(features.begin(), features.end(), mark->GetFeatureID())) - mark->SetPreparing(isPreparing); + processor(mark); } } diff --git a/map/search_mark.hpp b/map/search_mark.hpp index ec1ef27843..74f4212de4 100644 --- a/map/search_mark.hpp +++ b/map/search_mark.hpp @@ -11,6 +11,7 @@ #include +#include #include #include #include @@ -52,6 +53,7 @@ public: void SetPreparing(bool isPreparing); void SetRating(float rating); void SetPricing(int pricing); + void SetSale(bool hasSale); protected: template void SetAttributeValue(T & dst, T const & src) @@ -74,6 +76,7 @@ protected: bool m_isPreparing = false; float m_rating = 0.0f; int m_pricing = 0; + bool m_hasSale = false; dp::TitleDecl m_titleDecl; }; @@ -90,10 +93,16 @@ public: // NOTE: Vector of features must be sorted. void SetPreparingState(std::vector const & features, bool isPreparing); + // NOTE: Vector of features must be sorted. + void SetSales(std::vector const & features, bool hasSale); + static m2::PointD GetSize(SearchMarkType searchMarkType, ScreenBase const & modelView); static boost::optional GetSize(std::string const & symbolName); private: + void FilterAndProcessMarks(std::vector const & features, + std::function && processor); + BookmarkManager * m_bmManager; df::DrapeEngineSafePtr m_drapeEngine;