[plasmalnf] Rip out most of the widget

- put a filter model in place, so only the themes with "show" set
  are displayed
- rip out the messing about with widgets, soon to introduce a model-
  based UI
main
Adriaan de Groot 4 years ago
parent d4887426e2
commit aaa56b6903

@ -21,6 +21,8 @@
#include <KSharedConfig>
#endif
#include <QSortFilterProxyModel>
static QString
currentPlasmaTheme()
{
@ -33,11 +35,16 @@ currentPlasmaTheme()
#endif
}
Config::Config( QObject* parent )
: QObject( parent )
, m_themeModel( new ThemesModel( this ) )
{
auto* filter = new QSortFilterProxyModel( m_themeModel );
filter->setFilterRole( ThemesModel::ShownRole );
filter->setFilterFixedString( QStringLiteral( "true" ) );
filter->setSourceModel( m_themeModel );
m_filteredModel = filter;
}
void

@ -55,7 +55,7 @@ public:
/** @brief The (list) model of available themes.
*/
QAbstractItemModel* themeModel() const { return m_themeModel; }
QAbstractItemModel* themeModel() const { return m_filteredModel; }
public slots:
void setTheme( const QString& id );
@ -70,6 +70,7 @@ private:
QString m_preselectThemeId;
QString m_themeId; // Id of selected theme
QAbstractItemModel* m_filteredModel = nullptr;
ThemesModel* m_themeModel = nullptr;
};

@ -10,6 +10,7 @@
#include "PlasmaLnfPage.h"
#include "Config.h"
#include "ui_page_plasmalnf.h"
#include "Settings.h"
@ -21,30 +22,10 @@
#include <KPackage/Package>
#include <KPackage/PackageLoader>
static ThemeInfoList
plasma_themes()
{
ThemeInfoList packages;
QList< KPluginMetaData > pkgs = KPackage::PackageLoader::self()->listPackages( "Plasma/LookAndFeel" );
for ( const KPluginMetaData& data : pkgs )
{
if ( data.isValid() && !data.isHidden() && !data.name().isEmpty() )
{
packages << ThemeInfo { data };
}
}
return packages;
}
PlasmaLnfPage::PlasmaLnfPage( QWidget* parent )
PlasmaLnfPage::PlasmaLnfPage( Config* config, QWidget* parent )
: QWidget( parent )
, ui( new Ui::PlasmaLnfPage )
, m_showAll( false )
, m_buttonGroup( nullptr )
, m_config( config )
{
ui->setupUi( this );
CALAMARES_RETRANSLATE( {
@ -59,128 +40,6 @@ PlasmaLnfPage::PlasmaLnfPage( QWidget* parent )
"You can also skip this step and configure the look-and-feel "
"once the system is installed. Clicking on a look-and-feel "
"selection will give you a live preview of that look-and-feel." ) );
updateThemeNames();
fillUi();
} )
}
void
PlasmaLnfPage::setEnabledThemes( const ThemeInfoList& themes, bool showAll )
{
m_enabledThemes = themes;
if ( showAll )
{
auto plasmaThemes = plasma_themes();
for ( auto& installed_theme : plasmaThemes )
if ( !m_enabledThemes.findById( installed_theme.id ) )
{
m_enabledThemes.append( installed_theme );
}
}
updateThemeNames();
winnowThemes();
fillUi();
}
void
PlasmaLnfPage::setEnabledThemesAll()
{
// Don't need to set showAll=true, because we're already passing in
// the complete list of installed themes.
setEnabledThemes( plasma_themes(), false );
}
void
PlasmaLnfPage::setPreselect( const QString& id )
{
m_preselect = id;
if ( !m_enabledThemes.isEmpty() )
{
fillUi();
}
}
void
PlasmaLnfPage::updateThemeNames()
{
auto plasmaThemes = plasma_themes();
for ( auto& enabled_theme : m_enabledThemes )
{
ThemeInfo* t = plasmaThemes.findById( enabled_theme.id );
if ( t != nullptr )
{
enabled_theme.name = t->name;
enabled_theme.description = t->description;
}
}
}
void
PlasmaLnfPage::winnowThemes()
{
auto plasmaThemes = plasma_themes();
bool winnowed = true;
int winnow_index = 0;
while ( winnowed )
{
winnowed = false;
winnow_index = 0;
for ( auto& enabled_theme : m_enabledThemes )
{
ThemeInfo* t = plasmaThemes.findById( enabled_theme.id );
if ( t == nullptr )
{
cDebug() << "Removing" << enabled_theme.id;
winnowed = true;
break;
}
++winnow_index;
}
if ( winnowed )
{
m_enabledThemes.removeAt( winnow_index );
}
}
}
void
PlasmaLnfPage::fillUi()
{
if ( m_enabledThemes.isEmpty() )
{
return;
}
if ( !m_buttonGroup )
{
m_buttonGroup = new QButtonGroup( this );
m_buttonGroup->setExclusive( true );
}
int c = 1; // After the general explanation
for ( auto& theme : m_enabledThemes )
{
if ( !theme.widget )
{
ThemeWidget* w = new ThemeWidget( theme );
m_buttonGroup->addButton( w->button() );
ui->verticalLayout->insertWidget( c, w );
connect( w, &ThemeWidget::themeSelected, this, &PlasmaLnfPage::plasmaThemeSelected );
theme.widget = w;
}
else
{
theme.widget->updateThemeName( theme );
}
if ( theme.id == m_preselect )
{
const QSignalBlocker b( theme.widget->button() );
theme.widget->button()->setChecked( true );
}
++c;
}
connect( this, &PlasmaLnfPage::plasmaThemeSelected, config, &Config::setTheme );
}

@ -24,6 +24,8 @@ namespace Ui
class PlasmaLnfPage;
}
class Config;
/** @brief Page for selecting a Plasma Look-and-Feel theme.
*
* You must call setEnabledThemes -- either overload -- once
@ -34,38 +36,14 @@ class PlasmaLnfPage : public QWidget
{
Q_OBJECT
public:
explicit PlasmaLnfPage( QWidget* parent = nullptr );
/** @brief enable only the listed themes.
*
* Shows the listed @p themes with full information (e.g. screenshot).
* If @p showAll is true, then also show all installed themes
* not explicitly listed (without a screenshot).
*/
void setEnabledThemes( const ThemeInfoList& themes, bool showAll );
/** @brief enable all installed plasma themes. */
void setEnabledThemesAll();
/** @brief set which theme is to be preselected. */
void setPreselect( const QString& id );
explicit PlasmaLnfPage( Config* config, QWidget* parent = nullptr );
signals:
void plasmaThemeSelected( const QString& id );
private:
/** @brief Intersect the list of enabled themes with the installed ones. */
void winnowThemes();
/** @brief Get the translated names for all enabled themes. */
void updateThemeNames();
/** @brief show enabled themes in the UI. */
void fillUi();
Ui::PlasmaLnfPage* ui;
QString m_preselect;
bool m_showAll; // If true, don't winnow according to enabledThemes
ThemeInfoList m_enabledThemes;
QButtonGroup* m_buttonGroup;
QList< ThemeWidget* > m_widgets;
Config* m_config;
};
#endif //PLASMALNFPAGE_H

@ -22,9 +22,8 @@ CALAMARES_PLUGIN_FACTORY_DEFINITION( PlasmaLnfViewStepFactory, registerPlugin< P
PlasmaLnfViewStep::PlasmaLnfViewStep( QObject* parent )
: Calamares::ViewStep( parent )
, m_config( new Config( this ) )
, m_widget( new PlasmaLnfPage )
, m_widget( new PlasmaLnfPage( m_config ) )
{
connect( m_widget, &PlasmaLnfPage::plasmaThemeSelected, m_config, &Config::setTheme );
emit nextStatusChanged( false );
}
@ -97,37 +96,4 @@ void
PlasmaLnfViewStep::setConfigurationMap( const QVariantMap& configurationMap )
{
m_config->setConfigurationMap( configurationMap );
m_widget->setPreselect( m_config->preselectedTheme() );
bool showAll = CalamaresUtils::getBool( configurationMap, "showAll", false );
if ( configurationMap.contains( "themes" ) && configurationMap.value( "themes" ).type() == QVariant::List )
{
ThemeInfoList listedThemes;
auto themeList = configurationMap.value( "themes" ).toList();
// Create the ThemInfo objects for the listed themes; information
// about the themes from Plasma (e.g. human-readable name and description)
// are filled in by update_names() in PlasmaLnfPage.
for ( const auto& i : themeList )
if ( i.type() == QVariant::Map )
{
auto iv = i.toMap();
listedThemes.append( ThemeInfo( iv.value( "theme" ).toString(), iv.value( "image" ).toString() ) );
}
else if ( i.type() == QVariant::String )
{
listedThemes.append( ThemeInfo( i.toString() ) );
}
if ( listedThemes.length() == 1 )
{
cWarning() << "only one theme enabled in plasmalnf";
}
m_widget->setEnabledThemes( listedThemes, showAll );
}
else
{
m_widget->setEnabledThemesAll(); // All of them
}
}

@ -48,6 +48,8 @@ ThemesModel::data( const QModelIndex& index, int role ) const
return item.name;
case KeyRole:
return item.id;
case ShownRole:
return item.show;
default:
return QVariant();
}

@ -97,7 +97,8 @@ public:
enum
{
LabelRole = Qt::DisplayRole,
KeyRole = Qt::UserRole
KeyRole = Qt::UserRole,
ShownRole
};
explicit ThemesModel( QObject* parent );

Loading…
Cancel
Save