mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 08:50:05 +00:00 
			
		
		
		
	
						commit
						9019aa5e33
					
				
					 20 changed files with 568 additions and 103 deletions
				
			
		
							
								
								
									
										3
									
								
								.github/workflows/ci.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/ci.yml
									
										
									
									
										vendored
									
									
								
							|  | @ -31,6 +31,7 @@ jobs: | |||
|             msvc_version: 2022 | ||||
|             qt_version: 6.5.0 | ||||
|             qt_arch: win64_msvc2019_64 | ||||
|             qt_modules: qtimageformats | ||||
|             qt_tools: '' | ||||
|             conan_arch: x86_64 | ||||
|             conan_compiler: Visual Studio | ||||
|  | @ -46,6 +47,7 @@ jobs: | |||
|             compiler: gcc | ||||
|             qt_version: 6.5.0 | ||||
|             qt_arch: gcc_64 | ||||
|             qt_modules: qtimageformats | ||||
|             qt_tools: '' | ||||
|             conan_arch: x86_64 | ||||
|             conan_compiler: gcc | ||||
|  | @ -74,6 +76,7 @@ jobs: | |||
|       with: | ||||
|         version: ${{ matrix.qt_version }} | ||||
|         arch: ${{ matrix.qt_arch }} | ||||
|         modules: ${{ matrix.qt_modules }} | ||||
|         tools: ${{ matrix.qt_tools }} | ||||
| 
 | ||||
|     - name: Setup MSVC | ||||
|  |  | |||
							
								
								
									
										2
									
								
								.gitmodules
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitmodules
									
										
									
									
										vendored
									
									
								
							|  | @ -1,6 +1,6 @@ | |||
| [submodule "external/mapbox-gl-native"] | ||||
| 	path = external/mapbox-gl-native | ||||
| 	url = https://github.com/maplibre/maplibre-gl-native.git | ||||
| 	url = https://github.com/dpaulat/maplibre-gl-native.git | ||||
| [submodule "external/cmake-conan"] | ||||
| 	path = external/cmake-conan | ||||
| 	url = https://github.com/conan-io/cmake-conan.git | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ Supercell Wx uses code from the following dependencies: | |||
| | [bzip2](https://sourceware.org/bzip2/) | [bzip2 and libbzip2 License v1.0.6](https://spdx.org/licenses/bzip2-1.0.6.html) | | ||||
| | [cmake-conan](https://github.com/conan-io/cmake-conan) | [MIT License](https://spdx.org/licenses/MIT.html) | | ||||
| | [cpr](https://github.com/libcpr/cpr) | [MIT License](https://spdx.org/licenses/MIT.html) | | ||||
| | [CSS Color Parser](https://github.com/deanm/css-color-parser-js) | [MIT License](https://spdx.org/licenses/MIT.html) | Ported to C++ for MapLibre GL Native | | ||||
| | [CSS Color Parser](https://github.com/deanm/css-color-parser-js) | [MIT License](https://spdx.org/licenses/MIT.html) | Ported to C++ for MapLibre Native | | ||||
| | [Date](https://github.com/HowardHinnant/date) | [MIT License](https://spdx.org/licenses/MIT.html) | | ||||
| | [Dear ImGui](https://github.com/ocornut/imgui) | [MIT License](https://spdx.org/licenses/MIT.html) | | ||||
| | [FreeType](https://freetype.org/) | [Freetype Project License](https://spdx.org/licenses/FTL.html) | | ||||
|  | @ -29,8 +29,8 @@ Supercell Wx uses code from the following dependencies: | |||
| | [libiconv](https://www.gnu.org/software/libiconv/) | [GNU Lesser General Public License v2.1 or later](https://spdx.org/licenses/LGPL-2.1-or-later.html) | | ||||
| | [libpng](http://libpng.org/pub/png/libpng.html) | [PNG Reference Library version 2](https://spdx.org/licenses/libpng-2.0.html) | | ||||
| | [libxml2](http://xmlsoft.org/) | [MIT License](https://spdx.org/licenses/MIT.html) | | ||||
| | [MapLibre GL Native](https://maplibre.org/projects/maplibre-native/) | [BSD 2-Clause "Simplified" License](https://spdx.org/licenses/BSD-2-Clause.html) | | ||||
| | [nunicode](https://bitbucket.org/alekseyt/nunicode/src/master/) | [MIT License](https://spdx.org/licenses/MIT.html) | Modified for MapLibre GL Native | | ||||
| | [MapLibre Native](https://maplibre.org/projects/maplibre-native/) | [BSD 2-Clause "Simplified" License](https://spdx.org/licenses/BSD-2-Clause.html) | | ||||
| | [nunicode](https://bitbucket.org/alekseyt/nunicode/src/master/) | [MIT License](https://spdx.org/licenses/MIT.html) | Modified for MapLibre Native | | ||||
| | [OpenSSL](https://www.openssl.org/) | [OpenSSL License](https://spdx.org/licenses/OpenSSL.html) | | ||||
| | [Qt](https://www.qt.io/) | [GNU Lesser General Public License v3.0 only](https://spdx.org/licenses/LGPL-3.0-only.html) | Qt Core, Qt GUI, Qt Network, Qt OpenGL, Qt SQL, Qt SVG, Qt Widgets<br/>Additional Licenses: https://doc.qt.io/qt-6/licenses-used-in-qt.html | | ||||
| | [spdlog](https://github.com/gabime/spdlog) | [MIT License](https://spdx.org/licenses/MIT.html) | | ||||
|  |  | |||
							
								
								
									
										2
									
								
								external/mapbox-gl-native
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								external/mapbox-gl-native
									
										
									
									
										vendored
									
									
								
							|  | @ -1 +1 @@ | |||
| Subproject commit e12c4d6be450a163b38548f72e72f4080fc71dbb | ||||
| Subproject commit fbb06ff53e74d3a81b434b84fff1a5dfe4b2d3c7 | ||||
							
								
								
									
										4
									
								
								external/mapbox-gl-native.cmake
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								external/mapbox-gl-native.cmake
									
										
									
									
										vendored
									
									
								
							|  | @ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.20) | |||
| set(PROJECT_NAME scwx-mbgl) | ||||
| 
 | ||||
| set(gtest_disable_pthreads ON) | ||||
| set(MBGL_WITH_QT ON) | ||||
| set(MBGL_QT_WITH_INTERNAL_ICU ON) | ||||
| set(MLN_WITH_QT ON) | ||||
| set(MLN_QT_WITH_INTERNAL_ICU ON) | ||||
| add_subdirectory(mapbox-gl-native) | ||||
| 
 | ||||
| find_package(ZLIB) | ||||
|  |  | |||
|  | @ -78,6 +78,7 @@ set(HDR_MAP source/scwx/qt/map/alert_layer.hpp | |||
|             source/scwx/qt/map/generic_layer.hpp | ||||
|             source/scwx/qt/map/layer_wrapper.hpp | ||||
|             source/scwx/qt/map/map_context.hpp | ||||
|             source/scwx/qt/map/map_provider.hpp | ||||
|             source/scwx/qt/map/map_settings.hpp | ||||
|             source/scwx/qt/map/map_widget.hpp | ||||
|             source/scwx/qt/map/overlay_layer.hpp | ||||
|  | @ -89,6 +90,7 @@ set(SRC_MAP source/scwx/qt/map/alert_layer.cpp | |||
|             source/scwx/qt/map/generic_layer.cpp | ||||
|             source/scwx/qt/map/layer_wrapper.cpp | ||||
|             source/scwx/qt/map/map_context.cpp | ||||
|             source/scwx/qt/map/map_provider.cpp | ||||
|             source/scwx/qt/map/map_widget.cpp | ||||
|             source/scwx/qt/map/overlay_layer.cpp | ||||
|             source/scwx/qt/map/radar_product_layer.cpp | ||||
|  |  | |||
|  | @ -58,12 +58,14 @@ void DrawItem::UseDefaultProjection( | |||
| static glm::vec2 | ||||
| LatLongToScreenCoordinate(const QMapLibreGL::Coordinate& coordinate) | ||||
| { | ||||
|    static constexpr double RAD2DEG_D = 180.0 / M_PI; | ||||
| 
 | ||||
|    double latitude = std::clamp( | ||||
|       coordinate.first, -mbgl::util::LATITUDE_MAX, mbgl::util::LATITUDE_MAX); | ||||
|    glm::vec2 screen { | ||||
|       mbgl::util::LONGITUDE_MAX + coordinate.second, | ||||
|       -(mbgl::util::LONGITUDE_MAX - | ||||
|         mbgl::util::RAD2DEG_D * | ||||
|         RAD2DEG_D * | ||||
|            std::log(std::tan(M_PI / 4.0 + | ||||
|                              latitude * M_PI / mbgl::util::DEGREES_MAX)))}; | ||||
|    return screen; | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ | |||
| #include <scwx/qt/manager/settings_manager.hpp> | ||||
| #include <scwx/qt/manager/text_event_manager.hpp> | ||||
| #include <scwx/qt/manager/update_manager.hpp> | ||||
| #include <scwx/qt/map/map_provider.hpp> | ||||
| #include <scwx/qt/map/map_widget.hpp> | ||||
| #include <scwx/qt/model/radar_product_model.hpp> | ||||
| #include <scwx/qt/ui/alert_dock_widget.hpp> | ||||
|  | @ -74,10 +75,18 @@ public: | |||
|        elevationButtonsChanged_ {false}, | ||||
|        resizeElevationButtons_ {false} | ||||
|    { | ||||
|       mapProvider_ = | ||||
|          map::GetMapProvider(manager::SettingsManager::general_settings() | ||||
|                                 .map_provider() | ||||
|                                 .GetValue()); | ||||
|       const map::MapProviderInfo& mapProviderInfo = | ||||
|          map::GetMapProviderInfo(mapProvider_); | ||||
| 
 | ||||
|       std::string appDataPath { | ||||
|          QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) | ||||
|             .toStdString()}; | ||||
|       std::string cacheDbPath {appDataPath + "/mbgl-cache.db"}; | ||||
|       std::string cacheDbPath {appDataPath + "/" + | ||||
|                                mapProviderInfo.cacheDbName_}; | ||||
| 
 | ||||
|       if (!std::filesystem::exists(appDataPath)) | ||||
|       { | ||||
|  | @ -89,12 +98,10 @@ public: | |||
|          } | ||||
|       } | ||||
| 
 | ||||
|       std::string mapboxApiKey = manager::SettingsManager::general_settings() | ||||
|                                     .mapbox_api_key() | ||||
|                                     .GetValue(); | ||||
|       std::string mapProviderApiKey = map::GetMapProviderApiKey(mapProvider_); | ||||
| 
 | ||||
|       settings_.resetToTemplate(QMapLibreGL::Settings::MapboxSettings); | ||||
|       settings_.setApiKey(QString {mapboxApiKey.c_str()}); | ||||
|       settings_.resetToTemplate(mapProviderInfo.settingsTemplate_); | ||||
|       settings_.setApiKey(QString {mapProviderApiKey.c_str()}); | ||||
|       settings_.setCacheDatabasePath(QString {cacheDbPath.c_str()}); | ||||
|       settings_.setCacheDatabaseMaximumSize(20 * 1024 * 1024); | ||||
|    } | ||||
|  | @ -105,6 +112,7 @@ public: | |||
|    void ConnectMapSignals(); | ||||
|    void ConnectOtherSignals(); | ||||
|    void HandleFocusChange(QWidget* focused); | ||||
|    void PopulateMapStyles(); | ||||
|    void SelectElevation(map::MapWidget* mapWidget, float elevation); | ||||
|    void SelectRadarProduct(map::MapWidget*           mapWidget, | ||||
|                            common::RadarProductGroup group, | ||||
|  | @ -113,6 +121,7 @@ public: | |||
|    void SetActiveMap(map::MapWidget* mapWidget); | ||||
|    void UpdateAvailableLevel3Products(); | ||||
|    void UpdateElevationSelection(float elevation); | ||||
|    void UpdateMapStyle(const std::string& styleName); | ||||
|    void UpdateRadarProductSelection(common::RadarProductGroup group, | ||||
|                                     const std::string&        product); | ||||
|    void UpdateRadarProductSettings(); | ||||
|  | @ -121,6 +130,7 @@ public: | |||
| 
 | ||||
|    MainWindow*           mainWindow_; | ||||
|    QMapLibreGL::Settings settings_; | ||||
|    map::MapProvider      mapProvider_; | ||||
|    map::MapWidget*       activeMap_; | ||||
| 
 | ||||
|    ui::Level2ProductsWidget* level2ProductsWidget_; | ||||
|  | @ -245,6 +255,7 @@ MainWindow::MainWindow(QWidget* parent) : | |||
|                             0); | ||||
|    } | ||||
| 
 | ||||
|    p->PopulateMapStyles(); | ||||
|    p->ConnectMapSignals(); | ||||
|    p->ConnectOtherSignals(); | ||||
|    p->HandleFocusChange(p->activeMap_); | ||||
|  | @ -586,6 +597,11 @@ void MainWindowImpl::ConnectMapSignals() | |||
|          }, | ||||
|          Qt::QueuedConnection); | ||||
| 
 | ||||
|       connect(mapWidget, | ||||
|               &map::MapWidget::MapStyleChanged, | ||||
|               this, | ||||
|               &MainWindowImpl::UpdateMapStyle); | ||||
| 
 | ||||
|       connect( | ||||
|          mapWidget, | ||||
|          &map::MapWidget::RadarSweepUpdated, | ||||
|  | @ -624,6 +640,11 @@ void MainWindowImpl::ConnectOtherSignals() | |||
|            &QApplication::focusChanged, | ||||
|            mainWindow_, | ||||
|            [this](QWidget* /*old*/, QWidget* now) { HandleFocusChange(now); }); | ||||
|    connect(mainWindow_->ui->mapStyleComboBox, | ||||
|            &QComboBox::currentTextChanged, | ||||
|            mainWindow_, | ||||
|            [&](const QString& text) | ||||
|            { activeMap_->SetMapStyle(text.toStdString()); }); | ||||
|    connect(level2ProductsWidget_, | ||||
|            &ui::Level2ProductsWidget::RadarProductSelected, | ||||
|            mainWindow_, | ||||
|  | @ -696,6 +717,7 @@ void MainWindowImpl::HandleFocusChange(QWidget* focused) | |||
|    { | ||||
|       SetActiveMap(mapWidget); | ||||
|       UpdateAvailableLevel3Products(); | ||||
|       UpdateMapStyle(mapWidget->GetMapStyle()); | ||||
|       UpdateRadarProductSelection(mapWidget->GetRadarProductGroup(), | ||||
|                                   mapWidget->GetRadarProductName()); | ||||
|       UpdateRadarProductSettings(); | ||||
|  | @ -704,6 +726,16 @@ void MainWindowImpl::HandleFocusChange(QWidget* focused) | |||
|    } | ||||
| } | ||||
| 
 | ||||
| void MainWindowImpl::PopulateMapStyles() | ||||
| { | ||||
|    const auto& mapProviderInfo = map::GetMapProviderInfo(mapProvider_); | ||||
|    for (const auto& mapStyle : mapProviderInfo.mapStyles_) | ||||
|    { | ||||
|       mainWindow_->ui->mapStyleComboBox->addItem( | ||||
|          QString::fromStdString(mapStyle.name_)); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void MainWindowImpl::SelectElevation(map::MapWidget* mapWidget, float elevation) | ||||
| { | ||||
|    if (mapWidget == activeMap_) | ||||
|  | @ -767,6 +799,16 @@ void MainWindowImpl::UpdateMapParameters( | |||
|    } | ||||
| } | ||||
| 
 | ||||
| void MainWindowImpl::UpdateMapStyle(const std::string& styleName) | ||||
| { | ||||
|    int index = mainWindow_->ui->mapStyleComboBox->findText( | ||||
|       QString::fromStdString(styleName)); | ||||
|    if (index != -1) | ||||
|    { | ||||
|       mainWindow_->ui->mapStyleComboBox->setCurrentIndex(index); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void MainWindowImpl::UpdateRadarProductSelection( | ||||
|    common::RadarProductGroup group, const std::string& product) | ||||
| { | ||||
|  |  | |||
|  | @ -184,6 +184,25 @@ | |||
|        </layout> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QGroupBox" name="mapSettingsGroupBox"> | ||||
|        <property name="title"> | ||||
|         <string>Map Settings</string> | ||||
|        </property> | ||||
|        <layout class="QVBoxLayout" name="verticalLayout_5"> | ||||
|         <item> | ||||
|          <widget class="QLabel" name="mapStyleLabel"> | ||||
|           <property name="text"> | ||||
|            <string>Map Style</string> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|         <item> | ||||
|          <widget class="QComboBox" name="mapStyleComboBox"/> | ||||
|         </item> | ||||
|        </layout> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QGroupBox" name="radarProductGroupBox"> | ||||
|        <property name="title"> | ||||
|  |  | |||
|  | @ -1,10 +1,12 @@ | |||
| #include <scwx/qt/manager/settings_manager.hpp> | ||||
| #include <scwx/qt/map/map_provider.hpp> | ||||
| #include <scwx/qt/util/json.hpp> | ||||
| #include <scwx/util/logger.hpp> | ||||
| 
 | ||||
| #include <filesystem> | ||||
| #include <fstream> | ||||
| 
 | ||||
| #include <boost/algorithm/string.hpp> | ||||
| #include <QDir> | ||||
| #include <QStandardPaths> | ||||
| 
 | ||||
|  | @ -23,6 +25,7 @@ static const auto        logger_    = scwx::util::Logger::Create(logPrefix_); | |||
| static boost::json::value ConvertSettingsToJson(); | ||||
| static void               GenerateDefaultSettings(); | ||||
| static bool               LoadSettings(const boost::json::object& settingsJson); | ||||
| static void               ValidateSettings(); | ||||
| 
 | ||||
| static bool        initialized_ {false}; | ||||
| static std::string settingsPath_ {}; | ||||
|  | @ -46,6 +49,7 @@ void Initialize() | |||
|    initialized_  = true; | ||||
| 
 | ||||
|    ReadSettings(settingsPath_); | ||||
|    ValidateSettings(); | ||||
| } | ||||
| 
 | ||||
| void ReadSettings(const std::string& settingsPath) | ||||
|  | @ -137,6 +141,47 @@ static bool LoadSettings(const boost::json::object& settingsJson) | |||
|    return jsonDirty; | ||||
| } | ||||
| 
 | ||||
| static void ValidateSettings() | ||||
| { | ||||
|    logger_->debug("Validating settings"); | ||||
| 
 | ||||
|    bool settingsChanged = false; | ||||
| 
 | ||||
|    auto& generalSettings = general_settings(); | ||||
| 
 | ||||
|    // Validate map provider
 | ||||
|    std::string mapProviderName = generalSettings.map_provider().GetValue(); | ||||
|    std::string mapboxApiKey    = generalSettings.mapbox_api_key().GetValue(); | ||||
|    std::string maptilerApiKey  = generalSettings.maptiler_api_key().GetValue(); | ||||
| 
 | ||||
|    map::MapProvider mapProvider = map::GetMapProvider(mapProviderName); | ||||
|    std::string      mapApiKey   = map::GetMapProviderApiKey(mapProvider); | ||||
| 
 | ||||
|    if (mapApiKey == "?") | ||||
|    { | ||||
|       for (map::MapProvider newProvider : map::MapProviderIterator()) | ||||
|       { | ||||
|          if (mapProvider != newProvider && | ||||
|              map::GetMapProviderApiKey(newProvider).size() > 1) | ||||
|          { | ||||
|             logger_->info( | ||||
|                "Setting Map Provider to {} based on API key settings", | ||||
|                map::GetMapProviderName(newProvider)); | ||||
| 
 | ||||
|             std::string newProviderName {GetMapProviderName(newProvider)}; | ||||
|             boost::to_lower(newProviderName); | ||||
|             generalSettings.map_provider().SetValue(newProviderName); | ||||
|             settingsChanged = true; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
| 
 | ||||
|    if (settingsChanged) | ||||
|    { | ||||
|       SaveSettings(); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| } // namespace SettingsManager
 | ||||
| } // namespace manager
 | ||||
| } // namespace qt
 | ||||
|  |  | |||
							
								
								
									
										127
									
								
								scwx-qt/source/scwx/qt/map/map_provider.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								scwx-qt/source/scwx/qt/map/map_provider.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,127 @@ | |||
| #include <scwx/qt/map/map_provider.hpp> | ||||
| #include <scwx/qt/manager/settings_manager.hpp> | ||||
| 
 | ||||
| #include <unordered_map> | ||||
| 
 | ||||
| #include <boost/algorithm/string.hpp> | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
| namespace qt | ||||
| { | ||||
| namespace map | ||||
| { | ||||
| 
 | ||||
| static const std::unordered_map<MapProvider, std::string> mapProviderName_ { | ||||
|    {MapProvider::Mapbox, "Mapbox"}, | ||||
|    {MapProvider::MapTiler, "MapTiler"}, | ||||
|    {MapProvider::Unknown, "?"}}; | ||||
| 
 | ||||
| // Draw below tunnels, ferries and roads
 | ||||
| static const std::vector<std::string> mapboxDrawBelow_ { | ||||
|    "tunnel.*", "ferry.*", "road.*"}; | ||||
| 
 | ||||
| static const std::unordered_map<MapProvider, MapProviderInfo> mapProviderInfo_ { | ||||
|    {MapProvider::Mapbox, | ||||
|     MapProviderInfo { | ||||
|        .mapProvider_ {MapProvider::Mapbox}, | ||||
|        .cacheDbName_ {"mbgl-cache.db"}, | ||||
|        .settingsTemplate_ { | ||||
|           QMapLibreGL::Settings::SettingsTemplate::MapboxSettings}, | ||||
|        .mapStyles_ {{.name_ {"Streets"}, | ||||
|                      .url_ {"mapbox://styles/mapbox/streets-v11"}, | ||||
|                      .drawBelow_ {mapboxDrawBelow_}}, | ||||
|                     {.name_ {"Outdoors"}, | ||||
|                      .url_ {"mapbox://styles/mapbox/outdoors-v11"}, | ||||
|                      .drawBelow_ {mapboxDrawBelow_}}, | ||||
|                     {.name_ {"Light"}, | ||||
|                      .url_ {"mapbox://styles/mapbox/light-v10"}, | ||||
|                      .drawBelow_ {mapboxDrawBelow_}}, | ||||
|                     {.name_ {"Dark"}, | ||||
|                      .url_ {"mapbox://styles/mapbox/dark-v10"}, | ||||
|                      .drawBelow_ {mapboxDrawBelow_}}, | ||||
|                     {.name_ {"Satellite"}, | ||||
|                      .url_ {"mapbox://styles/mapbox/satellite-v9"}, | ||||
|                      .drawBelow_ {mapboxDrawBelow_}}, | ||||
|                     {.name_ {"Satellite Streets"}, | ||||
|                      .url_ {"mapbox://styles/mapbox/satellite-streets-v11"}, | ||||
|                      .drawBelow_ {mapboxDrawBelow_}}}}}, | ||||
|    {MapProvider::MapTiler, | ||||
|     MapProviderInfo { | ||||
|        .mapProvider_ {MapProvider::MapTiler}, | ||||
|        .cacheDbName_ {"maptiler-cache.db"}, | ||||
|        .settingsTemplate_ { | ||||
|           QMapLibreGL::Settings::SettingsTemplate::MapTilerSettings}, | ||||
|        .mapStyles_ {{.name_ {"Satellite"}, | ||||
|                      .url_ {"maptiler://maps/hybrid"}, | ||||
|                      .drawBelow_ {"tunnel"}}, | ||||
|                     {.name_ {"Streets"}, | ||||
|                      .url_ {"maptiler://maps/streets-v2"}, | ||||
|                      .drawBelow_ {"aeroway"}}, | ||||
|                     {.name_ {"Basic"}, | ||||
|                      .url_ {"maptiler://maps/basic-v2"}, | ||||
|                      .drawBelow_ {"railway_transit_tunnel"}}, | ||||
|                     {.name_ {"Bright"}, | ||||
|                      .url_ {"maptiler://maps/bright-v2"}, | ||||
|                      .drawBelow_ {"ferry"}}, | ||||
|                     {.name_ {"Outdoor"}, | ||||
|                      .url_ {"maptiler://maps/outdoor-v2"}, | ||||
|                      .drawBelow_ {"aeroway_runway"}}, | ||||
|                     {.name_ {"Topo"}, | ||||
|                      .url_ {"maptiler://maps/topo-v2"}, | ||||
|                      .drawBelow_ {"aeroway_runway"}}, | ||||
|                     {.name_ {"Winter"}, | ||||
|                      .url_ {"maptiler://maps/winter-v2"}, | ||||
|                      .drawBelow_ {"aeroway_runway"}}}}}, | ||||
|    {MapProvider::Unknown, MapProviderInfo {}}}; | ||||
| 
 | ||||
| MapProvider GetMapProvider(const std::string& name) | ||||
| { | ||||
|    auto result = | ||||
|       std::find_if(mapProviderName_.cbegin(), | ||||
|                    mapProviderName_.cend(), | ||||
|                    [&](const std::pair<MapProvider, std::string>& pair) -> bool | ||||
|                    { return boost::iequals(pair.second, name); }); | ||||
| 
 | ||||
|    if (result != mapProviderName_.cend()) | ||||
|    { | ||||
|       return result->first; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       return MapProvider::Unknown; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| std::string GetMapProviderName(MapProvider mapProvider) | ||||
| { | ||||
|    return mapProviderName_.at(mapProvider); | ||||
| } | ||||
| 
 | ||||
| std::string GetMapProviderApiKey(MapProvider mapProvider) | ||||
| { | ||||
|    switch (mapProvider) | ||||
|    { | ||||
|    case MapProvider::Mapbox: | ||||
|       return manager::SettingsManager::general_settings() | ||||
|          .mapbox_api_key() | ||||
|          .GetValue(); | ||||
| 
 | ||||
|    case MapProvider::MapTiler: | ||||
|       return manager::SettingsManager::general_settings() | ||||
|          .maptiler_api_key() | ||||
|          .GetValue(); | ||||
| 
 | ||||
|    default: | ||||
|       return "?"; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| const MapProviderInfo& GetMapProviderInfo(MapProvider mapProvider) | ||||
| { | ||||
|    return mapProviderInfo_.at(mapProvider); | ||||
| } | ||||
| 
 | ||||
| } // namespace map
 | ||||
| } // namespace qt
 | ||||
| } // namespace scwx
 | ||||
							
								
								
									
										48
									
								
								scwx-qt/source/scwx/qt/map/map_provider.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								scwx-qt/source/scwx/qt/map/map_provider.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,48 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <scwx/util/iterator.hpp> | ||||
| 
 | ||||
| #include <string> | ||||
| 
 | ||||
| #include <QMapLibreGL/settings.hpp> | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
| namespace qt | ||||
| { | ||||
| namespace map | ||||
| { | ||||
| 
 | ||||
| enum class MapProvider | ||||
| { | ||||
|    Mapbox, | ||||
|    MapTiler, | ||||
|    Unknown | ||||
| }; | ||||
| typedef scwx::util:: | ||||
|    Iterator<MapProvider, MapProvider::Mapbox, MapProvider::MapTiler> | ||||
|       MapProviderIterator; | ||||
| 
 | ||||
| struct MapStyle | ||||
| { | ||||
|    std::string              name_; | ||||
|    std::string              url_; | ||||
|    std::vector<std::string> drawBelow_; | ||||
| }; | ||||
| 
 | ||||
| struct MapProviderInfo | ||||
| { | ||||
|    MapProvider                             mapProvider_ {MapProvider::Unknown}; | ||||
|    std::string                             cacheDbName_ {}; | ||||
|    QMapLibreGL::Settings::SettingsTemplate settingsTemplate_ {}; | ||||
|    std::vector<MapStyle>                   mapStyles_ {}; | ||||
| }; | ||||
| 
 | ||||
| MapProvider            GetMapProvider(const std::string& name); | ||||
| std::string            GetMapProviderName(MapProvider mapProvider); | ||||
| std::string            GetMapProviderApiKey(MapProvider mapProvider); | ||||
| const MapProviderInfo& GetMapProviderInfo(MapProvider mapProvider); | ||||
| 
 | ||||
| } // namespace map
 | ||||
| } // namespace qt
 | ||||
| } // namespace scwx
 | ||||
|  | @ -5,6 +5,7 @@ | |||
| #include <scwx/qt/map/alert_layer.hpp> | ||||
| #include <scwx/qt/map/color_table_layer.hpp> | ||||
| #include <scwx/qt/map/layer_wrapper.hpp> | ||||
| #include <scwx/qt/map/map_provider.hpp> | ||||
| #include <scwx/qt/map/overlay_layer.hpp> | ||||
| #include <scwx/qt/map/radar_product_layer.hpp> | ||||
| #include <scwx/qt/map/radar_range_layer.hpp> | ||||
|  | @ -15,6 +16,8 @@ | |||
| #include <scwx/util/threads.hpp> | ||||
| #include <scwx/util/time.hpp> | ||||
| 
 | ||||
| #include <regex> | ||||
| 
 | ||||
| #include <backends/imgui_impl_opengl3.h> | ||||
| #include <backends/imgui_impl_qt.hpp> | ||||
| #include <boost/uuid/random_generator.hpp> | ||||
|  | @ -39,20 +42,6 @@ namespace map | |||
| static const std::string logPrefix_ = "scwx::qt::map::map_widget"; | ||||
| static const auto        logger_    = scwx::util::Logger::Create(logPrefix_); | ||||
| 
 | ||||
| typedef std::pair<std::string, std::string> MapStyle; | ||||
| 
 | ||||
| // clang-format off
 | ||||
| static const MapStyle streets          { "mapbox://styles/mapbox/streets-v11",           "Streets"}; | ||||
| static const MapStyle outdoors         { "mapbox://styles/mapbox/outdoors-v11",          "Outdoors"}; | ||||
| static const MapStyle light            { "mapbox://styles/mapbox/light-v10",             "Light"}; | ||||
| static const MapStyle dark             { "mapbox://styles/mapbox/dark-v10",              "Dark" }; | ||||
| static const MapStyle satellite        { "mapbox://styles/mapbox/satellite-v9",          "Satellite" }; | ||||
| static const MapStyle satelliteStreets { "mapbox://styles/mapbox/satellite-streets-v11", "Satellite Streets" }; | ||||
| // clang-format on
 | ||||
| 
 | ||||
| static const std::array<MapStyle, 6> mapboxStyles_ = { | ||||
|    {streets, outdoors, light, dark, satellite, satelliteStreets}}; | ||||
| 
 | ||||
| class MapWidgetImpl : public QObject | ||||
| { | ||||
|    Q_OBJECT | ||||
|  | @ -77,6 +66,7 @@ public: | |||
|        selectedTime_ {}, | ||||
|        lastPos_(), | ||||
|        currentStyleIndex_ {0}, | ||||
|        currentStyle_ {nullptr}, | ||||
|        frameDraws_(0), | ||||
|        prevLatitude_ {0.0}, | ||||
|        prevLongitude_ {0.0}, | ||||
|  | @ -84,9 +74,10 @@ public: | |||
|        prevBearing_ {0.0}, | ||||
|        prevPitch_ {0.0} | ||||
|    { | ||||
|       SetRadarSite(scwx::qt::manager::SettingsManager::general_settings() | ||||
|                       .default_radar_site() | ||||
|                       .GetValue()); | ||||
|       auto& generalSettings = | ||||
|          scwx::qt::manager::SettingsManager::general_settings(); | ||||
| 
 | ||||
|       SetRadarSite(generalSettings.default_radar_site().GetValue()); | ||||
| 
 | ||||
|       // Create ImGui Context
 | ||||
|       static size_t currentMapId_ {0u}; | ||||
|  | @ -97,6 +88,9 @@ public: | |||
|       // Initialize ImGui Qt backend
 | ||||
|       ImGui_ImplQt_Init(); | ||||
|       ImGui_ImplQt_RegisterWidget(widget_); | ||||
| 
 | ||||
|       // Set Map Provider Details
 | ||||
|       mapProvider_ = GetMapProvider(generalSettings.map_provider().GetValue()); | ||||
|    } | ||||
| 
 | ||||
|    ~MapWidgetImpl() | ||||
|  | @ -134,6 +128,7 @@ public: | |||
|    std::shared_ptr<MapContext> context_; | ||||
| 
 | ||||
|    MapWidget*                        widget_; | ||||
|    MapProvider                       mapProvider_; | ||||
|    QMapLibreGL::Settings             settings_; | ||||
|    std::shared_ptr<QMapLibreGL::Map> map_; | ||||
|    std::list<std::string>            layerList_; | ||||
|  | @ -156,8 +151,9 @@ public: | |||
|    common::Level2Product                 selectedLevel2Product_; | ||||
|    std::chrono::system_clock::time_point selectedTime_; | ||||
| 
 | ||||
|    QPointF lastPos_; | ||||
|    uint8_t currentStyleIndex_; | ||||
|    QPointF         lastPos_; | ||||
|    std::size_t     currentStyleIndex_; | ||||
|    const MapStyle* currentStyle_; | ||||
| 
 | ||||
|    uint64_t frameDraws_; | ||||
| 
 | ||||
|  | @ -268,6 +264,18 @@ std::vector<std::string> MapWidget::GetLevel3Products() | |||
|    } | ||||
| } | ||||
| 
 | ||||
| std::string MapWidget::GetMapStyle() const | ||||
| { | ||||
|    if (p->currentStyle_ != nullptr) | ||||
|    { | ||||
|       return p->currentStyle_->name_; | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       return "?"; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| common::RadarProductGroup MapWidget::GetRadarProductGroup() const | ||||
| { | ||||
|    auto radarProductView = p->context_->radar_product_view(); | ||||
|  | @ -538,6 +546,32 @@ void MapWidget::SetMapParameters( | |||
|    } | ||||
| } | ||||
| 
 | ||||
| void MapWidget::SetMapStyle(const std::string& styleName) | ||||
| { | ||||
|    const auto& mapProviderInfo = GetMapProviderInfo(p->mapProvider_); | ||||
|    auto&       styles          = mapProviderInfo.mapStyles_; | ||||
| 
 | ||||
|    for (size_t i = 0u; i < styles.size(); ++i) | ||||
|    { | ||||
|       if (styles[i].name_ == styleName) | ||||
|       { | ||||
|          p->currentStyleIndex_ = i; | ||||
|          p->currentStyle_      = &styles[i]; | ||||
| 
 | ||||
|          logger_->debug("Updating style: {}", styles[i].name_); | ||||
| 
 | ||||
|          p->map_->setStyleUrl(styles[i].url_.c_str()); | ||||
| 
 | ||||
|          if (++p->currentStyleIndex_ == styles.size()) | ||||
|          { | ||||
|             p->currentStyleIndex_ = 0; | ||||
|          } | ||||
| 
 | ||||
|          break; | ||||
|       } | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| qreal MapWidget::pixelRatio() | ||||
| { | ||||
|    return devicePixelRatioF(); | ||||
|  | @ -545,16 +579,21 @@ qreal MapWidget::pixelRatio() | |||
| 
 | ||||
| void MapWidget::changeStyle() | ||||
| { | ||||
|    auto& styles = mapboxStyles_; | ||||
|    const auto& mapProviderInfo = GetMapProviderInfo(p->mapProvider_); | ||||
|    auto&       styles          = mapProviderInfo.mapStyles_; | ||||
| 
 | ||||
|    p->map_->setStyleUrl(styles[p->currentStyleIndex_].first.c_str()); | ||||
|    setWindowTitle(QString("Mapbox GL: ") + | ||||
|                   styles[p->currentStyleIndex_].second.c_str()); | ||||
|    p->currentStyle_ = &styles[p->currentStyleIndex_]; | ||||
| 
 | ||||
|    logger_->debug("Updating style: {}", styles[p->currentStyleIndex_].name_); | ||||
| 
 | ||||
|    p->map_->setStyleUrl(styles[p->currentStyleIndex_].url_.c_str()); | ||||
| 
 | ||||
|    if (++p->currentStyleIndex_ == styles.size()) | ||||
|    { | ||||
|       p->currentStyleIndex_ = 0; | ||||
|    } | ||||
| 
 | ||||
|    emit MapStyleChanged(p->currentStyle_->name_); | ||||
| } | ||||
| 
 | ||||
| void MapWidget::AddLayers() | ||||
|  | @ -578,15 +617,26 @@ void MapWidget::AddLayers() | |||
|       std::shared_ptr<config::RadarSite> radarSite = | ||||
|          p->radarProductManager_->radar_site(); | ||||
| 
 | ||||
|       const auto& mapStyle = *p->currentStyle_; | ||||
| 
 | ||||
|       std::string before = "ferry"; | ||||
| 
 | ||||
|       for (const QString& layer : p->map_->layerIds()) | ||||
|       for (const QString& qlayer : p->map_->layerIds()) | ||||
|       { | ||||
|          // Draw below tunnels, ferries and roads
 | ||||
|          if (layer.startsWith("tunnel") || layer.startsWith("ferry") || | ||||
|              layer.startsWith("road")) | ||||
|          const std::string layer = qlayer.toStdString(); | ||||
| 
 | ||||
|          // Draw below layers defined in map style
 | ||||
|          auto it = std::find_if(mapStyle.drawBelow_.cbegin(), | ||||
|                                 mapStyle.drawBelow_.cend(), | ||||
|                                 [&layer](const std::string& styleLayer) -> bool | ||||
|                                 { | ||||
|                                    std::regex re {styleLayer}; | ||||
|                                    return std::regex_match(layer, re); | ||||
|                                 }); | ||||
| 
 | ||||
|          if (it != mapStyle.drawBelow_.cend()) | ||||
|          { | ||||
|             before = layer.toStdString(); | ||||
|             before = layer; | ||||
|             break; | ||||
|          } | ||||
|       } | ||||
|  | @ -740,16 +790,8 @@ void MapWidget::initializeGL() | |||
|                              p->prevBearing_, | ||||
|                              p->prevPitch_); | ||||
| 
 | ||||
|    QString styleUrl = qgetenv("MAPBOX_STYLE_URL"); | ||||
|    if (styleUrl.isEmpty()) | ||||
|    { | ||||
|       changeStyle(); | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       p->map_->setStyleUrl(styleUrl); | ||||
|       setWindowTitle(QString("Mapbox GL: ") + styleUrl); | ||||
|    } | ||||
|    // Update style
 | ||||
|    changeStyle(); | ||||
| 
 | ||||
|    connect(p->map_.get(), | ||||
|            &QMapLibreGL::Map::mapChanged, | ||||
|  |  | |||
|  | @ -38,6 +38,7 @@ public: | |||
|    float                              GetElevation() const; | ||||
|    std::vector<float>                 GetElevationCuts() const; | ||||
|    std::vector<std::string>           GetLevel3Products(); | ||||
|    std::string                        GetMapStyle() const; | ||||
|    common::RadarProductGroup          GetRadarProductGroup() const; | ||||
|    std::string                        GetRadarProductName() const; | ||||
|    std::shared_ptr<config::RadarSite> GetRadarSite() const; | ||||
|  | @ -98,6 +99,7 @@ public: | |||
|                          double zoom, | ||||
|                          double bearing, | ||||
|                          double pitch); | ||||
|    void SetMapStyle(const std::string& styleName); | ||||
| 
 | ||||
| private: | ||||
|    void  changeStyle(); | ||||
|  | @ -129,6 +131,7 @@ signals: | |||
|                              double zoom, | ||||
|                              double bearing, | ||||
|                              double pitch); | ||||
|    void MapStyleChanged(const std::string& styleName); | ||||
|    void RadarSweepUpdated(); | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -359,12 +359,14 @@ void RadarProductLayer::UpdateColorTable() | |||
| static glm::vec2 | ||||
| LatLongToScreenCoordinate(const QMapLibreGL::Coordinate& coordinate) | ||||
| { | ||||
|    static constexpr double RAD2DEG_D = 180.0 / M_PI; | ||||
| 
 | ||||
|    double latitude = std::clamp( | ||||
|       coordinate.first, -mbgl::util::LATITUDE_MAX, mbgl::util::LATITUDE_MAX); | ||||
|    glm::vec2 screen { | ||||
|       mbgl::util::LONGITUDE_MAX + coordinate.second, | ||||
|       -(mbgl::util::LONGITUDE_MAX - | ||||
|         mbgl::util::RAD2DEG_D * | ||||
|         RAD2DEG_D * | ||||
|            std::log(std::tan(M_PI / 4.0 + | ||||
|                              latitude * M_PI / mbgl::util::DEGREES_MAX)))}; | ||||
|    return screen; | ||||
|  |  | |||
|  | @ -1,5 +1,10 @@ | |||
| #include <scwx/qt/settings/general_settings.hpp> | ||||
| #include <scwx/qt/settings/settings_container.hpp> | ||||
| #include <scwx/qt/map/map_provider.hpp> | ||||
| 
 | ||||
| #include <array> | ||||
| 
 | ||||
| #include <boost/algorithm/string.hpp> | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
|  | @ -20,7 +25,9 @@ public: | |||
|       fontSizes_.SetDefault({16}); | ||||
|       gridWidth_.SetDefault(1); | ||||
|       gridHeight_.SetDefault(1); | ||||
|       mapProvider_.SetDefault("maptiler"); | ||||
|       mapboxApiKey_.SetDefault("?"); | ||||
|       maptilerApiKey_.SetDefault("?"); | ||||
|       updateNotificationsEnabled_.SetDefault(true); | ||||
| 
 | ||||
|       fontSizes_.SetElementMinimum(1); | ||||
|  | @ -31,8 +38,29 @@ public: | |||
|       gridWidth_.SetMaximum(2); | ||||
|       gridHeight_.SetMinimum(1); | ||||
|       gridHeight_.SetMaximum(2); | ||||
|       mapProvider_.SetValidator( | ||||
|          [](const std::string& value) | ||||
|          { | ||||
|             for (map::MapProvider mapProvider : map::MapProviderIterator()) | ||||
|             { | ||||
|                // If the value is equal to a lower case map provider name
 | ||||
|                std::string mapProviderName = | ||||
|                   map::GetMapProviderName(mapProvider); | ||||
|                boost::to_lower(mapProviderName); | ||||
|                if (value == mapProviderName) | ||||
|                { | ||||
|                   // Regard as a match, valid
 | ||||
|                   return true; | ||||
|                } | ||||
|             } | ||||
| 
 | ||||
|             // No match found, invalid
 | ||||
|             return false; | ||||
|          }); | ||||
|       mapboxApiKey_.SetValidator([](const std::string& value) | ||||
|                                  { return !value.empty(); }); | ||||
|       maptilerApiKey_.SetValidator([](const std::string& value) | ||||
|                                    { return !value.empty(); }); | ||||
|    } | ||||
| 
 | ||||
|    ~GeneralSettingsImpl() {} | ||||
|  | @ -42,7 +70,9 @@ public: | |||
|    SettingsContainer<std::vector<std::int64_t>> fontSizes_ {"font_sizes"}; | ||||
|    SettingsVariable<std::int64_t>               gridWidth_ {"grid_width"}; | ||||
|    SettingsVariable<std::int64_t>               gridHeight_ {"grid_height"}; | ||||
|    SettingsVariable<std::string>                mapProvider_ {"map_provider"}; | ||||
|    SettingsVariable<std::string> mapboxApiKey_ {"mapbox_api_key"}; | ||||
|    SettingsVariable<std::string> maptilerApiKey_ {"maptiler_api_key"}; | ||||
|    SettingsVariable<bool> updateNotificationsEnabled_ {"update_notifications"}; | ||||
| }; | ||||
| 
 | ||||
|  | @ -54,7 +84,9 @@ GeneralSettings::GeneralSettings() : | |||
|                       &p->fontSizes_, | ||||
|                       &p->gridWidth_, | ||||
|                       &p->gridHeight_, | ||||
|                       &p->mapProvider_, | ||||
|                       &p->mapboxApiKey_, | ||||
|                       &p->maptilerApiKey_, | ||||
|                       &p->updateNotificationsEnabled_}); | ||||
|    SetDefaults(); | ||||
| } | ||||
|  | @ -90,11 +122,21 @@ SettingsVariable<std::int64_t>& GeneralSettings::grid_width() const | |||
|    return p->gridWidth_; | ||||
| } | ||||
| 
 | ||||
| SettingsVariable<std::string>& GeneralSettings::map_provider() const | ||||
| { | ||||
|    return p->mapProvider_; | ||||
| } | ||||
| 
 | ||||
| SettingsVariable<std::string>& GeneralSettings::mapbox_api_key() const | ||||
| { | ||||
|    return p->mapboxApiKey_; | ||||
| } | ||||
| 
 | ||||
| SettingsVariable<std::string>& GeneralSettings::maptiler_api_key() const | ||||
| { | ||||
|    return p->maptilerApiKey_; | ||||
| } | ||||
| 
 | ||||
| SettingsVariable<bool>& GeneralSettings::update_notifications_enabled() const | ||||
| { | ||||
|    return p->updateNotificationsEnabled_; | ||||
|  | @ -107,7 +149,9 @@ bool operator==(const GeneralSettings& lhs, const GeneralSettings& rhs) | |||
|            lhs.p->fontSizes_ == rhs.p->fontSizes_ && | ||||
|            lhs.p->gridWidth_ == rhs.p->gridWidth_ && | ||||
|            lhs.p->gridHeight_ == rhs.p->gridHeight_ && | ||||
|            lhs.p->mapProvider_ == rhs.p->mapProvider_ && | ||||
|            lhs.p->mapboxApiKey_ == rhs.p->mapboxApiKey_ && | ||||
|            lhs.p->maptilerApiKey_ == rhs.p->maptilerApiKey_ && | ||||
|            lhs.p->updateNotificationsEnabled_ == | ||||
|               rhs.p->updateNotificationsEnabled_); | ||||
| } | ||||
|  |  | |||
|  | @ -32,7 +32,9 @@ public: | |||
|    SettingsContainer<std::vector<std::int64_t>>& font_sizes() const; | ||||
|    SettingsVariable<std::int64_t>&               grid_height() const; | ||||
|    SettingsVariable<std::int64_t>&               grid_width() const; | ||||
|    SettingsVariable<std::string>&                map_provider() const; | ||||
|    SettingsVariable<std::string>&                mapbox_api_key() const; | ||||
|    SettingsVariable<std::string>&                maptiler_api_key() const; | ||||
|    SettingsVariable<bool>& update_notifications_enabled() const; | ||||
| 
 | ||||
|    friend bool operator==(const GeneralSettings& lhs, | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ | |||
| #include <scwx/common/color_table.hpp> | ||||
| #include <scwx/qt/config/radar_site.hpp> | ||||
| #include <scwx/qt/manager/settings_manager.hpp> | ||||
| #include <scwx/qt/map/map_provider.hpp> | ||||
| #include <scwx/qt/settings/settings_interface.hpp> | ||||
| #include <scwx/qt/ui/radar_site_dialog.hpp> | ||||
| #include <scwx/qt/util/color.hpp> | ||||
|  | @ -12,6 +13,7 @@ | |||
| #include <scwx/util/logger.hpp> | ||||
| #include <scwx/util/threads.hpp> | ||||
| 
 | ||||
| #include <boost/algorithm/string.hpp> | ||||
| #include <fmt/format.h> | ||||
| #include <QColorDialog> | ||||
| #include <QFileDialog> | ||||
|  | @ -83,7 +85,9 @@ public: | |||
|           &fontSizes_, | ||||
|           &gridWidth_, | ||||
|           &gridHeight_, | ||||
|           &mapProvider_, | ||||
|           &mapboxApiKey_, | ||||
|           &mapTilerApiKey_, | ||||
|           &updateNotificationsEnabled_, | ||||
|           &debugEnabled_}} | ||||
|    { | ||||
|  | @ -137,7 +141,9 @@ public: | |||
|    settings::SettingsInterface<std::vector<std::int64_t>> fontSizes_ {}; | ||||
|    settings::SettingsInterface<std::int64_t>              gridWidth_ {}; | ||||
|    settings::SettingsInterface<std::int64_t>              gridHeight_ {}; | ||||
|    settings::SettingsInterface<std::string>               mapProvider_ {}; | ||||
|    settings::SettingsInterface<std::string>               mapboxApiKey_ {}; | ||||
|    settings::SettingsInterface<std::string>               mapTilerApiKey_ {}; | ||||
|    settings::SettingsInterface<bool> updateNotificationsEnabled_ {}; | ||||
|    settings::SettingsInterface<bool> debugEnabled_ {}; | ||||
| 
 | ||||
|  | @ -313,10 +319,46 @@ void SettingsDialogImpl::SetupGeneralTab() | |||
|    gridHeight_.SetEditWidget(self_->ui->gridHeightSpinBox); | ||||
|    gridHeight_.SetResetButton(self_->ui->resetGridHeightButton); | ||||
| 
 | ||||
|    for (const auto& mapProvider : map::MapProviderIterator()) | ||||
|    { | ||||
|       self_->ui->mapProviderComboBox->addItem( | ||||
|          QString::fromStdString(map::GetMapProviderName(mapProvider))); | ||||
|    } | ||||
| 
 | ||||
|    mapProvider_.SetSettingsVariable(generalSettings.map_provider()); | ||||
|    mapProvider_.SetMapFromValueFunction( | ||||
|       [](const std::string& text) -> std::string | ||||
|       { | ||||
|          for (map::MapProvider mapProvider : map::MapProviderIterator()) | ||||
|          { | ||||
|             if (boost::iequals(text, map::GetMapProviderName(mapProvider))) | ||||
|             { | ||||
|                // Return map provider label
 | ||||
|                return GetMapProviderName(mapProvider); | ||||
|             } | ||||
|          } | ||||
| 
 | ||||
|          // Map provider label not found, return unknown
 | ||||
|          return "?"; | ||||
|       }); | ||||
|    mapProvider_.SetMapToValueFunction( | ||||
|       [](std::string text) -> std::string | ||||
|       { | ||||
|          // Convert label to lower case and return
 | ||||
|          boost::to_lower(text); | ||||
|          return text; | ||||
|       }); | ||||
|    mapProvider_.SetEditWidget(self_->ui->mapProviderComboBox); | ||||
|    mapProvider_.SetResetButton(self_->ui->resetMapProviderButton); | ||||
| 
 | ||||
|    mapboxApiKey_.SetSettingsVariable(generalSettings.mapbox_api_key()); | ||||
|    mapboxApiKey_.SetEditWidget(self_->ui->mapboxApiKeyLineEdit); | ||||
|    mapboxApiKey_.SetResetButton(self_->ui->resetMapboxApiKeyButton); | ||||
| 
 | ||||
|    mapTilerApiKey_.SetSettingsVariable(generalSettings.maptiler_api_key()); | ||||
|    mapTilerApiKey_.SetEditWidget(self_->ui->mapTilerApiKeyLineEdit); | ||||
|    mapTilerApiKey_.SetResetButton(self_->ui->resetMapTilerApiKeyButton); | ||||
| 
 | ||||
|    updateNotificationsEnabled_.SetSettingsVariable( | ||||
|       generalSettings.update_notifications_enabled()); | ||||
|    updateNotificationsEnabled_.SetEditWidget( | ||||
|  |  | |||
|  | @ -109,43 +109,14 @@ | |||
|              <property name="bottomMargin"> | ||||
|               <number>0</number> | ||||
|              </property> | ||||
|              <item row="0" column="0"> | ||||
|               <widget class="QLabel" name="label"> | ||||
|                <property name="text"> | ||||
|                 <string>Default Radar Site</string> | ||||
|                </property> | ||||
|               </widget> | ||||
|              <item row="1" column="2"> | ||||
|               <widget class="QLineEdit" name="fontSizesLineEdit"/> | ||||
|              </item> | ||||
|              <item row="3" column="0"> | ||||
|               <widget class="QLabel" name="label_3"> | ||||
|                <property name="text"> | ||||
|                 <string>Grid Height</string> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="3" column="2"> | ||||
|               <widget class="QSpinBox" name="gridHeightSpinBox"/> | ||||
|              </item> | ||||
|              <item row="2" column="4"> | ||||
|               <widget class="QToolButton" name="resetGridWidthButton"> | ||||
|              <item row="0" column="3"> | ||||
|               <widget class="QToolButton" name="radarSiteSelectButton"> | ||||
|                <property name="text"> | ||||
|                 <string>...</string> | ||||
|                </property> | ||||
|                <property name="icon"> | ||||
|                 <iconset resource="../../../../scwx-qt.qrc"> | ||||
|                  <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="4" column="4"> | ||||
|               <widget class="QToolButton" name="resetMapboxApiKeyButton"> | ||||
|                <property name="text"> | ||||
|                 <string>...</string> | ||||
|                </property> | ||||
|                <property name="icon"> | ||||
|                 <iconset resource="../../../../scwx-qt.qrc"> | ||||
|                  <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="0" column="4"> | ||||
|  | @ -159,11 +130,41 @@ | |||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="2" column="2"> | ||||
|               <widget class="QSpinBox" name="gridWidthSpinBox"/> | ||||
|              <item row="2" column="4"> | ||||
|               <widget class="QToolButton" name="resetGridWidthButton"> | ||||
|                <property name="text"> | ||||
|                 <string>...</string> | ||||
|                </property> | ||||
|                <property name="icon"> | ||||
|                 <iconset resource="../../../../scwx-qt.qrc"> | ||||
|                  <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="0" column="2"> | ||||
|               <widget class="QComboBox" name="radarSiteComboBox"/> | ||||
|              <item row="6" column="4"> | ||||
|               <widget class="QToolButton" name="resetMapTilerApiKeyButton"> | ||||
|                <property name="text"> | ||||
|                 <string>...</string> | ||||
|                </property> | ||||
|                <property name="icon"> | ||||
|                 <iconset resource="../../../../scwx-qt.qrc"> | ||||
|                  <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="1" column="0"> | ||||
|               <widget class="QLabel" name="label_5"> | ||||
|                <property name="text"> | ||||
|                 <string>Font Sizes</string> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="6" column="0"> | ||||
|               <widget class="QLabel" name="label_6"> | ||||
|                <property name="text"> | ||||
|                 <string>MapTiler API Key</string> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="3" column="4"> | ||||
|               <widget class="QToolButton" name="resetGridHeightButton"> | ||||
|  | @ -176,13 +177,13 @@ | |||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="1" column="2"> | ||||
|               <widget class="QLineEdit" name="fontSizesLineEdit"/> | ||||
|              <item row="2" column="2"> | ||||
|               <widget class="QSpinBox" name="gridWidthSpinBox"/> | ||||
|              </item> | ||||
|              <item row="4" column="0"> | ||||
|               <widget class="QLabel" name="label_4"> | ||||
|              <item row="3" column="0"> | ||||
|               <widget class="QLabel" name="label_3"> | ||||
|                <property name="text"> | ||||
|                 <string>Mapbox API Key</string> | ||||
|                 <string>Grid Height</string> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|  | @ -197,16 +198,36 @@ | |||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="4" column="2"> | ||||
|               <widget class="QLineEdit" name="mapboxApiKeyLineEdit"/> | ||||
|              <item row="6" column="2"> | ||||
|               <widget class="QLineEdit" name="mapTilerApiKeyLineEdit"/> | ||||
|              </item> | ||||
|              <item row="1" column="0"> | ||||
|               <widget class="QLabel" name="label_5"> | ||||
|              <item row="0" column="2"> | ||||
|               <widget class="QComboBox" name="radarSiteComboBox"/> | ||||
|              </item> | ||||
|              <item row="5" column="4"> | ||||
|               <widget class="QToolButton" name="resetMapboxApiKeyButton"> | ||||
|                <property name="text"> | ||||
|                 <string>Font Sizes</string> | ||||
|                 <string>...</string> | ||||
|                </property> | ||||
|                <property name="icon"> | ||||
|                 <iconset resource="../../../../scwx-qt.qrc"> | ||||
|                  <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="5" column="2"> | ||||
|               <widget class="QLineEdit" name="mapboxApiKeyLineEdit"/> | ||||
|              </item> | ||||
|              <item row="5" column="0"> | ||||
|               <widget class="QLabel" name="label_4"> | ||||
|                <property name="text"> | ||||
|                 <string>Mapbox API Key</string> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="3" column="2"> | ||||
|               <widget class="QSpinBox" name="gridHeightSpinBox"/> | ||||
|              </item> | ||||
|              <item row="2" column="0"> | ||||
|               <widget class="QLabel" name="label_2"> | ||||
|                <property name="text"> | ||||
|  | @ -214,11 +235,32 @@ | |||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="0" column="3"> | ||||
|               <widget class="QToolButton" name="radarSiteSelectButton"> | ||||
|              <item row="0" column="0"> | ||||
|               <widget class="QLabel" name="label"> | ||||
|                <property name="text"> | ||||
|                 <string>Default Radar Site</string> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="4" column="0"> | ||||
|               <widget class="QLabel" name="label_7"> | ||||
|                <property name="text"> | ||||
|                 <string>Map Provider</string> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|              <item row="4" column="2"> | ||||
|               <widget class="QComboBox" name="mapProviderComboBox"/> | ||||
|              </item> | ||||
|              <item row="4" column="4"> | ||||
|               <widget class="QToolButton" name="resetMapProviderButton"> | ||||
|                <property name="text"> | ||||
|                 <string>...</string> | ||||
|                </property> | ||||
|                <property name="icon"> | ||||
|                 <iconset resource="../../../../scwx-qt.qrc"> | ||||
|                  <normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> | ||||
|                </property> | ||||
|               </widget> | ||||
|              </item> | ||||
|             </layout> | ||||
|  |  | |||
|  | @ -1 +1 @@ | |||
| Subproject commit 5b5073780fe44e55eb4c33799036683b28ffd2bd | ||||
| Subproject commit 938b0240e51aff37530adc679a11d0e65e5e96ce | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat