[libcalamares] Add macro CONFIG_PREVENT_EDITING to handle uneditable fields

Boilerplate code for avoiding accidental setting of an internal
field when the UI is editable and the underlying data isn't.
main
Adriaan de Groot 4 years ago
parent 3ea796d009
commit b4a21d7aca

@ -54,6 +54,25 @@ public Q_SLOTS:
* to not-editable, returns @c false. Otherwise, return @c true.
* Calling this with an unknown field (one for which no presets
* are accepted) will print a warning and return @c true.
*
* @see CONFIG_PREVENT_EDITING
*
* Most setters will call isEditable() to check if the field should
* be editable. Do not count on the setter not being called: the
* UI might not have set the field to fixed / constant / not-editable
* and then you can have the setter called by changes in the UI.
*
* To prevent the UI from changing **and** to make sure that the UI
* reflects the unchanged value (rather than the changed value it
* sent to the Config object), use CONFIG_PREVENT_EDITING, like so:
*
* CONFIG_PREVENT_EDITING( type, "propertyName" );
*
* The ; is necessary. <type> is the type of the property; for instance
* QString. The name of the property is a (constant) string. The
* macro will return (out of the setter it is used in) if the field
* is not editable, and will send a notification event with the old
* value as soon as the event loop resumes.
*/
bool isEditable( const QString& fieldName ) const;
@ -104,4 +123,25 @@ private:
} // namespace ModuleSystem
} // namespace Calamares
/// @see Config::isEditable()
//
// This needs to be a macro, because Q_ARG() is a macro that stringifies
// the type name.
#define CONFIG_PREVENT_EDITING( type, fieldName ) \
do \
{ \
if ( !isEditable( QStringLiteral( fieldName ) ) ) \
{ \
auto prop = property( fieldName ); \
const auto& metaobject = metaObject(); \
auto metaprop = metaobject->property( metaobject->indexOfProperty( fieldName ) ); \
if ( metaprop.hasNotifySignal() ) \
{ \
metaprop.notifySignal().invoke( this, Qt::QueuedConnection, Q_ARG( type, prop.value< type >() ) ); \
} \
return; \
} \
} while ( 0 )
#endif

@ -22,6 +22,7 @@
#include <QCoreApplication>
#include <QFile>
#include <QMetaProperty>
#include <QRegExp>
#include <QTimer>
@ -184,12 +185,7 @@ Config::setSudoersGroup( const QString& group )
void
Config::setLoginName( const QString& login )
{
if ( !isEditable( QStringLiteral( "loginName" ) ) )
{
// Should not have arrived here anyway
QTimer::singleShot( 0, this, [=]() { emit loginNameChanged( m_loginName ); } );
return;
}
CONFIG_PREVENT_EDITING( QString, "loginName" );
if ( login != m_loginName )
{
m_customLoginName = !login.isEmpty();
@ -400,12 +396,7 @@ makeHostnameSuggestion( const QStringList& parts )
void
Config::setFullName( const QString& name )
{
if ( !isEditable( QStringLiteral( "fullName" ) ) )
{
// Should not have arrived here anyway
QTimer::singleShot( 0, this, [=]() { emit fullNameChanged( m_fullName ); } );
return;
}
CONFIG_PREVENT_EDITING( QString, "fullName" );
if ( name.isEmpty() && !m_fullName.isEmpty() )
{

Loading…
Cancel
Save