[plasmalnf] Prepare a new model

- start a model for available themes, to replace the list held
  by the widget which just duplicates information.
- move preselected theme to Config.
This commit is contained in:
Adriaan de Groot 2020-11-12 15:36:29 +01:00
parent cba2733471
commit a19109ed0b
3 changed files with 122 additions and 29 deletions

View File

@ -15,8 +15,99 @@
#include "utils/Logger.h"
#include "utils/Variant.h"
#ifdef WITH_KCONFIG
#include <KConfigGroup>
#include <KSharedConfig>
#endif
#include <KPackage/Package>
#include <KPackage/PackageLoader>
#include <QAbstractListModel>
#include <QList>
class ThemesModel : public QAbstractListModel
{
Q_OBJECT
public:
enum
{
LabelRole = Qt::DisplayRole,
KeyRole = Qt::UserRole
};
explicit ThemesModel( QObject* parent );
int rowCount( const QModelIndex& = QModelIndex() ) const override;
QVariant data( const QModelIndex& index, int role ) const override;
QHash< int, QByteArray > roleNames() const override;
private:
QList< KPluginMetaData > m_themes;
};
ThemesModel::ThemesModel( QObject* parent )
: QAbstractListModel( parent )
, m_themes( KPackage::PackageLoader::self()->listPackages( "Plasma/LookAndFeel" ) )
{
}
int
ThemesModel::rowCount( const QModelIndex& ) const
{
return m_themes.count();
}
QVariant
ThemesModel::data( const QModelIndex& index, int role ) const
{
if ( !index.isValid() )
{
return QVariant();
}
if ( index.row() < 0 || index.row() >= m_themes.count() )
{
return QVariant();
}
const auto& item = m_themes.at( index.row() );
switch ( role )
{
case LabelRole:
return item.name();
case KeyRole:
return item.pluginId();
default:
return QVariant();
}
__builtin_unreachable();
}
QHash< int, QByteArray >
ThemesModel::roleNames() const
{
return { { LabelRole, "label" }, { KeyRole, "key" } };
}
static QString
currentPlasmaTheme()
{
#ifdef WITH_KCONFIG
KConfigGroup cg( KSharedConfig::openConfig( QStringLiteral( "kdeglobals" ) ), "KDE" );
return cg.readEntry( "LookAndFeelPackage", QString() );
#else
cWarning() << "No KConfig support, cannot determine Plasma theme.";
return QString();
#endif
}
Config::Config( QObject* parent )
: QObject( parent )
, m_themeModel( new ThemesModel( this ) )
{
}
@ -31,6 +122,13 @@ Config::setConfigurationMap( const QVariantMap& configurationMap )
}
m_liveUser = CalamaresUtils::getString( configurationMap, "liveuser" );
QString preselect = CalamaresUtils::getString( configurationMap, "preselect" );
if ( preselect == QStringLiteral( "*" ) )
{
preselect = currentPlasmaTheme();
}
m_preselectThemeId = preselect;
}
Calamares::JobList
@ -92,3 +190,7 @@ Config::setTheme( const QString& id )
}
emit themeChanged( id );
}
#include "utils/moc-warnings.h"
#include "Config.moc"

View File

@ -14,15 +14,19 @@
#include <QObject>
class QAbstractItemModel;
class Config : public QObject
{
Q_OBJECT
Q_PROPERTY( QString preselectedTheme READ preselectedTheme CONSTANT )
Q_PROPERTY( QString theme READ theme WRITE setTheme NOTIFY themeChanged )
Q_PROPERTY( QAbstractItemModel* themeModel READ themeModel CONSTANT )
public:
Config( QObject* parent = nullptr );
virtual ~Config() override = default;
virtual ~Config() override = default; // QObject cleans up the model pointer
void setConfigurationMap( const QVariantMap& );
Calamares::JobList createJobs() const;
@ -42,6 +46,17 @@ public:
*/
QString theme() const { return m_themeId; }
/** @brief The theme we start with
*
* This can be configured, or is taken from the live environment
* if the environment is (also) KDE Plasma.
*/
QString preselectedTheme() const { return m_preselectThemeId; }
/** @brief The (list) model of available themes.
*/
QAbstractItemModel* themeModel() const { return m_themeModel; }
public slots:
void setTheme( const QString& id );
@ -52,7 +67,10 @@ private:
QString m_lnfPath; // Path to the lnf tool
QString m_liveUser; // Name of the live user (for OEM mode)
QString m_preselectThemeId;
QString m_themeId; // Id of selected theme
QAbstractItemModel* m_themeModel = nullptr;
};
#endif

View File

@ -15,28 +15,10 @@
#include "utils/Logger.h"
#include "utils/Variant.h"
#include <QProcess>
#include <QVariantMap>
#ifdef WITH_KCONFIG
#include <KConfigGroup>
#include <KSharedConfig>
#endif
CALAMARES_PLUGIN_FACTORY_DEFINITION( PlasmaLnfViewStepFactory, registerPlugin< PlasmaLnfViewStep >(); )
static QString
currentPlasmaTheme()
{
#ifdef WITH_KCONFIG
KConfigGroup cg( KSharedConfig::openConfig( QStringLiteral( "kdeglobals" ) ), "KDE" );
return cg.readEntry( "LookAndFeelPackage", QString() );
#else
cWarning() << "No KConfig support, cannot determine Plasma theme.";
return QString();
#endif
}
PlasmaLnfViewStep::PlasmaLnfViewStep( QObject* parent )
: Calamares::ViewStep( parent )
, m_config( new Config( this ) )
@ -117,16 +99,7 @@ PlasmaLnfViewStep::setConfigurationMap( const QVariantMap& configurationMap )
m_config->setConfigurationMap( configurationMap );
m_widget->setLnfPath( m_config->lnfToolPath() );
QString preselect = CalamaresUtils::getString( configurationMap, "preselect" );
if ( preselect == QStringLiteral( "*" ) )
{
preselect = currentPlasmaTheme();
}
if ( !preselect.isEmpty() )
{
m_widget->setPreselect( preselect );
}
m_widget->setPreselect( m_config->preselectedTheme() );
bool showAll = CalamaresUtils::getBool( configurationMap, "showAll", false );