mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 13:00:05 +00:00 
			
		
		
		
	Adding common edit widget and reset button processing to settings variable
This commit is contained in:
		
							parent
							
								
									463acd6b94
								
							
						
					
					
						commit
						ce5092c068
					
				
					 3 changed files with 169 additions and 10 deletions
				
			
		|  | @ -7,6 +7,10 @@ | ||||||
| 
 | 
 | ||||||
| #include <boost/json.hpp> | #include <boost/json.hpp> | ||||||
| #include <fmt/ostream.h> | #include <fmt/ostream.h> | ||||||
|  | #include <QAbstractButton> | ||||||
|  | #include <QCoreApplication> | ||||||
|  | #include <QLineEdit> | ||||||
|  | #include <QWidget> | ||||||
| 
 | 
 | ||||||
| namespace scwx | namespace scwx | ||||||
| { | { | ||||||
|  | @ -22,16 +26,28 @@ template<class T> | ||||||
| class SettingsVariable<T>::Impl | class SettingsVariable<T>::Impl | ||||||
| { | { | ||||||
| public: | public: | ||||||
|    explicit Impl() {} |    explicit Impl() | ||||||
|  |    { | ||||||
|  |       context_->moveToThread(QCoreApplication::instance()->thread()); | ||||||
|  |    } | ||||||
| 
 | 
 | ||||||
|    ~Impl() {} |    ~Impl() {} | ||||||
| 
 | 
 | ||||||
|  |    void UpdateEditWidget(); | ||||||
|  |    void UpdateResetButton(); | ||||||
|  | 
 | ||||||
|    T                             value_ {}; |    T                             value_ {}; | ||||||
|    T                             default_ {}; |    T                             default_ {}; | ||||||
|    std::optional<T>              staged_ {}; |    std::optional<T>              staged_ {}; | ||||||
|    std::optional<T>              minimum_ {}; |    std::optional<T>              minimum_ {}; | ||||||
|    std::optional<T>              maximum_ {}; |    std::optional<T>              maximum_ {}; | ||||||
|    std::function<bool(const T&)> validator_ {nullptr}; |    std::function<bool(const T&)> validator_ {nullptr}; | ||||||
|  | 
 | ||||||
|  |    bool stagedValid_ {true}; | ||||||
|  | 
 | ||||||
|  |    std::unique_ptr<QObject> context_ {std::make_unique<QObject>()}; | ||||||
|  |    QWidget*                 editWidget_ {nullptr}; | ||||||
|  |    QAbstractButton*         resetButton_ {nullptr}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| template<class T> | template<class T> | ||||||
|  | @ -128,15 +144,19 @@ void SettingsVariable<T>::SetValueToDefault() | ||||||
| template<class T> | template<class T> | ||||||
| bool SettingsVariable<T>::StageValue(const T& value) | bool SettingsVariable<T>::StageValue(const T& value) | ||||||
| { | { | ||||||
|    bool validated = false; |  | ||||||
| 
 |  | ||||||
|    if (Validate(value)) |    if (Validate(value)) | ||||||
|    { |    { | ||||||
|       p->staged_      = value; |       p->staged_      = value; | ||||||
|       validated  = true; |       p->stagedValid_ = true; | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       p->stagedValid_ = false; | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    return validated; |    p->UpdateResetButton(); | ||||||
|  | 
 | ||||||
|  |    return p->stagedValid_; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| template<class T> | template<class T> | ||||||
|  | @ -146,9 +166,20 @@ void SettingsVariable<T>::Commit() | ||||||
|    { |    { | ||||||
|       p->value_ = std::move(*p->staged_); |       p->value_ = std::move(*p->staged_); | ||||||
|       p->staged_.reset(); |       p->staged_.reset(); | ||||||
|  |       p->stagedValid_ = true; | ||||||
|    } |    } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | template<class T> | ||||||
|  | void SettingsVariable<T>::Reset() | ||||||
|  | { | ||||||
|  |    p->staged_.reset(); | ||||||
|  |    p->stagedValid_ = true; | ||||||
|  | 
 | ||||||
|  |    p->UpdateEditWidget(); | ||||||
|  |    p->UpdateResetButton(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| template<class T> | template<class T> | ||||||
| T SettingsVariable<T>::GetDefault() const | T SettingsVariable<T>::GetDefault() const | ||||||
| { | { | ||||||
|  | @ -226,6 +257,93 @@ void SettingsVariable<T>::WriteValue(boost::json::object& json) const | ||||||
|    json[name()] = boost::json::value_from<T&>(p->value_); |    json[name()] = boost::json::value_from<T&>(p->value_); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | template<class T> | ||||||
|  | void SettingsVariable<T>::SetEditWidget(QWidget* widget) | ||||||
|  | { | ||||||
|  |    p->editWidget_ = widget; | ||||||
|  | 
 | ||||||
|  |    if (QLineEdit* lineEdit = dynamic_cast<QLineEdit*>(widget)) | ||||||
|  |    { | ||||||
|  |       if constexpr (std::is_same_v<T, std::string>) | ||||||
|  |       { | ||||||
|  |          // If the line is edited (not programatically changed), stage the new
 | ||||||
|  |          // value
 | ||||||
|  |          QObject::connect(lineEdit, | ||||||
|  |                           &QLineEdit::textEdited, | ||||||
|  |                           p->context_.get(), | ||||||
|  |                           [this](const QString& text) | ||||||
|  |                           { | ||||||
|  |                              // Attempt to stage the value
 | ||||||
|  |                              StageValue(text.toStdString()); | ||||||
|  |                           }); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    p->UpdateEditWidget(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template<class T> | ||||||
|  | void SettingsVariable<T>::SetResetButton(QAbstractButton* button) | ||||||
|  | { | ||||||
|  |    p->resetButton_ = button; | ||||||
|  | 
 | ||||||
|  |    QObject::connect(p->resetButton_, | ||||||
|  |                     &QAbstractButton::clicked, | ||||||
|  |                     p->context_.get(), | ||||||
|  |                     [this]() | ||||||
|  |                     { | ||||||
|  |                        if (p->value_ == p->default_) | ||||||
|  |                        { | ||||||
|  |                           // If the current value is default, reset the staged
 | ||||||
|  |                           // value
 | ||||||
|  |                           Reset(); | ||||||
|  |                        } | ||||||
|  |                        else | ||||||
|  |                        { | ||||||
|  |                           // Stage the default value
 | ||||||
|  |                           StageValue(p->default_); | ||||||
|  |                           p->UpdateEditWidget(); | ||||||
|  |                        } | ||||||
|  |                     }); | ||||||
|  | 
 | ||||||
|  |    p->UpdateResetButton(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template<class T> | ||||||
|  | void SettingsVariable<T>::Impl::UpdateEditWidget() | ||||||
|  | { | ||||||
|  |    // Use the staged value if present, otherwise the current value
 | ||||||
|  |    T& value = staged_.has_value() ? *staged_ : value_; | ||||||
|  | 
 | ||||||
|  |    if (QLineEdit* lineEdit = dynamic_cast<QLineEdit*>(editWidget_)) | ||||||
|  |    { | ||||||
|  |       if constexpr (std::is_integral_v<T>) | ||||||
|  |       { | ||||||
|  |          lineEdit->setText(QString::number(value)); | ||||||
|  |       } | ||||||
|  |       else if constexpr (std::is_same_v<T, std::string>) | ||||||
|  |       { | ||||||
|  |          lineEdit->setText(QString::fromStdString(value)); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template<class T> | ||||||
|  | void SettingsVariable<T>::Impl::UpdateResetButton() | ||||||
|  | { | ||||||
|  |    if (resetButton_ != nullptr) | ||||||
|  |    { | ||||||
|  |       if (staged_.has_value()) | ||||||
|  |       { | ||||||
|  |          resetButton_->setVisible(!stagedValid_ || *staged_ != default_); | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          resetButton_->setVisible(value_ != default_); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| template<class T> | template<class T> | ||||||
| bool SettingsVariable<T>::Equals(const SettingsVariableBase& o) const | bool SettingsVariable<T>::Equals(const SettingsVariableBase& o) const | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -4,6 +4,9 @@ | ||||||
| 
 | 
 | ||||||
| #include <functional> | #include <functional> | ||||||
| 
 | 
 | ||||||
|  | class QAbstractButton; | ||||||
|  | class QWidget; | ||||||
|  | 
 | ||||||
| namespace scwx | namespace scwx | ||||||
| { | { | ||||||
| namespace qt | namespace qt | ||||||
|  | @ -72,6 +75,11 @@ public: | ||||||
|     */ |     */ | ||||||
|    void Commit(); |    void Commit(); | ||||||
| 
 | 
 | ||||||
|  |    /**
 | ||||||
|  |     * Clears the staged value of the settings variable. | ||||||
|  |     */ | ||||||
|  |    void Reset(); | ||||||
|  | 
 | ||||||
|    /**
 |    /**
 | ||||||
|     * Validate the value against the defined parameters of the settings |     * Validate the value against the defined parameters of the settings | ||||||
|     * variable. |     * variable. | ||||||
|  | @ -135,6 +143,20 @@ public: | ||||||
|     */ |     */ | ||||||
|    virtual void WriteValue(boost::json::object& json) const override; |    virtual void WriteValue(boost::json::object& json) const override; | ||||||
| 
 | 
 | ||||||
|  |    /**
 | ||||||
|  |     * Sets the edit widget from the settings dialog. | ||||||
|  |     * | ||||||
|  |     * @param widget Edit widget | ||||||
|  |     */ | ||||||
|  |    void SetEditWidget(QWidget* widget); | ||||||
|  | 
 | ||||||
|  |    /**
 | ||||||
|  |     * Sets the reset button from the settings dialog. | ||||||
|  |     * | ||||||
|  |     * @param button Reset button | ||||||
|  |     */ | ||||||
|  |    void SetResetButton(QAbstractButton* button); | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
|    virtual bool Equals(const SettingsVariableBase& o) const override; |    virtual bool Equals(const SettingsVariableBase& o) const override; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
| #include "ui_settings_dialog.h" | #include "ui_settings_dialog.h" | ||||||
| 
 | 
 | ||||||
| #include <scwx/awips/phenomenon.hpp> | #include <scwx/awips/phenomenon.hpp> | ||||||
|  | #include <scwx/qt/manager/settings_manager.hpp> | ||||||
| 
 | 
 | ||||||
| #include <QToolButton> | #include <QToolButton> | ||||||
| 
 | 
 | ||||||
|  | @ -80,10 +81,28 @@ SettingsDialog::~SettingsDialog() | ||||||
| 
 | 
 | ||||||
| void SettingsDialogImpl::SetupGeneralTab() | void SettingsDialogImpl::SetupGeneralTab() | ||||||
| { | { | ||||||
|    self_->ui->resetRadarSiteButton->setVisible(false); |    settings::GeneralSettings& generalSettings = | ||||||
|    self_->ui->resetGridWidthButton->setVisible(false); |       manager::SettingsManager::general_settings(); | ||||||
|    self_->ui->resetGridHeightButton->setVisible(false); | 
 | ||||||
|    self_->ui->resetMapboxApiKeyButton->setVisible(false); |    generalSettings.default_radar_site().SetEditWidget( | ||||||
|  |       self_->ui->radarSiteComboBox); | ||||||
|  |    generalSettings.default_radar_site().SetResetButton( | ||||||
|  |       self_->ui->resetRadarSiteButton); | ||||||
|  | 
 | ||||||
|  |    generalSettings.grid_width().SetEditWidget(self_->ui->gridWidthSpinBox); | ||||||
|  |    generalSettings.grid_width().SetResetButton(self_->ui->resetGridWidthButton); | ||||||
|  | 
 | ||||||
|  |    generalSettings.grid_height().SetEditWidget(self_->ui->gridHeightSpinBox); | ||||||
|  |    generalSettings.grid_height().SetResetButton( | ||||||
|  |       self_->ui->resetGridHeightButton); | ||||||
|  | 
 | ||||||
|  |    generalSettings.mapbox_api_key().SetEditWidget( | ||||||
|  |       self_->ui->mapboxApiKeyLineEdit); | ||||||
|  |    generalSettings.mapbox_api_key().SetResetButton( | ||||||
|  |       self_->ui->resetMapboxApiKeyButton); | ||||||
|  | 
 | ||||||
|  |    generalSettings.debug_enabled().SetEditWidget( | ||||||
|  |       self_->ui->debugEnabledCheckBox); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void SettingsDialogImpl::SetupPalettesColorTablesTab() | void SettingsDialogImpl::SetupPalettesColorTablesTab() | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat