[users] Complete isReady move to Config

- give Config slots and signals for ready-status
- disconnect the page from the viewstep and use the Config object
  ready-status instead
This commit is contained in:
Adriaan de Groot 2020-08-18 11:21:53 +02:00
parent 36cefe3be1
commit abae942e55
5 changed files with 60 additions and 27 deletions

View File

@ -56,6 +56,16 @@ hostNameActionNames()
Config::Config( QObject* parent ) Config::Config( QObject* parent )
: QObject( parent ) : QObject( parent )
{ {
emit readyChanged( m_isReady ); // false
// Gang together all the changes of status to one readyChanged() signal
connect( this, &Config::hostNameStatusChanged, this, &Config::checkReady );
connect( this, &Config::loginNameStatusChanged, this, &Config::checkReady );
connect( this, &Config::fullNameChanged, this, &Config::checkReady );
connect( this, &Config::userPasswordStatusChanged, this, &Config::checkReady );
connect( this, &Config::rootPasswordStatusChanged, this, &Config::checkReady );
connect( this, &Config::reuseUserPasswordForRootChanged, this, &Config::checkReady );
connect( this, &Config::requireStrongPasswordsChanged, this, &Config::checkReady );
} }
Config::~Config() {} Config::~Config() {}
@ -404,7 +414,14 @@ Config::setUserPasswordSecondary( const QString& s )
} }
} }
QPair< Config::PasswordValidity, QString > /** @brief Checks two copies of the password for validity
*
* Given two copies of the password -- generally the password and
* the secondary fields -- checks them for validity and returns
* a pair of <validity, message>.
*
*/
Config::PasswordStatus
Config::passwordStatus( const QString& pw1, const QString& pw2 ) const Config::passwordStatus( const QString& pw1, const QString& pw2 ) const
{ {
if ( pw1 != pw2 ) if ( pw1 != pw2 )
@ -527,6 +544,33 @@ Config::rootPasswordMessage() const
return p.second; return p.second;
} }
bool
Config::isReady() const
{
bool readyFullName = !fullName().isEmpty(); // Needs some text
bool readyHostname = hostNameStatus().isEmpty(); // .. no warning message
bool readyUsername = loginNameStatus().isEmpty(); // .. no warning message
bool readyUserPassword = userPasswordValidity() != Config::PasswordValidity::Invalid;
bool readyRootPassword = rootPasswordValidity() != Config::PasswordValidity::Invalid;
return readyFullName && readyHostname && readyUsername && readyUserPassword && readyRootPassword;
}
/** @brief Update ready status and emit signal
*
* This is a "concentrator" private slot for all the status-changed
* signals, so that readyChanged() is emitted only when needed.
*/
void
Config::checkReady()
{
bool b = isReady();
if ( b != m_isReady )
{
m_isReady = b;
emit readyChanged( b );
}
}
STATICTEST void STATICTEST void
setConfigurationDefaultGroups( const QVariantMap& map, QStringList& defaultGroups ) setConfigurationDefaultGroups( const QVariantMap& map, QStringList& defaultGroups )
@ -646,6 +690,8 @@ Config::setConfigurationMap( const QVariantMap& configurationMap )
addPasswordCheck( i.key(), i.value(), m_passwordChecks ); addPasswordCheck( i.key(), i.value(), m_passwordChecks );
} }
std::sort( m_passwordChecks.begin(), m_passwordChecks.end() ); std::sort( m_passwordChecks.begin(), m_passwordChecks.end() );
checkReady();
} }
void void

View File

@ -79,6 +79,8 @@ class Config : public QObject
Q_PROPERTY( bool requireStrongPasswords READ requireStrongPasswords WRITE setRequireStrongPasswords NOTIFY Q_PROPERTY( bool requireStrongPasswords READ requireStrongPasswords WRITE setRequireStrongPasswords NOTIFY
requireStrongPasswordsChanged ) requireStrongPasswordsChanged )
Q_PROPERTY( bool ready READ isReady NOTIFY readyChanged STORED false )
public: public:
/** @brief Validity (status) of a password /** @brief Validity (status) of a password
* *
@ -178,6 +180,8 @@ public:
QString rootPasswordMessage() const; QString rootPasswordMessage() const;
PasswordStatus rootPasswordStatus() const; PasswordStatus rootPasswordStatus() const;
bool isReady() const;
static const QStringList& forbiddenLoginNames(); static const QStringList& forbiddenLoginNames();
static const QStringList& forbiddenHostNames(); static const QStringList& forbiddenHostNames();
@ -236,10 +240,11 @@ signals:
void rootPasswordChanged( const QString& ); void rootPasswordChanged( const QString& );
void rootPasswordSecondaryChanged( const QString& ); void rootPasswordSecondaryChanged( const QString& );
void rootPasswordStatusChanged( int, const QString& ); void rootPasswordStatusChanged( int, const QString& );
void readyChanged( bool ) const;
private: private:
PasswordStatus passwordStatus( const QString&, const QString& ) const; PasswordStatus passwordStatus( const QString&, const QString& ) const;
void checkReady();
QStringList m_defaultGroups; QStringList m_defaultGroups;
QString m_userShell; QString m_userShell;
@ -265,6 +270,8 @@ private:
bool m_customLoginName = false; bool m_customLoginName = false;
bool m_customHostName = false; bool m_customHostName = false;
bool m_isReady = false; ///< Used to reduce readyChanged signals
HostNameActions m_hostNameActions; HostNameActions m_hostNameActions;
PasswordCheckList m_passwordChecks; PasswordCheckList m_passwordChecks;
}; };

View File

@ -186,18 +186,6 @@ UsersPage::retranslate()
} }
bool
UsersPage::isReady() const
{
bool readyFullName = !m_config->fullName().isEmpty(); // Needs some text
bool readyHostname = m_config->hostNameStatus().isEmpty(); // .. no warning message
bool readyUsername = m_config->loginNameStatus().isEmpty(); // .. no warning message
bool readyUserPassword = m_config->userPasswordValidity() != Config::PasswordValidity::Invalid;
bool readyRootPassword = m_config->rootPasswordValidity() != Config::PasswordValidity::Invalid;
return readyFullName && readyHostname && readyUsername && readyUserPassword && readyRootPassword;
}
void void
UsersPage::onActivate() UsersPage::onActivate()
{ {
@ -213,21 +201,18 @@ void
UsersPage::onFullNameTextEdited( const QString& fullName ) UsersPage::onFullNameTextEdited( const QString& fullName )
{ {
labelStatus( ui->labelFullName, ui->labelFullNameError, fullName, QString() ); labelStatus( ui->labelFullName, ui->labelFullNameError, fullName, QString() );
checkReady( isReady() );
} }
void void
UsersPage::reportLoginNameStatus( const QString& status ) UsersPage::reportLoginNameStatus( const QString& status )
{ {
labelStatus( ui->labelUsername, ui->labelUsernameError, m_config->loginName(), status ); labelStatus( ui->labelUsername, ui->labelUsernameError, m_config->loginName(), status );
emit checkReady( isReady() );
} }
void void
UsersPage::reportHostNameStatus( const QString& status ) UsersPage::reportHostNameStatus( const QString& status )
{ {
labelStatus( ui->labelHostname, ui->labelHostnameError, m_config->hostName(), status ); labelStatus( ui->labelHostname, ui->labelHostnameError, m_config->hostName(), status );
emit checkReady( isReady() );
} }
static inline void static inline void
@ -280,5 +265,4 @@ UsersPage::onReuseUserPasswordChanged( const int checked )
ui->labelRootPasswordError->setVisible( visible ); ui->labelRootPasswordError->setVisible( visible );
ui->textBoxRootPassword->setVisible( visible ); ui->textBoxRootPassword->setVisible( visible );
ui->textBoxVerifiedRootPassword->setVisible( visible ); ui->textBoxVerifiedRootPassword->setVisible( visible );
checkReady( isReady() );
} }

View File

@ -42,8 +42,6 @@ public:
explicit UsersPage( Config* config, QWidget* parent = nullptr ); explicit UsersPage( Config* config, QWidget* parent = nullptr );
virtual ~UsersPage(); virtual ~UsersPage();
bool isReady() const;
void onActivate(); void onActivate();
protected slots: protected slots:
@ -54,9 +52,6 @@ protected slots:
void reportUserPasswordStatus( int, const QString& ); void reportUserPasswordStatus( int, const QString& );
void reportRootPasswordStatus( int, const QString& ); void reportRootPasswordStatus( int, const QString& );
signals:
void checkReady( bool );
private: private:
void retranslate(); void retranslate();

View File

@ -39,7 +39,9 @@ UsersViewStep::UsersViewStep( QObject* parent )
, m_widget( nullptr ) , m_widget( nullptr )
, m_config( new Config( this ) ) , m_config( new Config( this ) )
{ {
emit nextStatusChanged( true ); connect( m_config, &Config::readyChanged, this, &UsersViewStep::nextStatusChanged );
emit nextStatusChanged( m_config->isReady() );
} }
@ -65,7 +67,6 @@ UsersViewStep::widget()
if ( !m_widget ) if ( !m_widget )
{ {
m_widget = new UsersPage( m_config ); m_widget = new UsersPage( m_config );
connect( m_widget, &UsersPage::checkReady, this, &UsersViewStep::nextStatusChanged );
} }
return m_widget; return m_widget;
} }
@ -74,7 +75,7 @@ UsersViewStep::widget()
bool bool
UsersViewStep::isNextEnabled() const UsersViewStep::isNextEnabled() const
{ {
return m_widget ? m_widget->isReady() : true; return m_config->isReady();
} }
@ -120,7 +121,7 @@ void
UsersViewStep::onLeave() UsersViewStep::onLeave()
{ {
m_jobs.clear(); m_jobs.clear();
if ( !m_widget || !m_widget->isReady() ) if ( !m_widget || !m_config->isReady() )
{ {
return; return;
} }