From 5d7c0d9b27a30b2c7c93f65bbcc5f13efd3be630 Mon Sep 17 00:00:00 2001 From: Yuri Gorshenin Date: Mon, 10 Apr 2017 14:09:00 +0300 Subject: [PATCH] [assessment-tool] Added buttons that display user position and viewport. --- map/framework.cpp | 4 +- map/framework.hpp | 2 +- .../assessment_tool/context.cpp | 2 + .../assessment_tool/main_model.cpp | 23 ++++++++++ .../assessment_tool/main_model.hpp | 2 + .../assessment_tool/main_view.cpp | 20 ++++++--- .../assessment_tool/main_view.hpp | 3 +- .../search_quality/assessment_tool/model.hpp | 2 + .../assessment_tool/sample_view.cpp | 44 ++++++++++++++----- .../assessment_tool/sample_view.hpp | 7 +++ .../search_quality/assessment_tool/view.hpp | 3 ++ 11 files changed, 91 insertions(+), 21 deletions(-) diff --git a/map/framework.cpp b/map/framework.cpp index 1218330628..7ac9bf3bbb 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1590,7 +1590,7 @@ bool Framework::QueryMayBeSkipped(SearchIntent const & intent, search::SearchPar return true; } -void Framework::ShowSearchResult(search::Result const & res) +void Framework::ShowSearchResult(search::Result const & res, bool animation) { CancelAllSearches(); StopLocationFollow(); @@ -1619,7 +1619,7 @@ void Framework::ShowSearchResult(search::Result const & res) } m2::PointD const center = info.GetMercator(); - CallDrapeFunction(bind(&df::DrapeEngine::SetModelViewCenter, _1, center, scale, true)); + CallDrapeFunction(bind(&df::DrapeEngine::SetModelViewCenter, _1, center, scale, animation)); UserMarkContainer::UserMarkForPoi()->SetPtOrg(center); ActivateMapSelection(false, df::SelectionShape::OBJECT_POI, info); diff --git a/map/framework.hpp b/map/framework.hpp index d18b3194ad..dfd97456b0 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -549,7 +549,7 @@ public: bool GetCurrentPosition(double & lat, double & lon) const; - void ShowSearchResult(search::Result const & res); + void ShowSearchResult(search::Result const & res, bool animation = true); size_t ShowSearchResults(search::Results const & results); list const & GetLastSearchQueries() const { return m_searchQuerySaver.Get(); } diff --git a/search/search_quality/assessment_tool/context.cpp b/search/search_quality/assessment_tool/context.cpp index 4aa2cc6dd4..862db33e68 100644 --- a/search/search_quality/assessment_tool/context.cpp +++ b/search/search_quality/assessment_tool/context.cpp @@ -99,6 +99,8 @@ void ContextList::Resize(size_t size) for (size_t i = size; i < oldSize; ++i) m_contexts[i].Clear(); + if (size < m_contexts.size()) + m_contexts.erase(m_contexts.begin() + size, m_contexts.end()); m_hasChanges.resize(size); for (size_t i = oldSize; i < size; ++i) diff --git a/search/search_quality/assessment_tool/main_model.cpp b/search/search_quality/assessment_tool/main_model.cpp index 19fa98c002..ace0f95bbc 100644 --- a/search/search_quality/assessment_tool/main_model.cpp +++ b/search/search_quality/assessment_tool/main_model.cpp @@ -184,6 +184,29 @@ void MainModel::OnResultSelected(int index) m_view->MoveViewportToResult(results.GetResult(index)); } +void MainModel::OnShowViewportClicked() +{ + CHECK(m_selectedSample != kInvalidIndex, ()); + CHECK(m_selectedSample < m_contexts.Size(), ()); + + auto const & context = m_contexts[m_selectedSample]; + m_view->MoveViewportToRect(context.m_sample.m_viewport); +} + +void MainModel::OnShowPositionClicked() +{ + CHECK(m_selectedSample != kInvalidIndex, ()); + CHECK(m_selectedSample < m_contexts.Size(), ()); + + static int constexpr kViewportAroundPositionSizeM = 100; + + auto const & context = m_contexts[m_selectedSample]; + auto const & position = context.m_sample.m_pos; + auto const rect = + MercatorBounds::RectByCenterXYAndSizeInMeters(position, kViewportAroundPositionSizeM); + m_view->MoveViewportToRect(rect); +} + bool MainModel::HasChanges() { return m_contexts.HasChanges(); } void MainModel::OnUpdate(size_t index, Edits::Update const & update) diff --git a/search/search_quality/assessment_tool/main_model.hpp b/search/search_quality/assessment_tool/main_model.hpp index 839d35bb14..cbff49574d 100644 --- a/search/search_quality/assessment_tool/main_model.hpp +++ b/search/search_quality/assessment_tool/main_model.hpp @@ -32,6 +32,8 @@ public: void OnSampleSelected(int index) override; void OnResultSelected(int index) override; + void OnShowViewportClicked() override; + void OnShowPositionClicked() override; bool HasChanges() override; private: diff --git a/search/search_quality/assessment_tool/main_view.cpp b/search/search_quality/assessment_tool/main_view.cpp index 8b70b52bb5..d5b2bbc7fc 100644 --- a/search/search_quality/assessment_tool/main_view.cpp +++ b/search/search_quality/assessment_tool/main_view.cpp @@ -60,7 +60,7 @@ void MainView::SetSamples(ContextList::SamplesSlice const & samples) void MainView::ShowSample(size_t index, search::Sample const & sample, bool hasEdits) { - m_framework.ShowRect(sample.m_viewport, -1 /* maxScale */, false /* animation */); + MoveViewportToRect(sample.m_viewport); m_sampleView->SetContents(sample); m_sampleView->show(); @@ -75,7 +75,12 @@ void MainView::ShowResults(search::Results::Iter begin, search::Results::Iter en void MainView::MoveViewportToResult(search::Result const & result) { - m_framework.ShowSearchResult(result); + m_framework.ShowSearchResult(result, false /* animation */); +} + +void MainView::MoveViewportToRect(m2::RectD const & rect) +{ + m_framework.ShowRect(rect, -1 /* maxScale */, false /* animation */); } void MainView::OnSampleChanged(size_t index, Edits::Update const & update, bool hasEdits) @@ -222,8 +227,7 @@ void MainView::InitDocks() { auto * model = m_samplesView->selectionModel(); - connect(model, SIGNAL(selectionChanged(QItemSelection const &, QItemSelection const &)), this, - SLOT(OnSampleSelected(QItemSelection const &))); + connect(model, &QItemSelectionModel::selectionChanged, this, &MainView::OnSampleSelected); } m_samplesDock = CreateDock(*m_samplesView); @@ -232,10 +236,14 @@ void MainView::InitDocks() m_sampleView = new SampleView(this /* parent */); + connect(m_sampleView, &SampleView::OnShowViewportClicked, + [this]() { m_model->OnShowViewportClicked(); }); + connect(m_sampleView, &SampleView::OnShowPositionClicked, + [this]() { m_model->OnShowPositionClicked(); }); + { auto * model = m_sampleView->GetResultsView().selectionModel(); - connect(model, SIGNAL(selectionChanged(QItemSelection const &, QItemSelection const &)), this, - SLOT(OnResultSelected(QItemSelection const &))); + connect(model, &QItemSelectionModel::selectionChanged, this, &MainView::OnResultSelected); } m_sampleDock = CreateDock(*m_sampleView); diff --git a/search/search_quality/assessment_tool/main_view.hpp b/search/search_quality/assessment_tool/main_view.hpp index ae57b708fa..16d26fcefd 100644 --- a/search/search_quality/assessment_tool/main_view.hpp +++ b/search/search_quality/assessment_tool/main_view.hpp @@ -32,6 +32,7 @@ public: void ShowResults(search::Results::Iter begin, search::Results::Iter end) override; void MoveViewportToResult(search::Result const & result) override; + void MoveViewportToRect(m2::RectD const & rect) override; void OnSampleChanged(size_t index, Edits::Update const & update, bool hasEdits) override; void EnableSampleEditing(size_t index, Edits & edits) override; @@ -45,7 +46,7 @@ protected: // QMainWindow overrides: void closeEvent(QCloseEvent * event) override; -private Q_SLOTS: +private slots: void OnSampleSelected(QItemSelection const & current); void OnResultSelected(QItemSelection const & current); diff --git a/search/search_quality/assessment_tool/model.hpp b/search/search_quality/assessment_tool/model.hpp index 8c09f9c14b..11ff4df73f 100644 --- a/search/search_quality/assessment_tool/model.hpp +++ b/search/search_quality/assessment_tool/model.hpp @@ -17,6 +17,8 @@ public: virtual void OnSampleSelected(int index) = 0; virtual void OnResultSelected(int index) = 0; + virtual void OnShowViewportClicked() = 0; + virtual void OnShowPositionClicked() = 0; virtual bool HasChanges() = 0; protected: diff --git a/search/search_quality/assessment_tool/sample_view.cpp b/search/search_quality/assessment_tool/sample_view.cpp index a8fada841e..9a4004defd 100644 --- a/search/search_quality/assessment_tool/sample_view.cpp +++ b/search/search_quality/assessment_tool/sample_view.cpp @@ -15,16 +15,28 @@ #include #include #include +#include #include +namespace +{ +template +Layout * BuildSubLayout(QLayout & mainLayout, QWidget & parent) +{ + auto * box = new QWidget(&parent); + auto * subLayout = BuildLayoutWithoutMargins(box /* parent */); + box->setLayout(subLayout); + mainLayout.addWidget(box); + return subLayout; +} +} // namespace + SampleView::SampleView(QWidget * parent) : QWidget(parent) { auto * mainLayout = BuildLayoutWithoutMargins(this /* parent */); { - auto * box = new QWidget(this /* parent */); - auto * layout = BuildLayoutWithoutMargins(box /* parent */); - box->setLayout(layout); + auto * layout = BuildSubLayout(*mainLayout, *this /* parent */); m_query = new QLineEdit(this /* parent */); m_query->setToolTip(tr("Query text")); @@ -41,21 +53,27 @@ SampleView::SampleView(QWidget * parent) : QWidget(parent) // will be ready. m_langs->setEnabled(false); layout->addWidget(m_langs); - - mainLayout->addWidget(box); } { - auto * box = new QWidget(this /* parent */); - auto * layout = BuildLayoutWithoutMargins(box /* parent */); - box->setLayout(layout); + auto * layout = BuildSubLayout(*mainLayout, *this /* parent */); + + m_showViewport = new QPushButton(tr("Show viewport"), this /* parent */); + connect(m_showViewport, &QPushButton::clicked, [this]() { emit OnShowViewportClicked(); }); + layout->addWidget(m_showViewport); + + m_showPosition = new QPushButton(tr("Show position"), this /* parent */); + connect(m_showPosition, &QPushButton::clicked, [this]() { emit OnShowPositionClicked(); }); + layout->addWidget(m_showPosition); + } + + { + auto * layout = BuildSubLayout(*mainLayout, *this /* parent */); layout->addWidget(new QLabel(tr("Found results"))); - m_results = new ResultsView(*box /* parent */); + m_results = new ResultsView(*this /* parent */); layout->addWidget(m_results); - - mainLayout->addWidget(box); } setLayout(mainLayout); @@ -69,6 +87,8 @@ void SampleView::SetContents(search::Sample const & sample) m_query->home(false /* mark */); m_langs->Select(sample.m_locale); + m_showViewport->setEnabled(true); + m_showPosition->setEnabled(true); m_results->Clear(); } @@ -95,6 +115,8 @@ void SampleView::Clear() { m_query->setText(QString()); m_langs->Select("default"); + m_showViewport->setEnabled(false); + m_showPosition->setEnabled(false); m_results->Clear(); m_edits = nullptr; } diff --git a/search/search_quality/assessment_tool/sample_view.hpp b/search/search_quality/assessment_tool/sample_view.hpp index 251bbf5d36..f4c52cc2f5 100644 --- a/search/search_quality/assessment_tool/sample_view.hpp +++ b/search/search_quality/assessment_tool/sample_view.hpp @@ -8,6 +8,7 @@ class LanguagesList; class QLineEdit; +class QPushButton; class ResultsView; class SampleView : public QWidget @@ -29,9 +30,15 @@ public: ResultsView & GetResultsView() { return *m_results; } +signals: + void OnShowViewportClicked(); + void OnShowPositionClicked(); + private: QLineEdit * m_query = nullptr; LanguagesList * m_langs = nullptr; + QPushButton * m_showViewport = nullptr; + QPushButton * m_showPosition = nullptr; ResultsView * m_results = nullptr; Edits * m_edits = nullptr; diff --git a/search/search_quality/assessment_tool/view.hpp b/search/search_quality/assessment_tool/view.hpp index 677b72615f..77b7affb75 100644 --- a/search/search_quality/assessment_tool/view.hpp +++ b/search/search_quality/assessment_tool/view.hpp @@ -4,6 +4,8 @@ #include "search/search_quality/assessment_tool/context.hpp" #include "search/search_quality/assessment_tool/edits.hpp" +#include "geometry/rect2d.hpp" + #include #include #include @@ -23,6 +25,7 @@ public: virtual void ShowResults(search::Results::Iter begin, search::Results::Iter end) = 0; virtual void MoveViewportToResult(search::Result const & result) = 0; + virtual void MoveViewportToRect(m2::RectD const & rect) = 0; virtual void OnSampleChanged(size_t index, Edits::Update const & update, bool hasEdits) = 0; virtual void EnableSampleEditing(size_t index, Edits & edits) = 0;