2014-10-31 06:53:04 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2014 Martin Gräßlin <mgraesslin@kde.org>
|
|
|
|
*
|
|
|
|
* This program 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 2 of
|
|
|
|
* the License or (at your option) version 3 or any later version
|
|
|
|
* accepted by the membership of KDE e.V. (or its successor approved
|
|
|
|
* by the membership of KDE e.V.), which shall act as a proxy
|
|
|
|
* defined in Section 14 of version 3 of the license.
|
|
|
|
*
|
|
|
|
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
2010-01-19 13:44:22 +00:00
|
|
|
#include "decorationmodel.h"
|
2014-10-31 06:53:04 +00:00
|
|
|
// KDecoration2
|
|
|
|
#include <KDecoration2/DecorationSettings>
|
|
|
|
#include <KDecoration2/Decoration>
|
2010-01-19 13:44:22 +00:00
|
|
|
// KDE
|
2012-07-27 08:10:28 +00:00
|
|
|
#include <KPluginInfo>
|
2014-10-31 06:53:04 +00:00
|
|
|
#include <KPluginLoader>
|
|
|
|
#include <KPluginFactory>
|
2014-03-12 13:53:43 +00:00
|
|
|
#include <KPluginTrader>
|
2014-10-31 06:53:04 +00:00
|
|
|
// Qt
|
|
|
|
#include <QDebug>
|
2014-03-12 13:53:43 +00:00
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
namespace KDecoration2
|
2010-01-19 13:44:22 +00:00
|
|
|
{
|
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
namespace Configuration
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2014-10-31 06:53:04 +00:00
|
|
|
static const QString s_pluginName = QStringLiteral("org.kde.kdecoration2");
|
2010-01-19 13:44:22 +00:00
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
DecorationsModel::DecorationsModel(QObject *parent)
|
|
|
|
: QAbstractListModel(parent)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
}
|
2010-01-19 13:44:22 +00:00
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
DecorationsModel::~DecorationsModel() = default;
|
2010-01-19 13:44:22 +00:00
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
int DecorationsModel::rowCount(const QModelIndex &parent) const
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2014-10-31 06:53:04 +00:00
|
|
|
if (parent.isValid()) {
|
|
|
|
return 0;
|
2010-01-19 13:44:22 +00:00
|
|
|
}
|
2014-10-31 06:53:04 +00:00
|
|
|
return m_plugins.size();
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-01-19 13:44:22 +00:00
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
QVariant DecorationsModel::data(const QModelIndex &index, int role) const
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2014-10-31 06:53:04 +00:00
|
|
|
if (!index.isValid() || index.column() != 0 || index.row() < 0 || index.row() >= int(m_plugins.size())) {
|
|
|
|
return QVariant();
|
2013-10-01 10:28:34 +00:00
|
|
|
}
|
2014-10-31 06:53:04 +00:00
|
|
|
const Data &d = m_plugins.at(index.row());
|
|
|
|
switch (role) {
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
return d.visibleName;
|
|
|
|
case Qt::UserRole +4:
|
|
|
|
return d.pluginName;
|
|
|
|
case Qt::UserRole +5:
|
|
|
|
return d.themeName;
|
2014-12-05 12:44:16 +00:00
|
|
|
case Qt::UserRole +6:
|
|
|
|
return d.configuration;
|
2013-08-03 20:34:58 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
return QVariant();
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-01-19 13:44:22 +00:00
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
QHash< int, QByteArray > DecorationsModel::roleNames() const
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2014-10-31 06:53:04 +00:00
|
|
|
QHash<int, QByteArray> roles({
|
|
|
|
{Qt::DisplayRole, QByteArrayLiteral("display")},
|
|
|
|
{Qt::UserRole + 4, QByteArrayLiteral("plugin")},
|
2014-12-05 12:44:16 +00:00
|
|
|
{Qt::UserRole + 5, QByteArrayLiteral("theme")},
|
|
|
|
{Qt::UserRole +6, QByteArrayLiteral("configureable")}
|
2014-10-31 06:53:04 +00:00
|
|
|
});
|
|
|
|
return roles;
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
static bool isThemeEngine(const QVariantMap &decoSettingsMap)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2014-10-31 06:53:04 +00:00
|
|
|
auto it = decoSettingsMap.find(QStringLiteral("themes"));
|
|
|
|
if (it == decoSettingsMap.end()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return it.value().toBool();
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-01-19 13:44:22 +00:00
|
|
|
|
2014-12-05 12:44:16 +00:00
|
|
|
static bool isConfigureable(const QVariantMap &decoSettingsMap)
|
|
|
|
{
|
|
|
|
auto it = decoSettingsMap.find(QStringLiteral("kcmodule"));
|
|
|
|
if (it == decoSettingsMap.end()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return it.value().toBool();
|
|
|
|
}
|
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
static QString themeListKeyword(const QVariantMap &decoSettingsMap)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2014-10-31 06:53:04 +00:00
|
|
|
auto it = decoSettingsMap.find(QStringLiteral("themeListKeyword"));
|
|
|
|
if (it == decoSettingsMap.end()) {
|
|
|
|
return QString();
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2014-10-31 06:53:04 +00:00
|
|
|
return it.value().toString();
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-01-19 13:44:22 +00:00
|
|
|
|
2014-12-05 09:15:41 +00:00
|
|
|
static QString findKNewStuff(const QVariantMap &decoSettingsMap)
|
|
|
|
{
|
|
|
|
auto it = decoSettingsMap.find(QStringLiteral("KNewStuff"));
|
|
|
|
if (it == decoSettingsMap.end()) {
|
|
|
|
return QString();
|
|
|
|
}
|
|
|
|
return it.value().toString();
|
|
|
|
}
|
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
void DecorationsModel::init()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2014-10-31 06:53:04 +00:00
|
|
|
beginResetModel();
|
2014-12-05 09:15:41 +00:00
|
|
|
m_plugins.clear();
|
2014-10-31 06:53:04 +00:00
|
|
|
const auto plugins = KPluginTrader::self()->query(s_pluginName, s_pluginName);
|
|
|
|
for (const auto &info : plugins) {
|
|
|
|
KPluginLoader loader(info.libraryPath());
|
|
|
|
KPluginFactory *factory = loader.factory();
|
|
|
|
if (!factory) {
|
|
|
|
continue;
|
2010-04-21 18:18:45 +00:00
|
|
|
}
|
2014-10-31 06:53:04 +00:00
|
|
|
auto metadata = loader.metaData().value(QStringLiteral("MetaData")).toObject().value(s_pluginName);
|
2014-12-05 12:44:16 +00:00
|
|
|
bool config = false;
|
2014-10-31 06:53:04 +00:00
|
|
|
if (!metadata.isUndefined()) {
|
|
|
|
const auto decoSettingsMap = metadata.toObject().toVariantMap();
|
2014-12-05 09:15:41 +00:00
|
|
|
const QString &kns = findKNewStuff(decoSettingsMap);
|
|
|
|
if (!kns.isEmpty()) {
|
|
|
|
m_knsProvides.insert(kns, info.name().isEmpty() ? info.pluginName() : info.name());
|
|
|
|
}
|
2014-10-31 06:53:04 +00:00
|
|
|
if (isThemeEngine(decoSettingsMap)) {
|
|
|
|
const QString keyword = themeListKeyword(decoSettingsMap);
|
|
|
|
if (keyword.isNull()) {
|
|
|
|
// We cannot list the themes
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
QScopedPointer<QObject> themeFinder(factory->create<QObject>(keyword));
|
|
|
|
if (themeFinder.isNull()) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
QVariant themes = themeFinder->property("themes");
|
|
|
|
if (!themes.isValid()) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
const auto themesMap = themes.toMap();
|
|
|
|
for (auto it = themesMap.begin(); it != themesMap.end(); ++it) {
|
|
|
|
Data d;
|
|
|
|
d.pluginName = info.pluginName();
|
|
|
|
d.themeName = it.value().toString();
|
|
|
|
d.visibleName = it.key();
|
2014-12-05 12:44:16 +00:00
|
|
|
QMetaObject::invokeMethod(themeFinder.data(), "hasConfiguration",
|
|
|
|
Q_RETURN_ARG(bool, d.configuration),
|
|
|
|
Q_ARG(QString, d.themeName));
|
2014-10-31 06:53:04 +00:00
|
|
|
m_plugins.emplace_back(std::move(d));
|
|
|
|
}
|
|
|
|
|
|
|
|
// it's a theme engine, we don't want to show this entry
|
|
|
|
continue;
|
|
|
|
}
|
2014-12-05 12:44:16 +00:00
|
|
|
config = isConfigureable(decoSettingsMap);
|
2012-08-24 13:16:30 +00:00
|
|
|
}
|
2014-10-31 06:53:04 +00:00
|
|
|
Data data;
|
|
|
|
data.pluginName = info.pluginName();
|
|
|
|
data.visibleName = info.name().isEmpty() ? info.pluginName() : info.name();
|
2014-12-05 12:44:16 +00:00
|
|
|
data.configuration = config;
|
2010-01-19 13:44:22 +00:00
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
m_plugins.emplace_back(std::move(data));
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2014-10-31 06:53:04 +00:00
|
|
|
endResetModel();
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
|
|
|
|
2014-10-31 06:53:04 +00:00
|
|
|
QModelIndex DecorationsModel::findDecoration(const QString &pluginName, const QString &themeName) const
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2014-10-31 06:53:04 +00:00
|
|
|
auto it = std::find_if(m_plugins.cbegin(), m_plugins.cend(),
|
|
|
|
[pluginName, themeName](const Data &d) {
|
|
|
|
return d.pluginName == pluginName && d.themeName == themeName;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
if (it == m_plugins.cend()) {
|
|
|
|
return QModelIndex();
|
2010-01-19 13:44:22 +00:00
|
|
|
}
|
2014-10-31 06:53:04 +00:00
|
|
|
const auto distance = std::distance(m_plugins.cbegin(), it);
|
|
|
|
return createIndex(distance, 0);
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-01-19 13:44:22 +00:00
|
|
|
|
2012-07-29 09:20:48 +00:00
|
|
|
}
|
2012-08-25 07:54:20 +00:00
|
|
|
}
|