Gui: support more parameter types in PrefComboBox
Using a user defined property 'prefType'
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user