Merge branch 'welcomeq-requirements'

Expose the requirements model better to QML, hook it up to the QML
in the WelcomeQ module.
This commit is contained in:
Adriaan de Groot 2020-05-12 17:08:11 +02:00
commit 6e22364a5a
12 changed files with 96 additions and 57 deletions

View file

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

View file

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

View file

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

View file

@ -358,7 +358,6 @@ ModuleManager::checkRequirements()
}
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, this, [=](){ this->requirementsComplete( m_requirementsModel->satisfiedMandatory() ); } );

View file

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

View file

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

View file

@ -32,16 +32,14 @@ CALAMARES_PLUGIN_FACTORY_DEFINITION( WelcomeViewStepFactory, registerPlugin< Wel
WelcomeViewStep::WelcomeViewStep( QObject* parent )
: Calamares::ViewStep( parent )
, m_requirementsChecker( new GeneralRequirements( this ) )
, m_conf( new Config( this ) )
, m_widget( new WelcomePage( m_conf ) )
, m_requirementsChecker( new GeneralRequirements( this ) )
{
connect( Calamares::ModuleManager::instance(),
&Calamares::ModuleManager::requirementsComplete,
this,
&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 );
}

View file

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

View file

@ -70,16 +70,49 @@ biggestSingleScreen()
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
GeneralRequirements::checkRequirements()
{
QSize availableSize = biggestSingleScreen();
bool enoughStorage = false;
bool enoughRam = false;
bool hasPower = false;
bool hasInternet = false;
bool isRoot = false;
MaybeChecked enoughStorage;
MaybeChecked enoughRam;
MaybeChecked hasPower;
MaybeChecked hasInternet;
MaybeChecked isRoot;
bool enoughScreen = availableSize.isValid() && ( availableSize.width() >= CalamaresUtils::windowMinimumWidth )
&& ( availableSize.height() >= CalamaresUtils::windowMinimumHeight );
@ -112,7 +145,7 @@ GeneralRequirements::checkRequirements()
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 )
<< TR( "hasPower", hasPower ) << TR( "hasInternet", hasInternet ) << TR( "isRoot", isRoot );

View file

@ -22,9 +22,9 @@
#include "checker/GeneralRequirements.h"
#include "locale/LabelModel.h"
#include "utils/Dirs.h"
#include "utils/Logger.h"
#include "utils/Variant.h"
#include "utils/Dirs.h"
#include "Branding.h"
#include "modulesystem/ModuleManager.h"
@ -33,62 +33,57 @@
CALAMARES_PLUGIN_FACTORY_DEFINITION( WelcomeQmlViewStepFactory, registerPlugin< WelcomeQmlViewStep >(); )
WelcomeQmlViewStep::WelcomeQmlViewStep( QObject* parent )
: Calamares::QmlViewStep(parent )
, m_config( new Config( this ) ) // the qml singleton takes ownership and deletes it
// , m_nextEnabled( false )
: Calamares::QmlViewStep( parent )
, m_config( new Config( this ) )
, m_requirementsChecker( new GeneralRequirements( this ) )
{
// connect( m_config,
// &Config::isNextEnabledChanged,
// this,
// &WelcomeQmlViewStep::nextStatusChanged );
// emit nextStatusChanged(true);
connect( Calamares::ModuleManager::instance(),
&Calamares::ModuleManager::requirementsComplete,
this,
&WelcomeQmlViewStep::nextStatusChanged );
}
QString
WelcomeQmlViewStep::prettyName() const
{
return tr( "Welcome" );
return tr( "Welcome" );
}
bool
WelcomeQmlViewStep::isNextEnabled() const
{
// TODO: should return true
// return m_config->property("isNextEnabled").toBool();
return true;
return m_config->requirementsModel()->satisfiedMandatory();
}
bool
WelcomeQmlViewStep::isBackEnabled() const
{
// TODO: should return true (it's weird that you are not allowed to have welcome *after* anything
return false;
// TODO: should return true (it's weird that you are not allowed to have welcome *after* anything
return false;
}
bool
WelcomeQmlViewStep::isAtBeginning() const
{
// TODO: adjust to "pages" in the QML
return true;
// TODO: adjust to "pages" in the QML
return true;
}
bool
WelcomeQmlViewStep::isAtEnd() const
{
// TODO: adjust to "pages" in the QML
return true;
// TODO: adjust to "pages" in the QML
return true;
}
Calamares::JobList
WelcomeQmlViewStep::jobs() const
{
return Calamares::JobList();
return Calamares::JobList();
}
void
@ -96,30 +91,29 @@ WelcomeQmlViewStep::setConfigurationMap( const QVariantMap& 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" )
&& configurationMap.value( "requirements" ).type() == QVariant::Map )
{
m_requirementsChecker->setConfigurationMap( configurationMap.value( "requirements" ).toMap() );
}
else
cWarning() << "no valid requirements map found in welcome "
"module configuration.";
if ( configurationMap.contains( "requirements" )
&& configurationMap.value( "requirements" ).type() == QVariant::Map )
{
m_requirementsChecker->setConfigurationMap( configurationMap.value( "requirements" ).toMap() );
}
else
{
cWarning() << "no valid requirements map found in welcomeq "
"module configuration.";
}
Calamares::QmlViewStep::setConfigurationMap( configurationMap ); // call parent implementation last
Calamares::QmlViewStep::setConfigurationMap( configurationMap ); // call parent implementation last
setContextProperty( "Welcome", m_config );
}
Calamares::RequirementsList
WelcomeQmlViewStep::checkRequirements()
{
return m_requirementsChecker->checkRequirements();
return m_requirementsChecker->checkRequirements();
}
QObject*
WelcomeQmlViewStep::getConfig()
{
return m_config;
return m_config;
}

View file

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

View file

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