Major ViewStep additions and changes.

Renamed ViewPlugin to ViewStep.
Back/Next button status management.
Subpages are now under a ViewStep's jurisdiction, we only forward back/
next signals if a ViewStep says it's got more pages to show. ViewStep
exposes a QWidget* to ViewManager, this QWidget gets added to a stack.
If a ViewStep wishes to show more than one page, it must manage more
pages on its own inside its single QWidget*.
This commit is contained in:
Teo Mrnjavac 2014-06-27 18:00:27 +02:00
parent f1da3373a8
commit 20d5a37fef
12 changed files with 168 additions and 67 deletions

View file

@ -18,7 +18,7 @@ set( calamaresSources
modulesystem/ModuleManager.cpp
modulesystem/ViewModule.cpp
viewpages/ViewPlugin.cpp
viewpages/ViewStep.cpp
viewpages/AbstractPage.cpp
)

View file

@ -33,5 +33,5 @@ CalamaresWindow::CalamaresWindow( QWidget* parent )
//should control the sidebar, next/back buttons and QSW.
Calamares::ViewManager* vm = new Calamares::ViewManager( this );
layout()->addWidget( vm->widget() );
layout()->addWidget( vm->centralWidget() );
}

View file

@ -36,6 +36,7 @@ ViewManager::instance()
ViewManager::ViewManager( QObject* parent )
: QObject( parent )
, m_widget( new QWidget() )
, m_currentStep( 0 )
{
s_instance = this;
QBoxLayout* mainLayout = new QVBoxLayout;
@ -60,7 +61,11 @@ ViewManager::ViewManager( QObject* parent )
bottomLayout->addWidget( m_next );
bottomLayout->addSpacing( 12 );
bottomLayout->addWidget( m_quit );
connect( m_quit, &QPushButton::clicked, qApp, &QApplication::quit );
connect( m_next, &QPushButton::clicked, this, &ViewManager::next );
connect( m_back, &QPushButton::clicked, this, &ViewManager::back );
m_back->setEnabled( false );
}
@ -71,53 +76,62 @@ ViewManager::~ViewManager()
QWidget*
ViewManager::widget()
ViewManager::centralWidget()
{
return m_widget;
}
void
ViewManager::addViewPlugin( ViewPlugin* plugin )
{
plugin->setParent( this );
m_steps.append( plugin );
m_stack->addWidget( new QLabel( plugin->prettyName(), m_stack ) );
}
void
ViewManager::insertPage( AbstractPage* page )
{
}
void
ViewManager::setNext( AbstractPage* page )
{
}
void
ViewManager::removePage( AbstractPage* page )
ViewManager::addViewStep( ViewStep* step )
{
step->setParent( this );
m_steps.append( step );
m_stack->addWidget( step->widget() );
connect( step, &ViewStep::nextStatusChanged,
m_next, &QPushButton::setEnabled );
}
void
ViewManager::next()
{
Q_ASSERT( 0 );
ViewStep* step = m_steps.at( m_currentStep );
if ( step->isAtEnd() && m_currentStep < m_steps.length() -1 )
{
m_currentStep++;
m_stack->setCurrentIndex( m_currentStep );
}
else if ( !step->isAtEnd() )
{
step->next();
}
else return;
m_next->setEnabled( step->isNextEnabled() );
m_back->setEnabled( true );
}
void
ViewManager::back()
{
Q_ASSERT( 0 );
ViewStep* step = m_steps.at( m_currentStep );
if ( step->isAtBeginning() && m_currentStep > 0 )
{
m_currentStep--;
m_stack->setCurrentIndex( m_currentStep );
}
else if ( !step->isAtBeginning() )
{
step->back();
}
else return;
m_next->setEnabled( step->isNextEnabled() );
if ( m_currentStep == 0 && m_steps.first()->isAtBeginning() )
m_back->setEnabled( false );
}
}

View file

@ -20,7 +20,7 @@
#define VIEWMANAGER_H
#include "UiDllMacro.h"
#include "viewpages/ViewPlugin.h"
#include "viewpages/ViewStep.h"
#include <QPushButton>
#include <QQueue>
@ -39,13 +39,10 @@ public:
explicit ViewManager( QObject* parent = nullptr );
virtual ~ViewManager();
QWidget* widget();
QWidget* centralWidget();
void addViewPlugin( ViewPlugin* plugin );
void addViewStep( ViewStep* step );
void insertPage( AbstractPage* page );
void setNext( AbstractPage* page );
void removePage( AbstractPage* page );
public slots:
void next();
@ -54,7 +51,8 @@ public slots:
private:
static ViewManager* s_instance;
QQueue< ViewPlugin* > m_steps;
QQueue< ViewStep* > m_steps;
int m_currentStep;
QWidget* m_widget;
QStackedWidget* m_stack;

View file

@ -19,7 +19,7 @@
#include "ViewModule.h"
#include "utils/Logger.h"
#include "viewpages/ViewPlugin.h"
#include "viewpages/ViewStep.h"
#include "ViewManager.h"
#include <yaml-cpp/yaml.h>
@ -50,10 +50,10 @@ ViewModule::loadSelf()
cDebug() << Q_FUNC_INFO << "for module" << name();
if ( m_loader )
{
ViewPlugin *vp = qobject_cast< ViewPlugin* >( m_loader->instance() );
if ( vp )
ViewStep *vs = qobject_cast< ViewStep* >( m_loader->instance() );
if ( vs )
{
ViewManager::instance()->addViewPlugin( vp );
ViewManager::instance()->addViewStep( vs );
m_loaded = true;
}
}

View file

@ -16,14 +16,16 @@
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ViewPlugin.h"
#include "ViewStep.h"
namespace Calamares
{
ViewPlugin::ViewPlugin( QObject* parent )
ViewStep::ViewStep( QObject* parent )
: QObject( parent )
{
}
{}
ViewStep::~ViewStep()
{}
}

View file

@ -26,24 +26,34 @@
namespace Calamares
{
class AbstractPage;
class UIDLLEXPORT ViewPlugin : public QObject
class UIDLLEXPORT ViewStep : public QObject
{
Q_OBJECT
public:
explicit ViewPlugin( QObject *parent = nullptr );
virtual ~ViewPlugin() {}
explicit ViewStep( QObject *parent = nullptr );
virtual ~ViewStep();
virtual QString prettyName() = 0;
//TODO: we might want to make this a QSharedPointer
virtual QWidget* widget() = 0;
virtual void next() = 0;
virtual void back() = 0;
virtual bool isNextEnabled() = 0;
virtual bool isAtBeginning() = 0;
virtual bool isAtEnd() = 0;
signals:
void nextStatusChanged( bool status );
void done();
};
}
Q_DECLARE_INTERFACE( Calamares::ViewPlugin, "calamares.ViewPlugin/1.0" )
Q_DECLARE_INTERFACE( Calamares::ViewStep, "calamares.ViewModule/1.0" )
#endif // PAGEPLUGIN_H

View file

@ -4,7 +4,7 @@ calamares_add_plugin( greeting
EXPORT_MACRO PLUGINDLLEXPORT_PRO
CONFIG_FILE module.conf
SOURCES
GreetingViewPlugin.cpp
GreetingViewStep.cpp
GreetingPage.cpp
UI
LINK_LIBRARIES

View file

@ -18,8 +18,22 @@
#include "GreetingPage.h"
#include <QBoxLayout>
#include <QLabel>
GreetingPage::GreetingPage( QWidget* parent )
: Calamares::AbstractPage( parent )
: QWidget()
{
QBoxLayout *mainLayout = new QHBoxLayout;
setLayout( mainLayout );
QLabel* text = new QLabel( tr( "<h1>Welcome to Calamares.</h1><br/>"
"This is some random welcome text. "
"It should change depending on the branding config." ), this );
text->setAlignment( Qt::AlignCenter );
mainLayout->addStretch();
mainLayout->addWidget( text );
mainLayout->addStretch();
}

View file

@ -19,18 +19,14 @@
#ifndef GREETINGPAGE_H
#define GREETINGPAGE_H
#include "viewpages/AbstractPage.h"
#include <QWidget>
class GreetingPage : public Calamares::AbstractPage
class GreetingPage : public QWidget
{
Q_OBJECT
public:
explicit GreetingPage( QWidget* parent = nullptr );
signals:
public slots:
};
#endif // GREETINGPAGE_H

View file

@ -16,17 +16,68 @@
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#include "GreetingViewPlugin.h"
#include "GreetingViewStep.h"
#include "GreetingPage.h"
GreetingViewPlugin::GreetingViewPlugin( QObject *parent )
: Calamares::ViewPlugin( parent )
GreetingViewStep::GreetingViewStep( QObject* parent )
: Calamares::ViewStep( parent )
, m_widget( new GreetingPage() )
{
emit nextStatusChanged( true );
}
GreetingViewStep::~GreetingViewStep()
{
if ( m_widget && m_widget->parent() == nullptr )
m_widget->deleteLater();
}
QString
GreetingViewPlugin::prettyName()
GreetingViewStep::prettyName()
{
return tr( "Welcome" );
}
QWidget*
GreetingViewStep::widget()
{
return m_widget;
}
void
GreetingViewStep::next()
{
emit done();
}
void
GreetingViewStep::back()
{}
bool
GreetingViewStep::isNextEnabled()
{
return true;
}
bool
GreetingViewStep::isAtBeginning()
{
return true;
}
bool
GreetingViewStep::isAtEnd()
{
return true;
}

View file

@ -21,20 +21,36 @@
#include <QObject>
#include "viewpages/ViewPlugin.h"
#include "viewpages/ViewStep.h"
#include "PluginDllMacro.h"
class PLUGINDLLEXPORT GreetingViewPlugin : public Calamares::ViewPlugin
class GreetingPage;
class PLUGINDLLEXPORT GreetingViewStep : public Calamares::ViewStep
{
Q_OBJECT
Q_PLUGIN_METADATA( IID "calamares.ViewPlugin/1.0" )
Q_PLUGIN_METADATA( IID "calamares.ViewModule/1.0" )
Q_INTERFACES( Calamares::ViewPlugin )
Q_INTERFACES( Calamares::ViewStep )
public:
explicit GreetingViewPlugin( QObject* parent = nullptr );
explicit GreetingViewStep( QObject* parent = nullptr );
virtual ~GreetingViewStep();
QString prettyName() override;
QWidget* widget() override;
void next() override;
void back() override;
bool isNextEnabled() override;
bool isAtBeginning() override;
bool isAtEnd() override;
private:
GreetingPage* m_widget;
};
#endif // GREETINGPAGEPLUGIN_H