mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-30 17:00:05 +00:00 
			
		
		
		
	Use signals/slots to prevent QObject lifetime issues
This commit is contained in:
		
							parent
							
								
									9b90189566
								
							
						
					
					
						commit
						a47460842b
					
				
					 7 changed files with 125 additions and 41 deletions
				
			
		|  | @ -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}) | ||||
|  |  | |||
|  | @ -223,10 +223,18 @@ void MainWindow::on_actionOpen_triggered() | |||
|       { | ||||
|          BOOST_LOG_TRIVIAL(info) << "Selected: " << file.toStdString(); | ||||
| 
 | ||||
|          manager::RadarProductManager::LoadFile( | ||||
|             file.toStdString(), | ||||
|             [=](std::shared_ptr<wsr88d::NexradFile> nexradFile) | ||||
|          std::shared_ptr<request::NexradFileRequest> request = | ||||
|             std::make_shared<request::NexradFileRequest>(); | ||||
| 
 | ||||
|          connect( | ||||
|             request.get(), | ||||
|             &request::NexradFileRequest::RequestComplete, | ||||
|             this, | ||||
|             [=](std::shared_ptr<request::NexradFileRequest> request) | ||||
|             { | ||||
|                std::shared_ptr<wsr88d::NexradFile> nexradFile = | ||||
|                   request->nexrad_file(); | ||||
| 
 | ||||
|                std::shared_ptr<wsr88d::Ar2vFile> level2File = | ||||
|                   std::dynamic_pointer_cast<wsr88d::Ar2vFile>(nexradFile); | ||||
|                std::shared_ptr<wsr88d::Level3File> 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(); | ||||
|  |  | |||
|  | @ -28,9 +28,8 @@ static const std::string logPrefix_ = | |||
| typedef std::function<std::shared_ptr<wsr88d::NexradFile>()> | ||||
|    CreateNexradFileFunction; | ||||
| 
 | ||||
| static void LoadNexradFile(CreateNexradFileFunction load, | ||||
|                            FileLoadCompleteFunction onComplete, | ||||
|                            QObject*                 context); | ||||
| static void LoadNexradFile(CreateNexradFileFunction                    load, | ||||
|                            std::shared_ptr<request::NexradFileRequest> 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::NexradFileRequest> request) | ||||
| { | ||||
|    LoadNexradFile( | ||||
|       [=, &is]() -> std::shared_ptr<wsr88d::NexradFile> { | ||||
|          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::NexradFileRequest> request) | ||||
| { | ||||
|    LoadNexradFile( | ||||
|       [=]() -> std::shared_ptr<wsr88d::NexradFile> { | ||||
|          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::NexradFileRequest> 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); | ||||
|          } | ||||
|       }); | ||||
| } | ||||
|  |  | |||
|  | @ -2,6 +2,7 @@ | |||
| 
 | ||||
| #include <scwx/common/types.hpp> | ||||
| #include <scwx/qt/config/radar_site.hpp> | ||||
| #include <scwx/qt/request/nexrad_file_request.hpp> | ||||
| #include <scwx/wsr88d/ar2v_file.hpp> | ||||
| #include <scwx/wsr88d/level3_file.hpp> | ||||
| 
 | ||||
|  | @ -17,9 +18,6 @@ namespace qt | |||
| namespace manager | ||||
| { | ||||
| 
 | ||||
| typedef std::function<void(std::shared_ptr<wsr88d::NexradFile>)> | ||||
|    FileLoadCompleteFunction; | ||||
| 
 | ||||
| class RadarProductManagerImpl; | ||||
| 
 | ||||
| class RadarProductManager : public QObject | ||||
|  | @ -49,12 +47,12 @@ public: | |||
|    static std::shared_ptr<RadarProductManager> | ||||
|    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::NexradFileRequest> request = nullptr); | ||||
|    static void | ||||
|    LoadFile(const std::string&                          filename, | ||||
|             std::shared_ptr<request::NexradFileRequest> request = nullptr); | ||||
| 
 | ||||
| signals: | ||||
|    void Level2DataLoaded(); | ||||
|  |  | |||
							
								
								
									
										44
									
								
								scwx-qt/source/scwx/qt/request/nexrad_file_request.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								scwx-qt/source/scwx/qt/request/nexrad_file_request.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,44 @@ | |||
| #include <scwx/qt/request/nexrad_file_request.hpp> | ||||
| 
 | ||||
| #include <boost/log/trivial.hpp> | ||||
| 
 | ||||
| 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<wsr88d::NexradFile> nexradFile_; | ||||
| }; | ||||
| 
 | ||||
| NexradFileRequest::NexradFileRequest() : | ||||
|     p(std::make_unique<NexradFileRequestImpl>()) | ||||
| { | ||||
| } | ||||
| NexradFileRequest::~NexradFileRequest() = default; | ||||
| 
 | ||||
| std::shared_ptr<wsr88d::NexradFile> NexradFileRequest::nexrad_file() const | ||||
| { | ||||
|    return p->nexradFile_; | ||||
| } | ||||
| 
 | ||||
| void NexradFileRequest::set_nexrad_file( | ||||
|    std::shared_ptr<wsr88d::NexradFile> nexradFile) | ||||
| { | ||||
|    p->nexradFile_ = nexradFile; | ||||
| } | ||||
| 
 | ||||
| } // namespace request
 | ||||
| } // namespace qt
 | ||||
| } // namespace scwx
 | ||||
							
								
								
									
										39
									
								
								scwx-qt/source/scwx/qt/request/nexrad_file_request.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								scwx-qt/source/scwx/qt/request/nexrad_file_request.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,39 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <scwx/wsr88d/nexrad_file.hpp> | ||||
| 
 | ||||
| #include <memory> | ||||
| 
 | ||||
| #include <QObject> | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
| namespace qt | ||||
| { | ||||
| namespace request | ||||
| { | ||||
| 
 | ||||
| class NexradFileRequestImpl; | ||||
| 
 | ||||
| class NexradFileRequest : public QObject | ||||
| { | ||||
|    Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|    explicit NexradFileRequest(); | ||||
|    ~NexradFileRequest(); | ||||
| 
 | ||||
|    std::shared_ptr<wsr88d::NexradFile> nexrad_file() const; | ||||
| 
 | ||||
|    void set_nexrad_file(std::shared_ptr<wsr88d::NexradFile> nexradFile); | ||||
| 
 | ||||
| private: | ||||
|    std::unique_ptr<NexradFileRequestImpl> p; | ||||
| 
 | ||||
| signals: | ||||
|    void RequestComplete(std::shared_ptr<NexradFileRequest> request); | ||||
| }; | ||||
| 
 | ||||
| } // namespace request
 | ||||
| } // namespace qt
 | ||||
| } // namespace scwx
 | ||||
|  | @ -102,7 +102,7 @@ | |||
| <context> | ||||
|     <name>scwx::qt::main::MainWindow</name> | ||||
|     <message> | ||||
|         <location filename="../source/scwx/qt/main/main_window.cpp" line="248"/> | ||||
|         <location filename="../source/scwx/qt/main/main_window.cpp" line="256"/> | ||||
|         <source>Unrecognized NEXRAD Product:</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat