mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 06:30:05 +00:00 
			
		
		
		
	Add favorite selection to radar toolbox
This commit is contained in:
		
							parent
							
								
									9d673af291
								
							
						
					
					
						commit
						436a3e0a9f
					
				
					 5 changed files with 205 additions and 53 deletions
				
			
		|  | @ -12,6 +12,7 @@ | ||||||
| #include <scwx/qt/manager/update_manager.hpp> | #include <scwx/qt/manager/update_manager.hpp> | ||||||
| #include <scwx/qt/map/map_provider.hpp> | #include <scwx/qt/map/map_provider.hpp> | ||||||
| #include <scwx/qt/map/map_widget.hpp> | #include <scwx/qt/map/map_widget.hpp> | ||||||
|  | #include <scwx/qt/model/radar_site_model.hpp> | ||||||
| #include <scwx/qt/settings/general_settings.hpp> | #include <scwx/qt/settings/general_settings.hpp> | ||||||
| #include <scwx/qt/settings/map_settings.hpp> | #include <scwx/qt/settings/map_settings.hpp> | ||||||
| #include <scwx/qt/settings/ui_settings.hpp> | #include <scwx/qt/settings/ui_settings.hpp> | ||||||
|  | @ -187,6 +188,11 @@ public: | ||||||
|    std::shared_ptr<manager::TimelineManager>  timelineManager_; |    std::shared_ptr<manager::TimelineManager>  timelineManager_; | ||||||
|    std::shared_ptr<manager::UpdateManager>    updateManager_; |    std::shared_ptr<manager::UpdateManager>    updateManager_; | ||||||
| 
 | 
 | ||||||
|  |    std::shared_ptr<model::RadarSiteModel> radarSiteModel_ { | ||||||
|  |       model::RadarSiteModel::Instance()}; | ||||||
|  |    std::map<std::string, std::shared_ptr<QAction>> radarSiteFavoriteActions_ {}; | ||||||
|  |    QMenu* radarSiteFavoriteMenu_ {nullptr}; | ||||||
|  | 
 | ||||||
|    std::vector<map::MapWidget*> maps_; |    std::vector<map::MapWidget*> maps_; | ||||||
|    std::vector<float>           elevationCuts_; |    std::vector<float>           elevationCuts_; | ||||||
| 
 | 
 | ||||||
|  | @ -213,9 +219,14 @@ MainWindow::MainWindow(QWidget* parent) : | ||||||
|    // Assign the bottom left corner to the left dock widget
 |    // Assign the bottom left corner to the left dock widget
 | ||||||
|    setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); |    setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); | ||||||
| 
 | 
 | ||||||
|  |    // Configure Radar Site Box
 | ||||||
|    ui->vcpLabel->setVisible(false); |    ui->vcpLabel->setVisible(false); | ||||||
|    ui->vcpValueLabel->setVisible(false); |    ui->vcpValueLabel->setVisible(false); | ||||||
|    ui->vcpDescriptionLabel->setVisible(false); |    ui->vcpDescriptionLabel->setVisible(false); | ||||||
|  |    ui->radarSiteFavoriteButton->setVisible(false); | ||||||
|  | 
 | ||||||
|  |    p->radarSiteFavoriteMenu_ = new QMenu(this); | ||||||
|  |    ui->radarSiteFavoriteButton->setMenu(p->radarSiteFavoriteMenu_); | ||||||
| 
 | 
 | ||||||
|    // Configure Alert Dock
 |    // Configure Alert Dock
 | ||||||
|    p->alertDockWidget_ = new ui::AlertDockWidget(this); |    p->alertDockWidget_ = new ui::AlertDockWidget(this); | ||||||
|  | @ -944,6 +955,58 @@ void MainWindowImpl::ConnectOtherSignals() | ||||||
| 
 | 
 | ||||||
|               UpdateRadarSite(); |               UpdateRadarSite(); | ||||||
|            }); |            }); | ||||||
|  |    connect( | ||||||
|  |       radarSiteModel_.get(), | ||||||
|  |       &model::RadarSiteModel::FavoriteToggled, | ||||||
|  |       [this](const std::string& siteId, bool isFavorite) | ||||||
|  |       { | ||||||
|  |          if (isFavorite && !radarSiteFavoriteActions_.contains(siteId)) | ||||||
|  |          { | ||||||
|  |             auto        radarSite = config::RadarSite::Get(siteId); | ||||||
|  |             std::string actionText = | ||||||
|  |                fmt::format("{}: {}", siteId, radarSite->location_name()); | ||||||
|  | 
 | ||||||
|  |             auto pair = radarSiteFavoriteActions_.emplace( | ||||||
|  |                siteId, | ||||||
|  |                std::make_shared<QAction>(QString::fromStdString(actionText))); | ||||||
|  |             auto& action = pair.first->second; | ||||||
|  | 
 | ||||||
|  |             QAction* before = nullptr; | ||||||
|  | 
 | ||||||
|  |             // If the radar site is not at the end
 | ||||||
|  |             if (pair.first != std::prev(radarSiteFavoriteActions_.cend())) | ||||||
|  |             { | ||||||
|  |                // Insert before the next entry in the list
 | ||||||
|  |                before = std::next(pair.first)->second.get(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             radarSiteFavoriteMenu_->insertAction(before, action.get()); | ||||||
|  | 
 | ||||||
|  |             connect(action.get(), | ||||||
|  |                     &QAction::triggered, | ||||||
|  |                     [this, siteId]() | ||||||
|  |                     { | ||||||
|  |                        for (map::MapWidget* map : maps_) | ||||||
|  |                        { | ||||||
|  |                           map->SelectRadarSite(siteId); | ||||||
|  |                        } | ||||||
|  | 
 | ||||||
|  |                        UpdateRadarSite(); | ||||||
|  |                     }); | ||||||
|  |          } | ||||||
|  |          else if (!isFavorite) | ||||||
|  |          { | ||||||
|  |             auto entry = radarSiteFavoriteActions_.find(siteId); | ||||||
|  |             if (entry != radarSiteFavoriteActions_.cend()) | ||||||
|  |             { | ||||||
|  |                radarSiteFavoriteMenu_->removeAction(entry->second.get()); | ||||||
|  |                radarSiteFavoriteActions_.erase(entry); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  | 
 | ||||||
|  |          mainWindow_->ui->radarSiteFavoriteButton->setVisible( | ||||||
|  |             !radarSiteFavoriteActions_.empty()); | ||||||
|  |       }); | ||||||
|    connect(updateManager_.get(), |    connect(updateManager_.get(), | ||||||
|            &manager::UpdateManager::UpdateAvailable, |            &manager::UpdateManager::UpdateAvailable, | ||||||
|            this, |            this, | ||||||
|  |  | ||||||
|  | @ -141,8 +141,8 @@ | ||||||
|          <rect> |          <rect> | ||||||
|           <x>0</x> |           <x>0</x> | ||||||
|           <y>0</y> |           <y>0</y> | ||||||
|           <width>187</width> |           <width>193</width> | ||||||
|           <height>702</height> |           <height>688</height> | ||||||
|          </rect> |          </rect> | ||||||
|         </property> |         </property> | ||||||
|         <layout class="QVBoxLayout" name="verticalLayout_6"> |         <layout class="QVBoxLayout" name="verticalLayout_6"> | ||||||
|  | @ -166,23 +166,28 @@ | ||||||
|            <property name="frameShadow"> |            <property name="frameShadow"> | ||||||
|             <enum>QFrame::Raised</enum> |             <enum>QFrame::Raised</enum> | ||||||
|            </property> |            </property> | ||||||
|            <layout class="QGridLayout" name="gridLayout" columnstretch="0,1,0,0,0"> |            <layout class="QGridLayout" name="gridLayout" columnstretch="0,0,0,0,0,0"> | ||||||
|             <item row="0" column="1"> |             <item row="0" column="2"> | ||||||
|              <widget class="QLabel" name="radarSiteValueLabel"> |              <widget class="QLabel" name="radarSiteValueLabel"> | ||||||
|  |               <property name="sizePolicy"> | ||||||
|  |                <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> | ||||||
|  |                 <horstretch>0</horstretch> | ||||||
|  |                 <verstretch>0</verstretch> | ||||||
|  |                </sizepolicy> | ||||||
|  |               </property> | ||||||
|               <property name="text"> |               <property name="text"> | ||||||
|                <string notr="true">KLSX</string> |                <string notr="true">KLSX</string> | ||||||
|               </property> |               </property> | ||||||
|              </widget> |              </widget> | ||||||
|             </item> |             </item> | ||||||
|             <item row="0" column="0"> |             <item row="3" column="0" colspan="2"> | ||||||
|              <widget class="QLabel" name="radarSiteLabel"> |  | ||||||
|               <property name="text"> |  | ||||||
|                <string>Radar Site</string> |  | ||||||
|               </property> |  | ||||||
|              </widget> |  | ||||||
|             </item> |  | ||||||
|             <item row="2" column="0"> |  | ||||||
|              <widget class="QLabel" name="vcpLabel"> |              <widget class="QLabel" name="vcpLabel"> | ||||||
|  |               <property name="sizePolicy"> | ||||||
|  |                <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> | ||||||
|  |                 <horstretch>0</horstretch> | ||||||
|  |                 <verstretch>0</verstretch> | ||||||
|  |                </sizepolicy> | ||||||
|  |               </property> | ||||||
|               <property name="toolTip"> |               <property name="toolTip"> | ||||||
|                <string>Volume Coverage Pattern</string> |                <string>Volume Coverage Pattern</string> | ||||||
|               </property> |               </property> | ||||||
|  | @ -191,20 +196,28 @@ | ||||||
|               </property> |               </property> | ||||||
|              </widget> |              </widget> | ||||||
|             </item> |             </item> | ||||||
|             <item row="0" column="3"> |  | ||||||
|              <widget class="QToolButton" name="radarSiteSelectButton"> |  | ||||||
|               <property name="maximumSize"> |  | ||||||
|                <size> |  | ||||||
|                 <width>16777215</width> |  | ||||||
|                 <height>13</height> |  | ||||||
|                </size> |  | ||||||
|               </property> |  | ||||||
|               <property name="text"> |  | ||||||
|                <string>...</string> |  | ||||||
|               </property> |  | ||||||
|              </widget> |  | ||||||
|             </item> |  | ||||||
|             <item row="0" column="4"> |             <item row="0" column="4"> | ||||||
|  |              <widget class="QFrame" name="frame"> | ||||||
|  |               <property name="frameShape"> | ||||||
|  |                <enum>QFrame::NoFrame</enum> | ||||||
|  |               </property> | ||||||
|  |               <property name="frameShadow"> | ||||||
|  |                <enum>QFrame::Raised</enum> | ||||||
|  |               </property> | ||||||
|  |               <layout class="QHBoxLayout" name="horizontalLayout"> | ||||||
|  |                <property name="leftMargin"> | ||||||
|  |                 <number>0</number> | ||||||
|  |                </property> | ||||||
|  |                <property name="topMargin"> | ||||||
|  |                 <number>0</number> | ||||||
|  |                </property> | ||||||
|  |                <property name="rightMargin"> | ||||||
|  |                 <number>0</number> | ||||||
|  |                </property> | ||||||
|  |                <property name="bottomMargin"> | ||||||
|  |                 <number>0</number> | ||||||
|  |                </property> | ||||||
|  |                <item> | ||||||
|                 <widget class="QToolButton" name="radarSiteHomeButton"> |                 <widget class="QToolButton" name="radarSiteHomeButton"> | ||||||
|                  <property name="maximumSize"> |                  <property name="maximumSize"> | ||||||
|                   <size> |                   <size> | ||||||
|  | @ -221,27 +234,70 @@ | ||||||
|                  </property> |                  </property> | ||||||
|                 </widget> |                 </widget> | ||||||
|                </item> |                </item> | ||||||
|             <item row="1" column="1" colspan="4"> |                <item> | ||||||
|  |                 <widget class="QToolButton" name="radarSiteFavoriteButton"> | ||||||
|  |                  <property name="maximumSize"> | ||||||
|  |                   <size> | ||||||
|  |                    <width>16777215</width> | ||||||
|  |                    <height>13</height> | ||||||
|  |                   </size> | ||||||
|  |                  </property> | ||||||
|  |                  <property name="text"> | ||||||
|  |                   <string>...</string> | ||||||
|  |                  </property> | ||||||
|  |                  <property name="icon"> | ||||||
|  |                   <iconset resource="../../../../scwx-qt.qrc"> | ||||||
|  |                    <normaloff>:/res/icons/font-awesome-6/star-solid.svg</normaloff>:/res/icons/font-awesome-6/star-solid.svg</iconset> | ||||||
|  |                  </property> | ||||||
|  |                  <property name="popupMode"> | ||||||
|  |                   <enum>QToolButton::InstantPopup</enum> | ||||||
|  |                  </property> | ||||||
|  |                 </widget> | ||||||
|  |                </item> | ||||||
|  |               </layout> | ||||||
|  |              </widget> | ||||||
|  |             </item> | ||||||
|  |             <item row="0" column="0" colspan="2"> | ||||||
|  |              <widget class="QLabel" name="radarSiteLabel"> | ||||||
|  |               <property name="text"> | ||||||
|  |                <string>Radar Site</string> | ||||||
|  |               </property> | ||||||
|  |              </widget> | ||||||
|  |             </item> | ||||||
|  |             <item row="1" column="2" colspan="3"> | ||||||
|              <widget class="QLabel" name="radarLocationLabel"> |              <widget class="QLabel" name="radarLocationLabel"> | ||||||
|               <property name="text"> |               <property name="text"> | ||||||
|                <string notr="true">St. Louis, MO</string> |                <string notr="true">St. Louis, MO</string> | ||||||
|               </property> |               </property> | ||||||
|              </widget> |              </widget> | ||||||
|             </item> |             </item> | ||||||
|             <item row="2" column="1" colspan="4"> |             <item row="3" column="2" colspan="3"> | ||||||
|              <widget class="QLabel" name="vcpValueLabel"> |              <widget class="QLabel" name="vcpValueLabel"> | ||||||
|               <property name="text"> |               <property name="text"> | ||||||
|                <string notr="true">35</string> |                <string notr="true">35</string> | ||||||
|               </property> |               </property> | ||||||
|              </widget> |              </widget> | ||||||
|             </item> |             </item> | ||||||
|             <item row="3" column="1" colspan="4"> |             <item row="4" column="2" colspan="3"> | ||||||
|              <widget class="QLabel" name="vcpDescriptionLabel"> |              <widget class="QLabel" name="vcpDescriptionLabel"> | ||||||
|               <property name="text"> |               <property name="text"> | ||||||
|                <string>Clear Air Mode</string> |                <string>Clear Air Mode</string> | ||||||
|               </property> |               </property> | ||||||
|              </widget> |              </widget> | ||||||
|             </item> |             </item> | ||||||
|  |             <item row="0" column="3"> | ||||||
|  |              <widget class="QToolButton" name="radarSiteSelectButton"> | ||||||
|  |               <property name="maximumSize"> | ||||||
|  |                <size> | ||||||
|  |                 <width>16777215</width> | ||||||
|  |                 <height>13</height> | ||||||
|  |                </size> | ||||||
|  |               </property> | ||||||
|  |               <property name="text"> | ||||||
|  |                <string>...</string> | ||||||
|  |               </property> | ||||||
|  |              </widget> | ||||||
|  |             </item> | ||||||
|            </layout> |            </layout> | ||||||
|           </widget> |           </widget> | ||||||
|          </item> |          </item> | ||||||
|  |  | ||||||
|  | @ -224,7 +224,13 @@ void RadarSiteModel::ToggleFavorite(int row) | ||||||
| { | { | ||||||
|    if (row >= 0 && row < p->favorites_.size()) |    if (row >= 0 && row < p->favorites_.size()) | ||||||
|    { |    { | ||||||
|       p->favorites_.at(row) = !p->favorites_.at(row); |       bool isFavorite       = !p->favorites_.at(row); | ||||||
|  |       p->favorites_.at(row) = isFavorite; | ||||||
|  | 
 | ||||||
|  |       QModelIndex index = createIndex(row, static_cast<int>(Column::Favorite)); | ||||||
|  |       Q_EMIT dataChanged(index, index); | ||||||
|  | 
 | ||||||
|  |       Q_EMIT FavoriteToggled(p->radarSites_.at(row)->id(), isFavorite); | ||||||
|    } |    } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -248,6 +254,25 @@ RadarSiteModelImpl::RadarSiteModelImpl() : | ||||||
|    } |    } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | std::shared_ptr<RadarSiteModel> RadarSiteModel::Instance() | ||||||
|  | { | ||||||
|  |    static std::weak_ptr<RadarSiteModel> radarSiteModelReference_ {}; | ||||||
|  |    static std::mutex                    instanceMutex_ {}; | ||||||
|  | 
 | ||||||
|  |    std::unique_lock lock(instanceMutex_); | ||||||
|  | 
 | ||||||
|  |    std::shared_ptr<RadarSiteModel> radarSiteModel = | ||||||
|  |       radarSiteModelReference_.lock(); | ||||||
|  | 
 | ||||||
|  |    if (radarSiteModel == nullptr) | ||||||
|  |    { | ||||||
|  |       radarSiteModel           = std::make_shared<RadarSiteModel>(); | ||||||
|  |       radarSiteModelReference_ = radarSiteModel; | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    return radarSiteModel; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace model
 | } // namespace model
 | ||||||
| } // namespace qt
 | } // namespace qt
 | ||||||
| } // namespace scwx
 | } // namespace scwx
 | ||||||
|  |  | ||||||
|  | @ -15,6 +15,8 @@ class RadarSiteModelImpl; | ||||||
| 
 | 
 | ||||||
| class RadarSiteModel : public QAbstractTableModel | class RadarSiteModel : public QAbstractTableModel | ||||||
| { | { | ||||||
|  |    Q_OBJECT | ||||||
|  | 
 | ||||||
| public: | public: | ||||||
|    enum class Column : int |    enum class Column : int | ||||||
|    { |    { | ||||||
|  | @ -44,6 +46,11 @@ public: | ||||||
|    void HandleMapUpdate(double latitude, double longitude); |    void HandleMapUpdate(double latitude, double longitude); | ||||||
|    void ToggleFavorite(int row); |    void ToggleFavorite(int row); | ||||||
| 
 | 
 | ||||||
|  |    static std::shared_ptr<RadarSiteModel> Instance(); | ||||||
|  | 
 | ||||||
|  | signals: | ||||||
|  |    void FavoriteToggled(const std::string& siteId, bool isFavorite); | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
|    std::unique_ptr<RadarSiteModelImpl> p; |    std::unique_ptr<RadarSiteModelImpl> p; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -24,13 +24,13 @@ class RadarSiteDialogImpl | ||||||
| public: | public: | ||||||
|    explicit RadarSiteDialogImpl(RadarSiteDialog* self) : |    explicit RadarSiteDialogImpl(RadarSiteDialog* self) : | ||||||
|        self_ {self}, |        self_ {self}, | ||||||
|        radarSiteModel_ {new model::RadarSiteModel(self_)}, |        radarSiteModel_ {model::RadarSiteModel::Instance()}, | ||||||
|        proxyModel_ {new QSortFilterProxyModel(self_)}, |        proxyModel_ {new QSortFilterProxyModel(self_)}, | ||||||
|        mapPosition_ {}, |        mapPosition_ {}, | ||||||
|        mapUpdateDeferred_ {false}, |        mapUpdateDeferred_ {false}, | ||||||
|        selectedRadarSite_ {"?"} |        selectedRadarSite_ {"?"} | ||||||
|    { |    { | ||||||
|       proxyModel_->setSourceModel(radarSiteModel_); |       proxyModel_->setSourceModel(radarSiteModel_.get()); | ||||||
|       proxyModel_->setSortRole(types::SortRole); |       proxyModel_->setSortRole(types::SortRole); | ||||||
|       proxyModel_->setFilterCaseSensitivity(Qt::CaseInsensitive); |       proxyModel_->setFilterCaseSensitivity(Qt::CaseInsensitive); | ||||||
|       proxyModel_->setFilterKeyColumn(-1); |       proxyModel_->setFilterKeyColumn(-1); | ||||||
|  | @ -38,9 +38,10 @@ public: | ||||||
|    ~RadarSiteDialogImpl() = default; |    ~RadarSiteDialogImpl() = default; | ||||||
| 
 | 
 | ||||||
|    RadarSiteDialog*       self_; |    RadarSiteDialog*       self_; | ||||||
|    model::RadarSiteModel* radarSiteModel_; |  | ||||||
|    QSortFilterProxyModel* proxyModel_; |    QSortFilterProxyModel* proxyModel_; | ||||||
| 
 | 
 | ||||||
|  |    std::shared_ptr<model::RadarSiteModel> radarSiteModel_; | ||||||
|  | 
 | ||||||
|    scwx::common::Coordinate mapPosition_; |    scwx::common::Coordinate mapPosition_; | ||||||
|    bool                     mapUpdateDeferred_; |    bool                     mapUpdateDeferred_; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat