[libcalamaresui] Create the slideshow on activation

- Load QML on startup, compile async
 - Create QML component when the page is reached.
 - On leave, stop the slideshow (otherwise, e.g. timers will keep running)

This should move some of the delay from loading a large
slideshow forward as the engine is already initialized when
we reach the install / slideshow page.
main
Adriaan de Groot 6 years ago
parent daf2e55246
commit 103decab68

@ -36,6 +36,7 @@
#include <QDir> #include <QDir>
#include <QLabel> #include <QLabel>
#include <QProgressBar> #include <QProgressBar>
#include <QQmlComponent>
#include <QQmlEngine> #include <QQmlEngine>
#include <QQuickWidget> #include <QQuickWidget>
#include <QVBoxLayout> #include <QVBoxLayout>
@ -49,7 +50,8 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent )
, m_progressBar( new QProgressBar ) , m_progressBar( new QProgressBar )
, m_label( new QLabel ) , m_label( new QLabel )
, m_qmlShow( new QQuickWidget ) , m_qmlShow( new QQuickWidget )
, m_qmlShowLoaded( false ) , m_qmlComponent( nullptr )
, m_qmlObject( nullptr )
{ {
QVBoxLayout* layout = new QVBoxLayout( m_widget ); QVBoxLayout* layout = new QVBoxLayout( m_widget );
QVBoxLayout* innerLayout = new QVBoxLayout; QVBoxLayout* innerLayout = new QVBoxLayout;
@ -72,11 +74,6 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent )
loadQml(); loadQml();
connect( JobQueue::instance(), &JobQueue::progress, this, &ExecutionViewStep::updateFromJobQueue ); connect( JobQueue::instance(), &JobQueue::progress, this, &ExecutionViewStep::updateFromJobQueue );
CALAMARES_RETRANSLATE_WIDGET( m_widget,
if ( m_qmlShowLoaded )
m_qmlShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ) );
)
} }
@ -138,10 +135,12 @@ ExecutionViewStep::isAtEnd() const
void void
ExecutionViewStep::loadQml() ExecutionViewStep::loadQml()
{ {
if ( !m_qmlShowLoaded && !Calamares::Branding::instance()->slideshowPath().isEmpty() ) if ( !m_qmlComponent && !Calamares::Branding::instance()->slideshowPath().isEmpty() )
{ {
m_qmlShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ) ); m_qmlComponent = new QQmlComponent( m_qmlShow->engine(),
m_qmlShowLoaded = true; QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ),
QQmlComponent::CompilationMode::Asynchronous
);
} }
} }
@ -149,6 +148,12 @@ void
ExecutionViewStep::onActivate() ExecutionViewStep::onActivate()
{ {
loadQml(); loadQml();
if ( m_qmlComponent )
{
m_qmlObject = m_qmlComponent->create();
cDebug() << "Created QML object" << (void *)m_qmlObject << m_qmlObject->objectName();
cDebug() << "Show root" << m_qmlShow->rootObject() << "context" << m_qmlShow->rootContext();
}
JobQueue* queue = JobQueue::instance(); JobQueue* queue = JobQueue::instance();
foreach ( const QString& instanceKey, m_jobInstanceKeys ) foreach ( const QString& instanceKey, m_jobInstanceKeys )
@ -191,4 +196,11 @@ ExecutionViewStep::updateFromJobQueue( qreal percent, const QString& message )
m_label->setText( message ); m_label->setText( message );
} }
void
ExecutionViewStep::onLeave()
{
delete m_qmlObject;
m_qmlObject = nullptr;
}
} // namespace } // namespace

@ -25,8 +25,10 @@
#include <QStringList> #include <QStringList>
class QLabel; class QLabel;
class QObject;
class QProgressBar; class QProgressBar;
class QQuickWidget; class QQuickWidget;
class QQmlComponent;
namespace Calamares namespace Calamares
{ {
@ -51,6 +53,7 @@ public:
bool isAtEnd() const override; bool isAtEnd() const override;
void onActivate() override; void onActivate() override;
void onLeave() override;
JobList jobs() const override; JobList jobs() const override;
@ -61,7 +64,8 @@ private:
QProgressBar* m_progressBar; QProgressBar* m_progressBar;
QLabel* m_label; QLabel* m_label;
QQuickWidget* m_qmlShow; QQuickWidget* m_qmlShow;
bool m_qmlShowLoaded; QQmlComponent* m_qmlComponent;
QObject* m_qmlObject; //< The actual show
QStringList m_jobInstanceKeys; QStringList m_jobInstanceKeys;

Loading…
Cancel
Save