From 64e4c4ebe7d18474381f852452dc25f7f3487e1f Mon Sep 17 00:00:00 2001 From: Mikhail Gorbushin Date: Thu, 6 Jun 2019 21:22:24 +0300 Subject: [PATCH] [qt] add reuse code from generator + add small menu about choosing - whether show borders with points or just multilines --- map/framework.cpp | 74 ++++++++++-------------------- map/framework.hpp | 6 +-- qt/CMakeLists.txt | 3 ++ qt/draw_widget.cpp | 86 ++++++++++++++++------------------- qt/draw_widget.hpp | 32 ++++++++----- qt/mainwindow.cpp | 54 ++++++++++++---------- qt/mwms_borders_selection.cpp | 54 ++++++++++++++++++++++ qt/mwms_borders_selection.hpp | 36 +++++++++++++++ 8 files changed, 210 insertions(+), 135 deletions(-) create mode 100644 qt/mwms_borders_selection.cpp create mode 100644 qt/mwms_borders_selection.hpp diff --git a/map/framework.cpp b/map/framework.cpp index ac73fb36b3..c6f36039dd 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -14,6 +14,8 @@ #include "map/utils.hpp" #include "map/viewport_search_params.hpp" +#include "generator/borders.hpp" + #include "defines.hpp" #include "private.h" @@ -3497,66 +3499,36 @@ void VisualizeFeatureInRect(m2::RectD const & rect, FeatureType & ft, df::DrapeA } } // namespace -void Framework::VisualizeMwmBorderByPolyFiles(std::string const & mwmName) +void Framework::DrawMwmBorder(std::string const & mwmName, + std::vector const & polygons, bool withPoints) { - static std::string const kPathToBorders = - base::JoinPath(GetPlatform().ResourcesDir(), "borders"); - - std::string const path = base::JoinPath(kPathToBorders, mwmName + ".poly"); - - std::vector points; - std::ifstream input(path); - std::string line; - - std::getline(input, line); - std::getline(input, line); - - double lon = 0.0; - double lat = 0.0; - uint32_t mwmNameNumber = 0; - while (std::getline(input, line)) + for (auto const & region : polygons) { - if (line == "END") + auto const points = region.Data(); + if (points.empty()) + return; + + static uint32_t kColorCounter = 0; + if (withPoints) { - DrawMwmBorder(points, - mwmName + (mwmNameNumber ? "_" + std::to_string(mwmNameNumber) : "")); - ++mwmNameNumber; - points.clear(); - continue; + m_drapeApi.AddLine(mwmName, df::DrapeApiLineData(points, colorList[kColorCounter]) + .Width(4.0f) + .ShowId() + .ShowPoints(true)); + } + else + { + m_drapeApi.AddLine( + mwmName, df::DrapeApiLineData(points, colorList[kColorCounter]).Width(4.0f).ShowId()); } - strings::SimpleTokenizer iter(line, "\t"); - - if (!iter || !strings::to_double(*iter, lon)) - continue; - ++iter; - - if (!iter || !strings::to_double(*iter, lat)) - continue; - - points.emplace_back(MercatorBounds::FromLatLon(lat, lon)); + kColorCounter = (kColorCounter + 1) % colorList.size(); } } -void Framework::DrawMwmBorder(std::vector const & points, - std::string const & mwmName) +std::vector Framework::GetRegionsCountryIdByRect(m2::RectD const & rect, bool rough) const { - if (points.empty()) - return; - - static uint32_t kColorCounter = 0; - m_drapeApi.AddLine(mwmName, - df::DrapeApiLineData(points, colorList[kColorCounter]).Width(4.0f).ShowId()); - - kColorCounter = (kColorCounter + 1) % colorList.size(); -} - - -void Framework::VisualizeMwmsBordersInRect(m2::RectD const & rect) -{ - auto mwmNames = m_infoGetter->GetRegionsCountryIdByRect(rect, false /* rough */); - for (auto const & mwmName : mwmNames) - VisualizeMwmBorderByPolyFiles(mwmName); + return m_infoGetter->GetRegionsCountryIdByRect(rect, rough); } void Framework::VisualizeRoadsInRect(m2::RectD const & rect) diff --git a/map/framework.hpp b/map/framework.hpp index 86813b1bad..95c1c4c8c2 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -397,8 +397,6 @@ public: double GetMinDistanceBetweenResults() const override; private: - void VisualizeMwmBorderByPolyFiles(std::string const & mwmName); - void ActivateMapSelection(bool needAnimation, df::SelectionShape::ESelectedObject selectionType, place_page::Info const & info); @@ -409,7 +407,8 @@ public: /// Used to "refresh" UI in some cases (e.g. feature editing). void UpdatePlacePageInfoForCurrentSelection(); - void DrawMwmBorder(std::vector const & points, std::string const & mwmName); + void DrawMwmBorder(std::string const & mwmName, std::vector const & points, + bool withPoints); /// Called to notify UI that object on a map was selected (UI should show Place Page, for example). using TActivateMapSelectionFn = function; @@ -432,6 +431,7 @@ public: /// Guarantees that listener is called in the main thread context. void SetCurrentCountryChangedListener(TCurrentCountryChanged const & listener); + std::vector GetRegionsCountryIdByRect(m2::RectD const & rect, bool rough) const; vector GetMwmsByRect(m2::RectD const & rect, bool rough) const; MwmSet::MwmId GetMwmIdByName(string const & name) const; diff --git a/qt/CMakeLists.txt b/qt/CMakeLists.txt index 83a06b7be4..94591b7ea8 100644 --- a/qt/CMakeLists.txt +++ b/qt/CMakeLists.txt @@ -44,6 +44,8 @@ set( main.cpp mainwindow.cpp mainwindow.hpp + mwms_borders_selection.cpp + mwms_borders_selection.hpp osm_auth_dialog.cpp osm_auth_dialog.hpp place_page_dialog.cpp @@ -68,6 +70,7 @@ omim_link_libraries( map drape_frontend shaders + generator routing search storage diff --git a/qt/draw_widget.cpp b/qt/draw_widget.cpp index 53c8e95ba0..6b73aaa58c 100644 --- a/qt/draw_widget.cpp +++ b/qt/draw_widget.cpp @@ -9,6 +9,8 @@ #include "map/framework.hpp" +#include "generator/borders.hpp" + #include "search/result.hpp" #include "search/reverse_geocoder.hpp" @@ -23,6 +25,7 @@ #include "platform/settings.hpp" #include "base/assert.hpp" +#include "base/file_name_utils.hpp" #include #include @@ -35,6 +38,7 @@ #include #include #include +#include using namespace qt::common; @@ -208,7 +212,7 @@ void DrawWidget::mousePressEvent(QMouseEvent * e) { SubmitBookmark(pt); } - else if (!(IsSelectionModeEnabled()) || + else if (!(m_currentSelectionMode) || IsCommandModifier(e)) { ShowInfoPopup(e, pt); @@ -233,13 +237,30 @@ void DrawWidget::mouseMoveEvent(QMouseEvent * e) if (IsLeftButton(e) && !IsAltModifier(e)) m_framework.TouchEvent(GetTouchEvent(e, df::TouchEvent::TOUCH_MOVE)); - if ((IsSelectionModeEnabled()) && + if ((m_currentSelectionMode) && m_rubberBand != nullptr && m_rubberBand->isVisible()) { m_rubberBand->setGeometry(QRect(m_rubberBandOrigin, e->pos()).normalized()); } } +void DrawWidget::VisualizeMwmsBordersInRect(m2::RectD const & rect, bool withPoints) +{ + static std::string const kPathToBorders = + base::JoinPath(GetPlatform().ResourcesDir(), "borders"); + + auto const mwmNames = m_framework.GetRegionsCountryIdByRect(rect, false /* rough */); + + for (auto const & mwmName : mwmNames) + { + std::string const path = base::JoinPath(kPathToBorders, mwmName + ".poly"); + std::vector polygons; + borders::LoadBorders(path, polygons); + + m_framework.DrawMwmBorder(mwmName, polygons, withPoints); + } +} + void DrawWidget::mouseReleaseEvent(QMouseEvent * e) { if (m_screenshotMode) @@ -250,7 +271,7 @@ void DrawWidget::mouseReleaseEvent(QMouseEvent * e) { m_framework.TouchEvent(GetTouchEvent(e, df::TouchEvent::TOUCH_UP)); } - else if ((IsSelectionModeEnabled()) && + else if ((m_currentSelectionMode) && IsRightButton(e) && m_rubberBand != nullptr && m_rubberBand->isVisible()) { QPoint const lt = m_rubberBand->geometry().topLeft(); @@ -258,36 +279,34 @@ void DrawWidget::mouseReleaseEvent(QMouseEvent * e) m2::RectD rect; rect.Add(m_framework.PtoG(m2::PointD(L2D(lt.x()), L2D(lt.y())))); rect.Add(m_framework.PtoG(m2::PointD(L2D(rb.x()), L2D(rb.y())))); - if (m_selectionMode) + switch (*m_currentSelectionMode) + { + case SelectionMode::Features: { - CHECK(!m_cityBoundariesSelectionMode, ()); - CHECK(!m_cityRoadsSelectionMode, ()); - CHECK(!m_mwmsBordersSelectionMode, ()); m_framework.VisualizeRoadsInRect(rect); + break; } - else if (m_cityBoundariesSelectionMode) + case SelectionMode::CityBoundaries: { - CHECK(!m_cityRoadsSelectionMode, ()); - CHECK(!m_mwmsBordersSelectionMode, ()); - CHECK(!m_selectionMode, ()); m_framework.VisualizeCityBoundariesInRect(rect); + break; } - else if (m_cityRoadsSelectionMode) + case SelectionMode::CityRoads: { - CHECK(!m_cityBoundariesSelectionMode, ()); - CHECK(!m_mwmsBordersSelectionMode, ()); - CHECK(!m_selectionMode, ()); m_framework.VisualizeCityRoadsInRect(rect); + break; } - else if (m_mwmsBordersSelectionMode) + case SelectionMode::MwmsBorders: { - CHECK(!m_cityBoundariesSelectionMode, ()); - CHECK(!m_cityRoadsSelectionMode, ()); - CHECK(!m_selectionMode, ()); - m_framework.VisualizeMwmsBordersInRect(rect); + VisualizeMwmsBordersInRect(rect, false /* withPoints */); + break; } - else + case SelectionMode::MwmsBordersWithPoints: { + VisualizeMwmsBordersInRect(rect, true /* withPoints */); + break; + } + default: UNREACHABLE(); } @@ -556,23 +575,6 @@ void DrawWidget::SetRouter(routing::RouterType routerType) m_framework.GetRoutingManager().SetRouter(routerType); } -void DrawWidget::SetSelectionMode(bool mode) { m_selectionMode = mode; } - -void DrawWidget::SetCityBoundariesSelectionMode(bool mode) -{ - m_cityBoundariesSelectionMode = mode; -} - -void DrawWidget::SetCityRoadsSelectionMode(bool mode) -{ - m_cityRoadsSelectionMode = mode; -} - -void DrawWidget::SetMwmsBordersSelectionMode(bool mode) -{ - m_mwmsBordersSelectionMode = mode; -} - // static void DrawWidget::SetDefaultSurfaceFormat(bool apiOpenGLES3) { @@ -612,12 +614,4 @@ m2::PointD DrawWidget::GetCoordsFromSettingsIfExists(bool start, m2::PointD cons return m_framework.P3dtoG(pt); } - -bool DrawWidget::IsSelectionModeEnabled() const -{ - return m_selectionMode || - m_cityBoundariesSelectionMode || - m_cityRoadsSelectionMode || - m_mwmsBordersSelectionMode; -} } // namespace qt diff --git a/qt/draw_widget.hpp b/qt/draw_widget.hpp index 719620ad81..311ca3cd16 100644 --- a/qt/draw_widget.hpp +++ b/qt/draw_widget.hpp @@ -18,6 +18,8 @@ #include #include +#include "boost/optional.hpp" + #include class Framework; @@ -76,11 +78,6 @@ public: void DownloadCountry(storage::CountryId const & countryId); void RetryToDownloadCountry(storage::CountryId const & countryId); - void SetSelectionMode(bool mode); - void SetCityBoundariesSelectionMode(bool mode); - void SetCityRoadsSelectionMode(bool mode); - void SetMwmsBordersSelectionMode(bool mode); - RouteMarkType GetRoutePointAddMode() const { return m_routePointAddMode; } void SetRoutePointAddMode(RouteMarkType mode) { m_routePointAddMode = mode; } void FollowRoute(); @@ -110,10 +107,10 @@ private: void SubmitBookmark(m2::PointD const & pt); void ShowPlacePage(place_page::Info const & info); - bool IsSelectionModeEnabled() const; - void UpdateCountryStatus(storage::CountryId const & countryId); + void VisualizeMwmsBordersInRect(m2::RectD const & rect, bool withPoints); + m2::PointD GetCoordsFromSettingsIfExists(bool start, m2::PointD const & pt); QRubberBand * m_rubberBand; @@ -124,10 +121,23 @@ private: TCurrentCountryChanged m_currentCountryChanged; storage::CountryId m_countryId; - bool m_selectionMode = false; - bool m_cityBoundariesSelectionMode = false; - bool m_cityRoadsSelectionMode = false; - bool m_mwmsBordersSelectionMode = false; +public: + enum class SelectionMode + { + Features, + CityBoundaries, + CityRoads, + MwmsBorders, + MwmsBordersWithPoints + }; + + void SetSelectionMode(SelectionMode mode) { m_currentSelectionMode = {mode}; } + void DropSelectionMode() { m_currentSelectionMode = {}; } + bool SelectionModeIsSet() { return static_cast(m_currentSelectionMode); } + SelectionMode GetSelectionMode() const { return *m_currentSelectionMode; } + +private: + boost::optional m_currentSelectionMode; RouteMarkType m_routePointAddMode = RouteMarkType::Finish; std::unique_ptr m_screenshoter; diff --git a/qt/mainwindow.cpp b/qt/mainwindow.cpp index 3a44e75fe5..f8fe7a712b 100644 --- a/qt/mainwindow.cpp +++ b/qt/mainwindow.cpp @@ -2,6 +2,7 @@ #include "qt/bookmark_dialog.hpp" #include "qt/draw_widget.hpp" #include "qt/mainwindow.hpp" +#include "qt/mwms_borders_selection.hpp" #include "qt/osm_auth_dialog.hpp" #include "qt/preferences_dialog.hpp" #include "qt/qt_common/helpers.hpp" @@ -13,6 +14,8 @@ #include "platform/settings.hpp" #include "platform/platform.hpp" +#include "base/assert.hpp" + #include "defines.hpp" #include @@ -608,57 +611,60 @@ void MainWindow::OnCreateFeatureClicked() void MainWindow::OnSwitchSelectionMode() { m_selectionCityBoundariesMode->setChecked(false); - m_pDrawWidget->SetCityBoundariesSelectionMode(false); - m_selectionCityRoadsMode->setChecked(false); - m_pDrawWidget->SetCityRoadsSelectionMode(false); - m_selectionMwmsBordersMode->setChecked(false); - m_pDrawWidget->SetMwmsBordersSelectionMode(false); - m_pDrawWidget->SetSelectionMode(m_selectionMode->isChecked()); + m_pDrawWidget->SetSelectionMode(DrawWidget::SelectionMode::Features); } void MainWindow::OnSwitchCityBoundariesSelectionMode() { m_selectionMode->setChecked(false); - m_pDrawWidget->SetSelectionMode(false); - m_selectionCityRoadsMode->setChecked(false); - m_pDrawWidget->SetCityRoadsSelectionMode(false); - m_selectionMwmsBordersMode->setChecked(false); - m_pDrawWidget->SetMwmsBordersSelectionMode(false); - m_pDrawWidget->SetCityBoundariesSelectionMode(m_selectionCityBoundariesMode->isChecked()); + m_pDrawWidget->SetSelectionMode(DrawWidget::SelectionMode::CityBoundaries); } void MainWindow::OnSwitchCityRoadsSelectionMode() { m_selectionMode->setChecked(false); - m_pDrawWidget->SetSelectionMode(false); - m_selectionCityBoundariesMode->setChecked(false); - m_pDrawWidget->SetCityBoundariesSelectionMode(false); - m_selectionMwmsBordersMode->setChecked(false); - m_pDrawWidget->SetMwmsBordersSelectionMode(false); - m_pDrawWidget->SetCityRoadsSelectionMode(m_selectionCityRoadsMode->isChecked()); + m_pDrawWidget->SetSelectionMode(DrawWidget::SelectionMode::CityRoads); } void MainWindow::OnSwitchMwmsBordersSelectionMode() { + MwmsBordersSelection dlg(this); + auto const response = dlg.ShowModal(); + if (response == MwmsBordersSelection::Response::Canceled) + { + if (m_pDrawWidget->SelectionModeIsSet() && + (m_pDrawWidget->GetSelectionMode() == DrawWidget::SelectionMode::MwmsBordersWithPoints || + m_pDrawWidget->GetSelectionMode() == DrawWidget::SelectionMode::MwmsBorders)) + { + m_pDrawWidget->DropSelectionMode(); + } + + m_selectionMwmsBordersMode->setChecked(false); + return; + } + + CHECK(response == MwmsBordersSelection::Response::JustBorders || + response == MwmsBordersSelection::Response::WithPointsAndBorders, ()); + m_selectionMode->setChecked(false); - m_pDrawWidget->SetSelectionMode(false); - m_selectionCityBoundariesMode->setChecked(false); - m_pDrawWidget->SetCityBoundariesSelectionMode(false); - m_selectionCityRoadsMode->setChecked(false); - m_pDrawWidget->SetCityRoadsSelectionMode(false); - m_pDrawWidget->SetMwmsBordersSelectionMode(m_selectionMwmsBordersMode->isChecked()); + m_selectionMwmsBordersMode->setChecked(true); + + if (response == MwmsBordersSelection::Response::WithPointsAndBorders) + m_pDrawWidget->SetSelectionMode(DrawWidget::SelectionMode::MwmsBordersWithPoints); + else + m_pDrawWidget->SetSelectionMode(DrawWidget::SelectionMode::MwmsBorders); } void MainWindow::OnClearSelection() diff --git a/qt/mwms_borders_selection.cpp b/qt/mwms_borders_selection.cpp new file mode 100644 index 0000000000..714327cc9e --- /dev/null +++ b/qt/mwms_borders_selection.cpp @@ -0,0 +1,54 @@ +#include "qt/mwms_borders_selection.hpp" + +#include "base/assert.hpp" + +#include +#include +#include + +namespace qt +{ +MwmsBordersSelection::MwmsBordersSelection(QWidget * parent) + : QDialog(parent), + m_form(this) +{ + setWindowTitle("Mwms borders selection settings"); + + m_radioWithPoints = new QRadioButton(tr("Show borders with points.")); + m_radioJustBorders = new QRadioButton(tr("Show just borders.")); + + m_radioJustBorders->setChecked(true); + + auto * vbox = new QVBoxLayout; + vbox->addWidget(m_radioWithPoints); + vbox->addWidget(m_radioJustBorders); + + m_form.addRow(vbox); + AddButtonBox(); +} + +void MwmsBordersSelection::AddButtonBox() +{ + auto * buttonBox = + new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this); + + m_form.addRow(buttonBox); + + QObject::connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); + QObject::connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); +} + +MwmsBordersSelection::Response MwmsBordersSelection::ShowModal() +{ + if (exec() != QDialog::Accepted) + return Response::Canceled; + + if (m_radioJustBorders->isChecked()) + return Response::JustBorders; + + if (m_radioWithPoints->isChecked()) + return Response::WithPointsAndBorders; + + UNREACHABLE(); +} +} // namespace qt diff --git a/qt/mwms_borders_selection.hpp b/qt/mwms_borders_selection.hpp new file mode 100644 index 0000000000..15a37374c0 --- /dev/null +++ b/qt/mwms_borders_selection.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include +#include +#include +#include + +#include + +class Framework; + +namespace qt +{ +class MwmsBordersSelection : public QDialog +{ +public: + MwmsBordersSelection(QWidget * parent); + + enum class Response + { + JustBorders, + WithPointsAndBorders, + + Canceled + }; + + Response ShowModal(); + +private: + void AddButtonBox(); + + QFormLayout m_form; + QRadioButton * m_radioWithPoints; + QRadioButton * m_radioJustBorders; +}; +} // namespace qt