diff --git a/src/libcalamaresui/CMakeLists.txt b/src/libcalamaresui/CMakeLists.txt
index 6bbb285bb..efd0ebb29 100644
--- a/src/libcalamaresui/CMakeLists.txt
+++ b/src/libcalamaresui/CMakeLists.txt
@@ -15,6 +15,7 @@ set( calamaresui_SOURCES
utils/qjsonitem.cpp
viewpages/AbstractPage.cpp
+ viewpages/BlankViewStep.cpp
viewpages/ViewStep.cpp
widgets/ClickableLabel.cpp
diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp
index e597bf6a3..8777f79d7 100644
--- a/src/libcalamaresui/ViewManager.cpp
+++ b/src/libcalamaresui/ViewManager.cpp
@@ -20,6 +20,7 @@
#include "ViewManager.h"
#include "utils/Logger.h"
+#include "viewpages/BlankViewStep.h"
#include "viewpages/ViewStep.h"
#include "ExecutionViewStep.h"
#include "JobQueue.h"
@@ -172,6 +173,20 @@ ViewManager::onInstallationFailed( const QString& message, const QString& detail
}
+void
+ViewManager::onInitFailed( const QStringList& modules)
+{
+ QString title( tr( "Calamares Initialization Failed" ) );
+ QString description( tr( "Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 can not be installed." ) );
+ QStringList details;
+ details << QLatin1Literal("
");
+ for( const auto& m : modules )
+ details << QLatin1Literal("- ") << m << QLatin1Literal("
");
+ details << QLatin1Literal("
");
+
+ insertViewStep( 0, new BlankViewStep( title, description.arg( *Calamares::Branding::ShortProductName ), details.join( QString() ) ) );
+}
+
ViewStepList
ViewManager::viewSteps() const
{
diff --git a/src/libcalamaresui/ViewManager.h b/src/libcalamaresui/ViewManager.h
index e4f215f8f..ee199f725 100644
--- a/src/libcalamaresui/ViewManager.h
+++ b/src/libcalamaresui/ViewManager.h
@@ -117,6 +117,12 @@ public slots:
*/
void onInstallationFailed( const QString& message, const QString& details );
+ /** @brief Replaces the stack with a view step stating that initialization failed.
+ *
+ * @param modules a list of failed modules.
+ */
+ void onInitFailed( const QStringList& modules );
+
signals:
void currentStepChanged();
void enlarge( QSize enlarge ) const; // See ViewStep::enlarge()
diff --git a/src/libcalamaresui/modulesystem/ModuleManager.cpp b/src/libcalamaresui/modulesystem/ModuleManager.cpp
index 194db65a2..6361fa20b 100644
--- a/src/libcalamaresui/modulesystem/ModuleManager.cpp
+++ b/src/libcalamaresui/modulesystem/ModuleManager.cpp
@@ -296,7 +296,10 @@ ModuleManager::loadModules()
}
}
if ( !failedModules.isEmpty() )
+ {
+ ViewManager::instance()->onInitFailed( failedModules );
emit modulesFailed( failedModules );
+ }
else
emit modulesLoaded();
} );
diff --git a/src/libcalamaresui/viewpages/BlankViewStep.cpp b/src/libcalamaresui/viewpages/BlankViewStep.cpp
new file mode 100644
index 000000000..093d19d8b
--- /dev/null
+++ b/src/libcalamaresui/viewpages/BlankViewStep.cpp
@@ -0,0 +1,113 @@
+/* === This file is part of Calamares - ===
+ *
+ * Copyright 2018, 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 "BlankViewStep.h"
+
+#include "utils/CalamaresUtilsGui.h"
+
+#include
+#include
+#include
+
+namespace Calamares
+{
+
+BlankViewStep::BlankViewStep( const QString& title, const QString& description, const QString& details, QObject* parent)
+ : Calamares::ViewStep( parent )
+ , m_widget( new QWidget() )
+{
+ QBoxLayout* layout = new QVBoxLayout();
+
+ auto* label = new QLabel( title );
+ label->setAlignment( Qt::AlignHCenter );
+ label->setFont( CalamaresUtils::largeFont() );
+ layout->addWidget( label );
+
+ label = new QLabel( description );
+ label->setWordWrap( true );
+ layout->addSpacing( 10 );
+ layout->addWidget( label );
+
+ if ( !details.isEmpty() )
+ {
+ label = new QLabel( details );
+ layout->addSpacing( 10 );
+ layout->addWidget( label );
+ }
+
+ layout->addStretch( 10 );
+
+ m_widget->setLayout( layout );
+}
+
+BlankViewStep::~BlankViewStep()
+{
+}
+
+QString
+BlankViewStep::prettyName() const
+{
+ return tr( "Blank Page" );
+}
+
+void
+BlankViewStep::back()
+{
+}
+
+void
+BlankViewStep::next()
+{
+}
+
+bool
+BlankViewStep::isBackEnabled() const
+{
+ return false;
+}
+
+bool
+BlankViewStep::isNextEnabled() const
+{
+ return false;
+}
+
+bool
+BlankViewStep::isAtBeginning() const
+{
+ return true;
+}
+
+bool
+BlankViewStep::isAtEnd() const
+{
+ return false;
+}
+
+QWidget*
+BlankViewStep::widget()
+{
+ return m_widget;
+}
+
+Calamares::JobList
+BlankViewStep::jobs() const
+{
+ return JobList();
+}
+
+} // namespace
diff --git a/src/libcalamaresui/viewpages/BlankViewStep.h b/src/libcalamaresui/viewpages/BlankViewStep.h
new file mode 100644
index 000000000..5e6938143
--- /dev/null
+++ b/src/libcalamaresui/viewpages/BlankViewStep.h
@@ -0,0 +1,70 @@
+/* === This file is part of Calamares - ===
+ *
+ * Copyright 2018, 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 BLANKVIEWSTEP_H
+#define BLANKVIEWSTEP_H
+
+#include
+
+#include
+#include
+
+class QWidget;
+
+namespace Calamares
+{
+
+/** @brief A "blank" view step, used for error and status reporting
+ *
+ *
+ */
+class BlankViewStep : public Calamares::ViewStep
+{
+ Q_OBJECT
+
+public:
+ explicit BlankViewStep( const QString& title, const QString& description, const QString& details = QString(), QObject* parent = nullptr );
+ virtual ~BlankViewStep() override;
+
+ QString prettyName() const override;
+
+ QWidget* widget() override;
+
+ void next() override;
+ void back() override;
+
+ bool isNextEnabled() const override;
+ bool isBackEnabled() const override;
+
+ bool isAtBeginning() const override;
+ bool isAtEnd() const override;
+
+ Calamares::JobList jobs() const override;
+#if 0
+ void onActivate() override;
+
+
+ void setConfigurationMap( const QVariantMap& configurationMap ) override;
+#endif
+
+private:
+ QWidget* m_widget;
+};
+
+} // namespace
+#endif // BLANKVIEWSTEP_H