[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
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