diff --git a/src/Gui/PrefWidgets.cpp b/src/Gui/PrefWidgets.cpp index a4df5f0fd4..7e6c6a26a2 100644 --- a/src/Gui/PrefWidgets.cpp +++ b/src/Gui/PrefWidgets.cpp @@ -144,6 +144,7 @@ void PrefWidget::onRestore() qWarning( "No parameter group specified!" ); #endif restorePreferences(); + m_Restored = true; } void PrefWidget::failedToSave(const QString& name) const @@ -346,6 +347,11 @@ PrefComboBox::~PrefComboBox() { } +QVariant::Type PrefComboBox::getParamType() const +{ + return property("prefType").type(); +} + void PrefComboBox::restorePreferences() { if (getWindowParameter().isNull()) @@ -353,9 +359,41 @@ void PrefComboBox::restorePreferences() failedToRestore(objectName()); return; } - - int index = getWindowParameter()->GetInt(entryName(), currentIndex()); - setCurrentIndex(index); + if (!m_Restored) { + m_Default = currentData(); + m_DefaultText = currentText(); + m_DefaultIndex = currentIndex(); + } + int index = -1; + switch(static_cast(getParamType())) { + case QMetaType::Int: + case QMetaType::LongLong: + index = findData(static_cast(getWindowParameter()->GetInt(entryName(), m_Default.toInt()))); + break; + case QMetaType::UInt: + case QMetaType::ULongLong: + index = findData(static_cast(getWindowParameter()->GetUnsigned(entryName(), m_Default.toUInt()))); + break; + case QMetaType::Bool: + index = findData(getWindowParameter()->GetBool(entryName(), m_Default.toBool())); + break; + case QMetaType::Double: + index = findData(getWindowParameter()->GetFloat(entryName(), m_Default.toDouble())); + break; + case QMetaType::QString: + index = findText(QString::fromUtf8( + getWindowParameter()->GetASCII(entryName(), m_DefaultText.toUtf8().constData()).c_str())); + break; + case QMetaType::QByteArray: + index = findData(QByteArray(getWindowParameter()->GetASCII(entryName(), + m_Default.toByteArray().constData()).c_str())); + break; + default: + index = getWindowParameter()->GetInt(entryName(), m_DefaultIndex); + break; + } + if (index >= 0 && index < count()) + setCurrentIndex(index); } void PrefComboBox::savePreferences() @@ -366,7 +404,31 @@ void PrefComboBox::savePreferences() return; } - getWindowParameter()->SetInt(entryName() , currentIndex()); + switch(static_cast(getParamType())) { + case QMetaType::Int: + case QMetaType::LongLong: + getWindowParameter()->SetInt(entryName(), currentData().toInt()); + break; + case QMetaType::UInt: + case QMetaType::ULongLong: + getWindowParameter()->SetUnsigned(entryName(), currentData().toUInt()); + break; + case QMetaType::Bool: + getWindowParameter()->SetBool(entryName(), currentData().toBool()); + break; + case QMetaType::Double: + getWindowParameter()->SetFloat(entryName(), currentData().toDouble()); + break; + case QMetaType::QString: + getWindowParameter()->SetASCII(entryName(), currentText().toUtf8().constData()); + break; + case QMetaType::QByteArray: + getWindowParameter()->SetASCII(entryName(), currentData().toByteArray().constData()); + break; + default: + getWindowParameter()->SetInt(entryName(), currentIndex()); + break; + } } // -------------------------------------------------------------------- diff --git a/src/Gui/PrefWidgets.h b/src/Gui/PrefWidgets.h index 35c473f5bc..7552afbcc7 100644 --- a/src/Gui/PrefWidgets.h +++ b/src/Gui/PrefWidgets.h @@ -104,6 +104,8 @@ private: // friends friend class Gui::WidgetFactoryInst; +protected: + bool m_Restored = false; }; /** The PrefSpinBox class. @@ -212,6 +214,15 @@ protected: /** * The PrefComboBox class. * \author Werner Mayer + * + * The PrefComboBox supports restoring/saving variant type of item data. You + * can add a property named 'prefType' with the type you want. If no such + * property is found, the class defaults to restore/save the item index. + * + * Note that there is special handling for 'prefType' of QString, which means + * to restore/save the item text. This allows the combox to be editable, and + * accepts user entered value. Use QByteArray if you want to restore/save a + * non translatable string stored as item data. */ class GuiExport PrefComboBox : public QComboBox, public PrefWidget { @@ -226,8 +237,14 @@ public: protected: // restore from/save to parameters - void restorePreferences() override; - void savePreferences() override; + void restorePreferences(); + void savePreferences(); + virtual QVariant::Type getParamType() const; + +private: + QVariant m_Default; + int m_DefaultIndex; + QString m_DefaultText; }; /**