diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index be8a16b5..4b2d99ad 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -1,11 +1,13 @@ #include "main_window.hpp" #include "./ui_main_window.h" +#include #include #include #include #include +#include #include #include @@ -26,23 +28,30 @@ class MainWindowImpl : public QObject public: explicit MainWindowImpl(MainWindow* mainWindow) : mainWindow_ {mainWindow}, - map_ {nullptr}, + settings_ {}, + activeMap_ {nullptr}, + maps_ {}, elevationCuts_ {}, resizeElevationButtons_ {false} { + settings_.setCacheDatabasePath("/tmp/mbgl-cache.db"); + settings_.setCacheDatabaseMaximumSize(20 * 1024 * 1024); } ~MainWindowImpl() = default; + void ConfigureMapLayout(); void InitializeConnections(); void SelectElevation(map::MapWidget* mapWidget, float elevation); void SelectRadarProduct(common::Level2Product product); void UpdateElevationSelection(float elevation); void UpdateRadarProductSettings(map::MapWidget* mapWidget); - MainWindow* mainWindow_; - map::MapWidget* map_; + MainWindow* mainWindow_; + QMapboxGLSettings settings_; + map::MapWidget* activeMap_; - std::vector elevationCuts_; + std::vector maps_; + std::vector elevationCuts_; bool resizeElevationButtons_; }; @@ -54,13 +63,7 @@ MainWindow::MainWindow(QWidget* parent) : { ui->setupUi(this); - QMapboxGLSettings settings; - settings.setCacheDatabasePath("/tmp/mbgl-cache.db"); - settings.setCacheDatabaseMaximumSize(20 * 1024 * 1024); - - p->map_ = new map::MapWidget(settings); - - ui->centralwidget->layout()->addWidget(p->map_); + p->ConfigureMapLayout(); // Add Level 2 Products QLayout* level2Layout = new ui::FlowLayout(); @@ -162,13 +165,64 @@ void MainWindow::on_actionExit_triggered() close(); } +void MainWindowImpl::ConfigureMapLayout() +{ + auto generalSettings = manager::SettingsManager::general_settings(); + + const int64_t gridWidth = generalSettings->grid_width(); + const int64_t gridHeight = generalSettings->grid_height(); + const int64_t mapCount = gridWidth * gridHeight; + + size_t mapIndex = 0; + + QSplitter* vs = new QSplitter(Qt::Vertical); + vs->setHandleWidth(1); + + maps_.resize(mapCount); + + auto MoveSplitter = [=](int pos, int index) { + QSplitter* s = dynamic_cast(sender()); + + if (s != nullptr) + { + auto sizes = s->sizes(); + for (QSplitter* hs : vs->findChildren()) + { + hs->setSizes(sizes); + } + } + }; + + for (int64_t y = 0; y < gridHeight; y++) + { + QSplitter* hs = new QSplitter(vs); + hs->setHandleWidth(1); + + for (int64_t x = 0; x < gridWidth; x++, mapIndex++) + { + if (maps_.at(mapIndex) == nullptr) + { + maps_[mapIndex] = new map::MapWidget(settings_); + } + + hs->addWidget(maps_[mapIndex]); + } + + connect(hs, &QSplitter::splitterMoved, this, MoveSplitter); + } + + mainWindow_->ui->centralwidget->layout()->addWidget(vs); + + activeMap_ = maps_.at(0); +} + void MainWindowImpl::InitializeConnections() { connect( - map_, + activeMap_, &map::MapWidget::RadarSweepUpdated, this, - [this]() { UpdateRadarProductSettings(map_); }, + [this]() { UpdateRadarProductSettings(activeMap_); }, Qt::QueuedConnection); } @@ -200,7 +254,7 @@ void MainWindowImpl::SelectRadarProduct(common::Level2Product product) } } - map_->SelectRadarProduct(product); + activeMap_->SelectRadarProduct(product); } void MainWindowImpl::UpdateElevationSelection(float elevation) diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 0926d7c6..2ff8b743 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -50,6 +50,7 @@ public: radarProductView_ {nullptr}, overlayLayer_ {nullptr}, lastPos_(), + currentStyleIndex_ {0}, frameDraws_(0) { } @@ -68,6 +69,7 @@ public: std::shared_ptr overlayLayer_; QPointF lastPos_; + uint8_t currentStyleIndex_; uint64_t frameDraws_; }; @@ -156,22 +158,25 @@ qreal MapWidget::pixelRatio() void MapWidget::changeStyle() { - static uint8_t currentStyleIndex = 0; - auto& styles = mapboxStyles_; - p->map_->setStyleUrl(styles[currentStyleIndex].first.c_str()); + p->map_->setStyleUrl(styles[p->currentStyleIndex_].first.c_str()); setWindowTitle(QString("Mapbox GL: ") + - styles[currentStyleIndex].second.c_str()); + styles[p->currentStyleIndex_].second.c_str()); - if (++currentStyleIndex == styles.size()) + if (++p->currentStyleIndex_ == styles.size()) { - currentStyleIndex = 0; + p->currentStyleIndex_ = 0; } } void MapWidget::AddLayers() { + if (p->radarProductView_ == nullptr) + { + return; + } + // TODO: Improve this if (p->map_->layerExists("radar")) {