Gui: support more parameter types in PrefComboBox

Using a user defined property 'prefType'
This commit is contained in:
Zheng, Lei
2022-11-24 07:11:52 +08:00
committed by Chris Hennes
parent b141f8f491
commit 0cfec4061a
2 changed files with 85 additions and 6 deletions

View File

@@ -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<int>(getParamType())) {
case QMetaType::Int:
case QMetaType::LongLong:
index = findData(static_cast<int>(getWindowParameter()->GetInt(entryName(), m_Default.toInt())));
break;
case QMetaType::UInt:
case QMetaType::ULongLong:
index = findData(static_cast<uint>(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<int>(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;
}
}
// --------------------------------------------------------------------

View File

@@ -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;
};
/**