diff --git a/src/libcalamaresui/CMakeLists.txt b/src/libcalamaresui/CMakeLists.txt index 381909025..99531e5ff 100644 --- a/src/libcalamaresui/CMakeLists.txt +++ b/src/libcalamaresui/CMakeLists.txt @@ -6,6 +6,7 @@ set( calamaresui_SOURCES modulesystem/ModuleManager.cpp modulesystem/ProcessJobModule.cpp modulesystem/Requirement.cpp + modulesystem/RequirementsChecker.cpp modulesystem/ViewModule.cpp utils/CalamaresUtilsGui.cpp diff --git a/src/libcalamaresui/modulesystem/ModuleManager.cpp b/src/libcalamaresui/modulesystem/ModuleManager.cpp index c909d75cb..4133c6cae 100644 --- a/src/libcalamaresui/modulesystem/ModuleManager.cpp +++ b/src/libcalamaresui/modulesystem/ModuleManager.cpp @@ -21,11 +21,13 @@ #include "ExecutionViewStep.h" #include "Module.h" -#include "utils/Logger.h" -#include "utils/YamlUtils.h" +#include "RequirementsChecker.h" #include "Settings.h" #include "ViewManager.h" +#include "utils/Logger.h" +#include "utils/YamlUtils.h" + #include #include @@ -306,32 +308,21 @@ void ModuleManager::checkRequirements() { cDebug() << "Checking module requirements .."; - QTimer::singleShot( 0, this, [ this ]() + + QVector< Module* > modules( m_loadedModulesByInstanceKey.count() ); + int count = 0; + for (const auto& module : m_loadedModulesByInstanceKey ) { - bool acceptable = true; + modules[count++] = module; + } - for (const auto& module : m_loadedModulesByInstanceKey ) - { - RequirementsList l = module->checkRequirements(); - if ( l.length() > 0 ) - { - cDebug() << " .." << module->name() << "has" << l.length() << "requirements"; - emit requirementsResult( l ); - } - int count = 0; - for (const auto& r : l) - { - if ( r.mandatory && !r.satisfied ) - { - cDebug() << " .. requirement" << count << r.name << "is not satisfied."; - acceptable = false; - } - ++count; - } - } + RequirementsChecker *rq = new RequirementsChecker( modules, this ); + connect( rq, &RequirementsChecker::requirementsResult, this, &ModuleManager::requirementsResult ); + connect( rq, &RequirementsChecker::requirementsComplete, this, &ModuleManager::requirementsComplete ); + connect( rq, &RequirementsChecker::done, rq, &RequirementsChecker::deleteLater ); + connect( rq, &RequirementsChecker::requirementsProgress, this, &ModuleManager::requirementsProgress ); - emit requirementsComplete( acceptable ); - } ); + QTimer::singleShot( 0, rq, &RequirementsChecker::run ); } QStringList diff --git a/src/libcalamaresui/modulesystem/ModuleManager.h b/src/libcalamaresui/modulesystem/ModuleManager.h index fc88ef0b5..e235ff8f5 100644 --- a/src/libcalamaresui/modulesystem/ModuleManager.h +++ b/src/libcalamaresui/modulesystem/ModuleManager.h @@ -93,8 +93,10 @@ signals: void initDone(); void modulesLoaded(); /// All of the modules were loaded successfully void modulesFailed( QStringList ); /// .. or not + // Below, see RequirementsChecker documentation void requirementsComplete( bool ); void requirementsResult( RequirementsList& ); + void requirementsProgress( const QString& ); private slots: void doInit(); diff --git a/src/libcalamaresui/modulesystem/RequirementsChecker.cpp b/src/libcalamaresui/modulesystem/RequirementsChecker.cpp new file mode 100644 index 000000000..2cd618b4b --- /dev/null +++ b/src/libcalamaresui/modulesystem/RequirementsChecker.cpp @@ -0,0 +1,73 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "RequirementsChecker.h" + +#include "Module.h" +#include "Requirement.h" + +#include "utils/Logger.h" + +#include + +namespace Calamares +{ + +RequirementsChecker::RequirementsChecker( QVector< Module* > modules, QObject* parent ) + : QObject( parent ) + , m_modules( std::move( modules ) ) +{ +} + +RequirementsChecker::~RequirementsChecker() +{ +} + +void +RequirementsChecker::run() +{ + bool acceptable = true; + + for (const auto& module : m_modules ) + { + RequirementsList l = module->checkRequirements(); + if ( l.length() > 0 ) + { + cDebug() << " .." << module->name() << "has" << l.length() << "requirements"; + emit requirementsResult( l ); + } + + int count = 0; + for (const auto& r : l) + { + if ( r.mandatory && !r.satisfied ) + { + cDebug() << " .. requirement" << count << r.name << "is not satisfied."; + acceptable = false; + } + ++count; + } + } + + emit requirementsComplete( acceptable ); + + QTimer::singleShot(0, this, &RequirementsChecker::done ); +} + + +} diff --git a/src/libcalamaresui/modulesystem/RequirementsChecker.h b/src/libcalamaresui/modulesystem/RequirementsChecker.h new file mode 100644 index 000000000..61346e750 --- /dev/null +++ b/src/libcalamaresui/modulesystem/RequirementsChecker.h @@ -0,0 +1,66 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ +#ifndef CALAMARES_REQUIREMENTSCHECKER_H +#define CALAMARES_REQUIREMENTSCHECKER_H + +#include +#include + +#include "Requirement.h" + +namespace Calamares +{ + +class Module; + +/** @brief A manager-class that checks all the module requirements + * + * Asynchronously checks the requirements for each module, and + * emits progress signals as appropriate. + */ +class RequirementsChecker : public QObject +{ + Q_OBJECT + +public: + RequirementsChecker( QVector< Module* > modules, QObject* parent = nullptr ); + virtual ~RequirementsChecker() override; + +public slots: + void run(); + +signals: + /// @brief Human-readable progress message + void requirementsProgress( const QString& ); + /// @brief Requirements from a single module + void requirementsResult( RequirementsList& ); + /** @brief When all requirements are collected + * + * The argument indicates if all mandatory requirements are satisfied. + */ + void requirementsComplete( bool ); + /// @brief Emitted after requirementsComplete + void done(); + +private: + QVector< Module* > m_modules; +} ; + +} + +#endif