diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 8e513ee6..23c924b5 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -88,6 +88,8 @@ set(SRC_MAP source/scwx/qt/map/color_table_layer.cpp source/scwx/qt/map/overlay_layer.cpp source/scwx/qt/map/radar_product_layer.cpp source/scwx/qt/map/radar_range_layer.cpp) +set(HDR_REQUEST source/scwx/qt/request/nexrad_file_request.hpp) +set(SRC_REQUEST source/scwx/qt/request/nexrad_file_request.cpp) set(HDR_SETTINGS source/scwx/qt/settings/general_settings.hpp source/scwx/qt/settings/palette_settings.hpp) set(SRC_SETTINGS source/scwx/qt/settings/general_settings.cpp @@ -135,6 +137,8 @@ set(PROJECT_SOURCES ${HDR_MAIN} ${UI_MAIN} ${HDR_MAP} ${SRC_MAP} + ${HDR_REQUEST} + ${SRC_REQUEST} ${HDR_SETTINGS} ${SRC_SETTINGS} ${HDR_UI} @@ -162,6 +166,8 @@ source_group("Source Files\\manager" FILES ${SRC_MANAGER}) source_group("UI Files\\main" FILES ${UI_MAIN}) source_group("Header Files\\map" FILES ${HDR_MAP}) source_group("Source Files\\map" FILES ${SRC_MAP}) +source_group("Header Files\\request" FILES ${HDR_REQUEST}) +source_group("Source Files\\request" FILES ${SRC_REQUEST}) source_group("Header Files\\settings" FILES ${HDR_SETTINGS}) source_group("Source Files\\settings" FILES ${SRC_SETTINGS}) source_group("Header Files\\ui" FILES ${HDR_UI}) diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index 3f5e2dd1..c21b59a3 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -223,10 +223,18 @@ void MainWindow::on_actionOpen_triggered() { BOOST_LOG_TRIVIAL(info) << "Selected: " << file.toStdString(); - manager::RadarProductManager::LoadFile( - file.toStdString(), - [=](std::shared_ptr nexradFile) + std::shared_ptr request = + std::make_shared(); + + connect( + request.get(), + &request::NexradFileRequest::RequestComplete, + this, + [=](std::shared_ptr request) { + std::shared_ptr nexradFile = + request->nexrad_file(); + std::shared_ptr level2File = std::dynamic_pointer_cast(nexradFile); std::shared_ptr level3File = @@ -250,8 +258,9 @@ void MainWindow::on_actionOpen_triggered() messageBox->setAttribute(Qt::WA_DeleteOnClose); messageBox->open(); } - }, - this); + }); + + manager::RadarProductManager::LoadFile(file.toStdString(), request); }); dialog->open(); diff --git a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp index 39afc216..2cb623b6 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -28,9 +28,8 @@ static const std::string logPrefix_ = typedef std::function()> CreateNexradFileFunction; -static void LoadNexradFile(CreateNexradFileFunction load, - FileLoadCompleteFunction onComplete, - QObject* context); +static void LoadNexradFile(CreateNexradFileFunction load, + std::shared_ptr request); static constexpr uint32_t NUM_RADIAL_GATES_0_5_DEGREE = common::MAX_0_5_DEGREE_RADIALS * common::MAX_DATA_MOMENT_GATES; @@ -210,33 +209,29 @@ void RadarProductManager::Initialize() p->initialized_ = true; } -void RadarProductManager::LoadData(std::istream& is, - FileLoadCompleteFunction onComplete, - QObject* context) +void RadarProductManager::LoadData( + std::istream& is, std::shared_ptr request) { LoadNexradFile( [=, &is]() -> std::shared_ptr { return wsr88d::NexradFileFactory::Create(is); }, - onComplete, - context); + request); } -void RadarProductManager::LoadFile(const std::string& filename, - FileLoadCompleteFunction onComplete, - QObject* context) +void RadarProductManager::LoadFile( + const std::string& filename, + std::shared_ptr request) { LoadNexradFile( [=]() -> std::shared_ptr { return wsr88d::NexradFileFactory::Create(filename); }, - onComplete, - context); + request); } -static void LoadNexradFile(CreateNexradFileFunction load, - FileLoadCompleteFunction onComplete, - QObject* context) +static void LoadNexradFile(CreateNexradFileFunction load, + std::shared_ptr request) { scwx::util::async( [=]() @@ -249,17 +244,10 @@ static void LoadNexradFile(CreateNexradFileFunction load, lock.unlock(); - if (onComplete != nullptr) + if (request != nullptr) { - if (context == nullptr) - { - onComplete(nexradFile); - } - else - { - QMetaObject::invokeMethod(context, - [=]() { onComplete(nexradFile); }); - } + request->set_nexrad_file(nexradFile); + emit request->RequestComplete(request); } }); } diff --git a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp index bc81c60b..9b6ce6f4 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -17,9 +18,6 @@ namespace qt namespace manager { -typedef std::function)> - FileLoadCompleteFunction; - class RadarProductManagerImpl; class RadarProductManager : public QObject @@ -49,12 +47,12 @@ public: static std::shared_ptr Instance(const std::string& radarSite); - static void LoadData(std::istream& is, - FileLoadCompleteFunction onComplete, - QObject* context = nullptr); - static void LoadFile(const std::string& filename, - FileLoadCompleteFunction onComplete, - QObject* context = nullptr); + static void + LoadData(std::istream& is, + std::shared_ptr request = nullptr); + static void + LoadFile(const std::string& filename, + std::shared_ptr request = nullptr); signals: void Level2DataLoaded(); diff --git a/scwx-qt/source/scwx/qt/request/nexrad_file_request.cpp b/scwx-qt/source/scwx/qt/request/nexrad_file_request.cpp new file mode 100644 index 00000000..a01124df --- /dev/null +++ b/scwx-qt/source/scwx/qt/request/nexrad_file_request.cpp @@ -0,0 +1,44 @@ +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace request +{ + +static const std::string logPrefix_ = + "[scwx::qt::request::nexrad_file_request] "; + +class NexradFileRequestImpl +{ +public: + explicit NexradFileRequestImpl() : nexradFile_ {nullptr} {} + + ~NexradFileRequestImpl() {} + + std::shared_ptr nexradFile_; +}; + +NexradFileRequest::NexradFileRequest() : + p(std::make_unique()) +{ +} +NexradFileRequest::~NexradFileRequest() = default; + +std::shared_ptr NexradFileRequest::nexrad_file() const +{ + return p->nexradFile_; +} + +void NexradFileRequest::set_nexrad_file( + std::shared_ptr nexradFile) +{ + p->nexradFile_ = nexradFile; +} + +} // namespace request +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/request/nexrad_file_request.hpp b/scwx-qt/source/scwx/qt/request/nexrad_file_request.hpp new file mode 100644 index 00000000..2681676e --- /dev/null +++ b/scwx-qt/source/scwx/qt/request/nexrad_file_request.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include + +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace request +{ + +class NexradFileRequestImpl; + +class NexradFileRequest : public QObject +{ + Q_OBJECT + +public: + explicit NexradFileRequest(); + ~NexradFileRequest(); + + std::shared_ptr nexrad_file() const; + + void set_nexrad_file(std::shared_ptr nexradFile); + +private: + std::unique_ptr p; + +signals: + void RequestComplete(std::shared_ptr request); +}; + +} // namespace request +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/ts/scwx_en_US.ts b/scwx-qt/ts/scwx_en_US.ts index d10a47b8..b05543cc 100644 --- a/scwx-qt/ts/scwx_en_US.ts +++ b/scwx-qt/ts/scwx_en_US.ts @@ -102,7 +102,7 @@ scwx::qt::main::MainWindow - + Unrecognized NEXRAD Product: