Merge branch 'welcomeq-requirements'

Expose the requirements model better to QML, hook it up to the QML
in the WelcomeQ module.
main
Adriaan de Groot 5 years ago
commit 6e22364a5a

@ -41,6 +41,7 @@ RequirementsChecker::RequirementsChecker( QVector< Module* > modules, Requiremen
, m_progressTimeouts( 0 ) , m_progressTimeouts( 0 )
{ {
m_watchers.reserve( m_modules.count() ); m_watchers.reserve( m_modules.count() );
connect( this, &RequirementsChecker::requirementsProgress, model, &RequirementsModel::setProgressMessage );
} }
RequirementsChecker::~RequirementsChecker() {} RequirementsChecker::~RequirementsChecker() {}
@ -83,6 +84,7 @@ RequirementsChecker::finished()
} }
m_model->describe(); m_model->describe();
m_model->changeRequirementsList();
QTimer::singleShot( 0, this, &RequirementsChecker::done ); QTimer::singleShot( 0, this, &RequirementsChecker::done );
} }
} }
@ -97,8 +99,7 @@ RequirementsChecker::addCheckedRequirements( Module* m )
m_model->addRequirementsList( l ); m_model->addRequirementsList( l );
} }
requirementsProgress( requirementsProgress( tr( "Requirements checking for module <i>%1</i> is complete." ).arg( m->name() ) );
tr( "Requirements checking for module <i>%1</i> is complete." ).arg( m->name() ) );
} }
void void

@ -105,4 +105,11 @@ RequirementsModel::describe() const
} }
} }
void
RequirementsModel::setProgressMessage( const QString& m )
{
m_progressMessage = m;
emit progressMessageChanged( m_progressMessage );
}
} // namespace Calamares } // namespace Calamares

@ -46,6 +46,7 @@ class DLLEXPORT RequirementsModel : public QAbstractListModel
Q_OBJECT Q_OBJECT
Q_PROPERTY( bool satisfiedRequirements READ satisfiedRequirements NOTIFY satisfiedRequirementsChanged FINAL ) Q_PROPERTY( bool satisfiedRequirements READ satisfiedRequirements NOTIFY satisfiedRequirementsChanged FINAL )
Q_PROPERTY( bool satisfiedMandatory READ satisfiedMandatory NOTIFY satisfiedMandatoryChanged FINAL ) Q_PROPERTY( bool satisfiedMandatory READ satisfiedMandatory NOTIFY satisfiedMandatoryChanged FINAL )
Q_PROPERTY( QString progressMessage READ progressMessage NOTIFY progressMessageChanged FINAL )
public: public:
using QAbstractListModel::QAbstractListModel; using QAbstractListModel::QAbstractListModel;
@ -65,6 +66,9 @@ public:
bool satisfiedRequirements() const { return m_satisfiedRequirements; } bool satisfiedRequirements() const { return m_satisfiedRequirements; }
///@brief Are all the **mandatory** requirements satisfied? ///@brief Are all the **mandatory** requirements satisfied?
bool satisfiedMandatory() const { return m_satisfiedMandatory; } bool satisfiedMandatory() const { return m_satisfiedMandatory; }
///@brief Message (from an ongoing check) about progress
QString progressMessage() const { return m_progressMessage; }
QVariant data( const QModelIndex& index, int role ) const override; QVariant data( const QModelIndex& index, int role ) const override;
int rowCount( const QModelIndex& ) const override; int rowCount( const QModelIndex& ) const override;
@ -76,6 +80,7 @@ public:
signals: signals:
void satisfiedRequirementsChanged( bool value ); void satisfiedRequirementsChanged( bool value );
void satisfiedMandatoryChanged( bool value ); void satisfiedMandatoryChanged( bool value );
void progressMessageChanged( QString message );
protected: protected:
QHash< int, QByteArray > roleNames() const override; QHash< int, QByteArray > roleNames() const override;
@ -83,10 +88,14 @@ protected:
///@brief Append some requirements; resets the model ///@brief Append some requirements; resets the model
void addRequirementsList( const Calamares::RequirementsList& requirements ); void addRequirementsList( const Calamares::RequirementsList& requirements );
///@brief Update progress message (called by the checker)
void setProgressMessage( const QString& m );
private: private:
///@brief Implementation for {set,add}RequirementsList ///@brief Implementation for {set,add}RequirementsList
void changeRequirementsList(); void changeRequirementsList();
QString m_progressMessage;
QMutex m_addLock; QMutex m_addLock;
RequirementsList m_requirements; RequirementsList m_requirements;
bool m_satisfiedRequirements = false; bool m_satisfiedRequirements = false;

@ -358,7 +358,6 @@ ModuleManager::checkRequirements()
} }
RequirementsChecker* rq = new RequirementsChecker( modules, m_requirementsModel, this ); RequirementsChecker* rq = new RequirementsChecker( modules, m_requirementsModel, this );
connect( rq, &RequirementsChecker::requirementsProgress, this, &ModuleManager::requirementsProgress );
connect( rq, &RequirementsChecker::done, rq, &RequirementsChecker::deleteLater ); connect( rq, &RequirementsChecker::done, rq, &RequirementsChecker::deleteLater );
connect( rq, &RequirementsChecker::done, this, [=](){ this->requirementsComplete( m_requirementsModel->satisfiedMandatory() ); } ); connect( rq, &RequirementsChecker::done, this, [=](){ this->requirementsComplete( m_requirementsModel->satisfiedMandatory() ); } );

@ -100,7 +100,6 @@ signals:
void modulesFailed( QStringList ); /// .. or not void modulesFailed( QStringList ); /// .. or not
// Below, see RequirementsChecker documentation // Below, see RequirementsChecker documentation
void requirementsComplete( bool ); void requirementsComplete( bool );
void requirementsProgress( const QString& );
private slots: private slots:
void doInit(); void doInit();

@ -31,6 +31,7 @@
#include "locale/LabelModel.h" #include "locale/LabelModel.h"
#include "modulesystem/ModuleManager.h" #include "modulesystem/ModuleManager.h"
#include "modulesystem/RequirementsModel.h"
#include "utils/CalamaresUtilsGui.h" #include "utils/CalamaresUtilsGui.h"
#include "utils/Logger.h" #include "utils/Logger.h"
#include "utils/NamedEnum.h" #include "utils/NamedEnum.h"
@ -90,8 +91,8 @@ WelcomePage::WelcomePage( Config* conf, QWidget* parent )
&Calamares::ModuleManager::requirementsComplete, &Calamares::ModuleManager::requirementsComplete,
m_checkingWidget, m_checkingWidget,
&CheckerContainer::requirementsComplete ); &CheckerContainer::requirementsComplete );
connect( Calamares::ModuleManager::instance(), connect( Calamares::ModuleManager::instance()->requirementsModel(),
&Calamares::ModuleManager::requirementsProgress, &Calamares::RequirementsModel::progressMessageChanged,
m_checkingWidget, m_checkingWidget,
&CheckerContainer::requirementsProgress ); &CheckerContainer::requirementsProgress );
} }

@ -32,16 +32,14 @@ CALAMARES_PLUGIN_FACTORY_DEFINITION( WelcomeViewStepFactory, registerPlugin< Wel
WelcomeViewStep::WelcomeViewStep( QObject* parent ) WelcomeViewStep::WelcomeViewStep( QObject* parent )
: Calamares::ViewStep( parent ) : Calamares::ViewStep( parent )
, m_requirementsChecker( new GeneralRequirements( this ) )
, m_conf( new Config( this ) ) , m_conf( new Config( this ) )
, m_widget( new WelcomePage( m_conf ) )
, m_requirementsChecker( new GeneralRequirements( this ) )
{ {
connect( Calamares::ModuleManager::instance(), connect( Calamares::ModuleManager::instance(),
&Calamares::ModuleManager::requirementsComplete, &Calamares::ModuleManager::requirementsComplete,
this, this,
&WelcomeViewStep::nextStatusChanged ); &WelcomeViewStep::nextStatusChanged );
// the instance of the qqc2 or qwidgets page
m_widget = new WelcomePage( m_conf );
connect( m_conf, &Config::localeIndexChanged, m_widget, &WelcomePage::externallySelectedLanguage ); connect( m_conf, &Config::localeIndexChanged, m_widget, &WelcomePage::externallySelectedLanguage );
} }

@ -73,9 +73,9 @@ public:
Calamares::RequirementsList checkRequirements() override; Calamares::RequirementsList checkRequirements() override;
private: private:
Config* m_conf;
WelcomePage* m_widget; WelcomePage* m_widget;
GeneralRequirements* m_requirementsChecker; GeneralRequirements* m_requirementsChecker;
Config* m_conf;
}; };
CALAMARES_PLUGIN_FACTORY_DECLARATION( WelcomeViewStepFactory ) CALAMARES_PLUGIN_FACTORY_DECLARATION( WelcomeViewStepFactory )

@ -70,16 +70,49 @@ biggestSingleScreen()
return s; return s;
} }
/** @brief Distinguish has-not-been-checked-at-all from false.
*
*/
struct MaybeChecked
{
bool hasBeenChecked = false;
bool value = false;
MaybeChecked& operator=( bool b )
{
cDebug() << "Assigning" << b;
hasBeenChecked = true;
value = b;
return *this;
}
operator bool() const { return value; }
};
QDebug&
operator<<( QDebug& s, const MaybeChecked& c )
{
if ( c.hasBeenChecked )
{
s << c.value;
}
else
{
s << "unchecked";
}
return s;
}
Calamares::RequirementsList Calamares::RequirementsList
GeneralRequirements::checkRequirements() GeneralRequirements::checkRequirements()
{ {
QSize availableSize = biggestSingleScreen(); QSize availableSize = biggestSingleScreen();
bool enoughStorage = false; MaybeChecked enoughStorage;
bool enoughRam = false; MaybeChecked enoughRam;
bool hasPower = false; MaybeChecked hasPower;
bool hasInternet = false; MaybeChecked hasInternet;
bool isRoot = false; MaybeChecked isRoot;
bool enoughScreen = availableSize.isValid() && ( availableSize.width() >= CalamaresUtils::windowMinimumWidth ) bool enoughScreen = availableSize.isValid() && ( availableSize.width() >= CalamaresUtils::windowMinimumWidth )
&& ( availableSize.height() >= CalamaresUtils::windowMinimumHeight ); && ( availableSize.height() >= CalamaresUtils::windowMinimumHeight );
@ -112,7 +145,7 @@ GeneralRequirements::checkRequirements()
isRoot = checkIsRoot(); isRoot = checkIsRoot();
} }
using TR = Logger::DebugRow< const char*, bool >; using TR = Logger::DebugRow< const char*, MaybeChecked >;
cDebug() << "GeneralRequirements output:" << TR( "enoughStorage", enoughStorage ) << TR( "enoughRam", enoughRam ) cDebug() << "GeneralRequirements output:" << TR( "enoughStorage", enoughStorage ) << TR( "enoughRam", enoughRam )
<< TR( "hasPower", hasPower ) << TR( "hasInternet", hasInternet ) << TR( "isRoot", isRoot ); << TR( "hasPower", hasPower ) << TR( "hasInternet", hasInternet ) << TR( "isRoot", isRoot );

@ -22,9 +22,9 @@
#include "checker/GeneralRequirements.h" #include "checker/GeneralRequirements.h"
#include "locale/LabelModel.h" #include "locale/LabelModel.h"
#include "utils/Dirs.h"
#include "utils/Logger.h" #include "utils/Logger.h"
#include "utils/Variant.h" #include "utils/Variant.h"
#include "utils/Dirs.h"
#include "Branding.h" #include "Branding.h"
#include "modulesystem/ModuleManager.h" #include "modulesystem/ModuleManager.h"
@ -34,16 +34,13 @@ CALAMARES_PLUGIN_FACTORY_DEFINITION( WelcomeQmlViewStepFactory, registerPlugin<
WelcomeQmlViewStep::WelcomeQmlViewStep( QObject* parent ) WelcomeQmlViewStep::WelcomeQmlViewStep( QObject* parent )
: Calamares::QmlViewStep( parent ) : Calamares::QmlViewStep( parent )
, m_config( new Config( this ) ) // the qml singleton takes ownership and deletes it , m_config( new Config( this ) )
// , m_nextEnabled( false )
, m_requirementsChecker( new GeneralRequirements( this ) ) , m_requirementsChecker( new GeneralRequirements( this ) )
{ {
// connect( m_config, connect( Calamares::ModuleManager::instance(),
// &Config::isNextEnabledChanged, &Calamares::ModuleManager::requirementsComplete,
// this, this,
// &WelcomeQmlViewStep::nextStatusChanged ); &WelcomeQmlViewStep::nextStatusChanged );
// emit nextStatusChanged(true);
} }
@ -56,9 +53,7 @@ WelcomeQmlViewStep::prettyName() const
bool bool
WelcomeQmlViewStep::isNextEnabled() const WelcomeQmlViewStep::isNextEnabled() const
{ {
// TODO: should return true return m_config->requirementsModel()->satisfiedMandatory();
// return m_config->property("isNextEnabled").toBool();
return true;
} }
bool bool
@ -96,16 +91,16 @@ WelcomeQmlViewStep::setConfigurationMap( const QVariantMap& configurationMap )
{ {
m_config->setConfigurationMap( configurationMap ); m_config->setConfigurationMap( configurationMap );
// TODO: figure out how the requirements (held by ModuleManager) should be accessible
// to QML as a model. //will be model as a qvariantmap containing a alert level and the message string
if ( configurationMap.contains( "requirements" ) if ( configurationMap.contains( "requirements" )
&& configurationMap.value( "requirements" ).type() == QVariant::Map ) && configurationMap.value( "requirements" ).type() == QVariant::Map )
{ {
m_requirementsChecker->setConfigurationMap( configurationMap.value( "requirements" ).toMap() ); m_requirementsChecker->setConfigurationMap( configurationMap.value( "requirements" ).toMap() );
} }
else else
cWarning() << "no valid requirements map found in welcome " {
cWarning() << "no valid requirements map found in welcomeq "
"module configuration."; "module configuration.";
}
Calamares::QmlViewStep::setConfigurationMap( configurationMap ); // call parent implementation last Calamares::QmlViewStep::setConfigurationMap( configurationMap ); // call parent implementation last
setContextProperty( "Welcome", m_config ); setContextProperty( "Welcome", m_config );
@ -122,4 +117,3 @@ WelcomeQmlViewStep::getConfig()
{ {
return m_config; return m_config;
} }

@ -47,7 +47,6 @@ class PLUGINDLLEXPORT WelcomeQmlViewStep : public Calamares::QmlViewStep
Q_OBJECT Q_OBJECT
public: public:
explicit WelcomeQmlViewStep( QObject* parent = nullptr ); explicit WelcomeQmlViewStep( QObject* parent = nullptr );
QString prettyName() const override; QString prettyName() const override;
@ -74,7 +73,6 @@ public:
QObject* getConfig() override; QObject* getConfig() override;
private: private:
// TODO: a generic QML viewstep should return a config object from a method
Config* m_config; Config* m_config;
GeneralRequirements* m_requirementsChecker; GeneralRequirements* m_requirementsChecker;
}; };

@ -60,14 +60,14 @@ Page
property var required: "yes" //requirementsModel property var required: "yes" //requirementsModel
property var satisfied: "yes" //satisfiedRequirements property var satisfied: "yes" //satisfiedRequirements
property var requiredMet: (required != satisfied) ? true : false property var requiredMet: (required != satisfied) ? true : false
visible: requiredMet visible: !config.requirementsModel.satisfiedRequirements
} }
Requirements { Requirements {
property var required: "yes" //requirementsModel property var required: "yes" //requirementsModel
property var mandatory: "yes" //satisfiedMandatory property var mandatory: "yes" //satisfiedMandatory
property var mandatoryMet: (required != mandatory) ? true : false property var mandatoryMet: (required != mandatory) ? true : false
visible: mandatoryMet visible: !config.requirementsModel.satisfiedMandatory
} }
RowLayout { RowLayout {

Loading…
Cancel
Save