From 5d4060db1e672073d8d7d0c727cfcf28f33ada32 Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Thu, 18 Aug 2016 10:49:17 +0300 Subject: [PATCH] Added retrieving size of search marks in mercator --- drape_frontend/backend_renderer.cpp | 16 ++++++++++++++++ drape_frontend/drape_engine.cpp | 8 ++++++++ drape_frontend/drape_engine.hpp | 5 +++++ drape_frontend/message.hpp | 3 ++- drape_frontend/message_subclasses.hpp | 26 ++++++++++++++++++++++++++ map/framework.cpp | 24 ++++++++++++++++++++++++ map/framework.hpp | 4 ++++ map/user_mark.hpp | 8 ++++++++ 8 files changed, 93 insertions(+), 1 deletion(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index e022e72bab..6b10cd95b1 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -272,6 +272,22 @@ void BackendRenderer::AcceptMessage(ref_ptr message) { ref_ptr msg = message; m_readManager->Allow3dBuildings(msg->Allow3dBuildings()); + break; + } + case Message::RequestSymbolsSize: + { + ref_ptr msg = message; + auto const & symbols = msg->GetSymbols(); + + vector sizes(symbols.size()); + for (size_t i = 0; i < symbols.size(); i++) + { + dp::TextureManager::SymbolRegion region; + m_texMng->GetSymbolRegion(symbols[i], region); + sizes[i] = region.GetPixelSize(); + } + msg->InvokeCallback(sizes); + break; } default: diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 6301fef199..f5896c1a84 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -473,4 +473,12 @@ void DrapeEngine::SetDisplacementMode(int mode) MessagePriority::Normal); } +void DrapeEngine::RequestSymbolsSize(vector const & symbols, + TRequestSymbolsSizeCallback const & callback) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(symbols, callback), + MessagePriority::Normal); +} + } // namespace df diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index f80ace1eb4..9e9271a21e 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -148,6 +148,11 @@ public: void SetDisplacementMode(int mode); + using TRequestSymbolsSizeCallback = function const &)>; + + void RequestSymbolsSize(vector const & symbols, + TRequestSymbolsSizeCallback const & callback); + private: void AddUserEvent(UserEvent const & e); void ModelViewChanged(ScreenBase const & screen); diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp index 1be9aaef19..204c7bb494 100644 --- a/drape_frontend/message.hpp +++ b/drape_frontend/message.hpp @@ -57,7 +57,8 @@ public: SetTimeInBackground, SetAddNewPlaceMode, SetDisplacementMode, - AllowAutoZoom + AllowAutoZoom, + RequestSymbolsSize }; virtual ~Message() {} diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index 170da7671d..b947fd29bc 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -818,4 +818,30 @@ private: int m_mode; }; +class RequestSymbolsSizeMessage : public Message +{ +public: + using TRequestSymbolsSizeCallback = function const &)>; + + RequestSymbolsSizeMessage(vector const & symbols, + TRequestSymbolsSizeCallback const & callback) + : m_symbols(symbols) + , m_callback(callback) + {} + + Type GetType() const override { return Message::RequestSymbolsSize; } + + vector const & GetSymbols() const { return m_symbols; } + + void InvokeCallback(vector const & sizes) + { + if (m_callback != nullptr) + m_callback(sizes); + } + +private: + vector m_symbols; + TRequestSymbolsSizeCallback m_callback; +}; + } // namespace df diff --git a/map/framework.cpp b/map/framework.cpp index 779716a67c..f56eb3ef39 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -114,6 +114,13 @@ char const kAllowAutoZoom[] = "AutoZoom"; double const kDistEqualQuery = 100.0; +// Must correspond SearchMarkType. +vector kSearchMarks = +{ + "search-result", + "search-booking" +}; + // TODO! // To adjust GpsTrackFilter was added secret command "?gpstrackaccuracy:xxx;" // where xxx is a new value for horizontal accuracy. @@ -1633,6 +1640,11 @@ void Framework::CreateDrapeEngine(ref_ptr contextFactory, place_page::Info info; ActivateMapSelection(false, OnTapEventImpl(*m_lastTapEvent, info), info); } + + m_drapeEngine->RequestSymbolsSize(kSearchMarks, [this](vector const & sizes) + { + GetPlatform().RunOnGuiThread([this, sizes](){ m_searchMarksSizes = sizes; }); + }); } ref_ptr Framework::GetDrapeEngine() @@ -2588,6 +2600,18 @@ void Framework::BlockTapEvents(bool block) CallDrapeFunction(bind(&df::DrapeEngine::BlockTapEvents, _1, block)); } +m2::PointD Framework::GetSearchMarkSize(SearchMarkType searchMarkType) +{ + if (m_searchMarksSizes.empty()) + return m2::PointD(); + + ASSERT_LESS(static_cast(searchMarkType), m_searchMarksSizes.size(), ()); + m2::PointU const pixelSize = m_searchMarksSizes[searchMarkType]; + + double const pixelToMercator = m_currentModelView.GetScale(); + return m2::PointD(pixelToMercator * pixelSize.x, pixelToMercator * pixelSize.y); +} + namespace feature { string GetPrintableTypes(FeatureType const & ft) diff --git a/map/framework.hpp b/map/framework.hpp index a0f823778a..ff78f9b079 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -276,6 +276,8 @@ public: BookmarkAndCategory FindBookmark(UserMark const * mark) const; BookmarkManager & GetBookmarkManager() { return m_bmManager; } + m2::PointD GetSearchMarkSize(SearchMarkType searchMarkType); + protected: // search::ViewportSearchCallback::Delegate overrides: void RunUITask(function fn) override { GetPlatform().RunOnGuiThread(move(fn)); } @@ -349,6 +351,8 @@ private: /// Here we store last selected feature to get its polygons in case of adding organization. mutable FeatureID m_selectedFeature; + vector m_searchMarksSizes; + private: vector GetSelectedFeatureTriangles() const; diff --git a/map/user_mark.hpp b/map/user_mark.hpp index cfd9d2dad8..2af93c802c 100644 --- a/map/user_mark.hpp +++ b/map/user_mark.hpp @@ -50,6 +50,14 @@ protected: mutable UserMarkContainer * m_container; }; +enum SearchMarkType +{ + DefaultSearchMark = 0, + BookingSearchMark, + + SearchMarkTypesCount +}; + class SearchMarkPoint : public UserMark { public: