You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

167 lines
5.0 KiB

/*
* Copyright 2020 Mikhail Zolotukhin <zomial@protonmail.com>
*
* 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/>.
*/
#include <QDebug>
#include <QDir>
#include <QStandardPaths>
#include <QUrl>
#include <KIO/DeleteJob>
#include "gtkthemesmodel.h"
GtkThemesModel::GtkThemesModel(QObject *parent)
: QAbstractListModel(parent)
, m_selectedTheme(QStringLiteral("Breeze"))
, m_themesList()
{
}
void GtkThemesModel::load()
{
QMap<QString, QString> gtk3ThemesNames;
static const QStringList gtk3SubdirPattern(QStringLiteral("gtk-3.*"));
for (const QString &possibleThemePath : possiblePathsToThemes()) {
// If the directory contains any of gtk-3.X folders, it is the GTK3 theme for sure
QDir possibleThemeDirectory(possibleThemePath);
if (!possibleThemeDirectory.entryList(gtk3SubdirPattern, QDir::Dirs).isEmpty()) {
// Do not show dark Breeze GTK variant, since the colors of it
// are coming from the color scheme and selecting them here
// is redundant and does not work
if (possibleThemeDirectory.dirName() == QStringLiteral("Breeze-Dark")) {
continue;
}
gtk3ThemesNames.insert(possibleThemeDirectory.dirName(), possibleThemeDirectory.path());
}
}
setThemesList(gtk3ThemesNames);
}
QString GtkThemesModel::themePath(const QString &themeName)
{
if (themeName.isEmpty()) {
return QString();
} else {
return m_themesList.find(themeName).value();
}
}
QVariant GtkThemesModel::data(const QModelIndex &index, int role) const
{
if (role == Qt::DisplayRole || role == Roles::ThemeNameRole) {
if (index.row() < 0 || index.row() > m_themesList.count()) {
return QVariant();
}
return m_themesList.keys().at(index.row());
} else if (role == Roles::ThemePathRole) {
if (index.row() < 0 || index.row() > m_themesList.count()) {
return QVariant();
}
return m_themesList.values().at(index.row());
} else {
return QVariant();
}
}
QHash<int, QByteArray> GtkThemesModel::roleNames() const
{
QHash<int, QByteArray> roles = QAbstractListModel::roleNames();
roles[Roles::ThemeNameRole] = "theme-name";
roles[Roles::ThemePathRole] = "theme-path";
return roles;
}
int GtkThemesModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid()) {
return 0;
}
return m_themesList.count();
}
void GtkThemesModel::setThemesList(const QMap<QString, QString> &themes)
{
beginResetModel();
m_themesList = themes;
endResetModel();
}
QMap<QString, QString> GtkThemesModel::themesList()
{
return m_themesList;
}
void GtkThemesModel::setSelectedTheme(const QString &themeName)
{
m_selectedTheme = themeName;
}
QString GtkThemesModel::selectedTheme()
{
return m_selectedTheme;
}
QStringList GtkThemesModel::possiblePathsToThemes()
{
QStringList possibleThemesPaths;
QStringList themesLocationsPaths =
QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("themes"), QStandardPaths::LocateDirectory);
themesLocationsPaths << QDir::homePath() + QStringLiteral("/.themes");
for (const QString &themesLocationPath : qAsConst(themesLocationsPaths)) {
const QStringList possibleThemesDirectoriesNames = QDir(themesLocationPath).entryList(QDir::NoDotAndDotDot | QDir::AllDirs);
for (const QString &possibleThemeDirectoryName : possibleThemesDirectoriesNames) {
possibleThemesPaths += themesLocationPath + '/' + possibleThemeDirectoryName;
}
}
return possibleThemesPaths;
}
bool GtkThemesModel::selectedThemeRemovable()
{
return themePath(m_selectedTheme).contains(QDir::homePath());
}
void GtkThemesModel::removeSelectedTheme()
{
QString path = themePath(m_selectedTheme);
KIO::DeleteJob *deleteJob = KIO::del(QUrl::fromLocalFile(path), KIO::HideProgressInfo);
connect(deleteJob, &KJob::finished, this, [this]() {
Q_EMIT themeRemoved();
});
}
int GtkThemesModel::findThemeIndex(const QString &themeName)
{
return static_cast<int>(std::distance(m_themesList.begin(), m_themesList.find(themeName)));
}
void GtkThemesModel::setSelectedThemeDirty()
{
Q_EMIT selectedThemeChanged(m_selectedTheme);
}