KColorScheme

kcolorschememodel.cpp
1/*
2 This file is part of the KDE project
3 SPDX-FileCopyrightText: 2013 Martin Gräßlin <mgraesslin@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#include "kcolorschememodel.h"
9
10#include "kcolorschememanager_p.h"
11
12#include <KConfigGroup>
13#include <KLocalizedString>
14#include <KSharedConfig>
15#include <kcolorscheme.h>
16
17#include <QDir>
18#include <QFileInfo>
19#include <QIcon>
20#include <QPainter>
21#include <QStandardPaths>
22
23#include <map>
24
25struct KColorSchemeModelData {
26 QString id; // e.g. BreezeDark
27 QString name; // e.g. "Breeze Dark" or "Breeze-Dunkel"
28 QString path;
29 QIcon preview;
30};
31
32struct KColorSchemeModelPrivate {
33 mutable QList<KColorSchemeModelData> m_data;
34};
35
36KColorSchemeModel::KColorSchemeModel(QObject *parent)
37 : QAbstractListModel(parent)
38 , d(new KColorSchemeModelPrivate)
39{
40 beginResetModel();
41 d->m_data.clear();
42
43#ifndef Q_OS_ANDROID
44 // Fill the model with all *.colors files from the XDG_DATA_DIRS, sorted by "Name".
45 // If two color schemes, in user's $HOME and e.g. /usr, respectively, have the same
46 // name, the one under $HOME overrides the other one
47 const QStringList dirPaths =
49#else
50 const QStringList dirPaths{QStringLiteral("assets:/share/color-schemes")};
51#endif
52
53 std::map<QString, QString> map;
54 for (const QString &dirPath : dirPaths) {
55 const QDir dir(dirPath);
56 const QStringList fileNames = dir.entryList({QStringLiteral("*.colors")});
57 for (const auto &file : fileNames) {
58 map.insert({file, dir.filePath(file)});
59 }
60 }
61
62 for (const auto &[key, schemeFilePath] : map) {
63 KSharedConfigPtr config = KSharedConfig::openConfig(schemeFilePath, KConfig::SimpleConfig);
64 KConfigGroup group(config, QStringLiteral("General"));
65 const QString name = group.readEntry("Name", QFileInfo(schemeFilePath).baseName());
66 const QString id = key.chopped(QLatin1String(".colors").size()); // Remove .colors ending
67 const KColorSchemeModelData data = {id, name, schemeFilePath, QIcon()};
68 d->m_data.append(data);
69 }
70
71 d->m_data.insert(0, {QStringLiteral("Default"), i18n("Default"), QString(), QIcon::fromTheme(QStringLiteral("edit-undo"))});
72 endResetModel();
73}
74
75KColorSchemeModel::~KColorSchemeModel() = default;
76
77int KColorSchemeModel::rowCount(const QModelIndex &parent) const
78{
79 if (parent.isValid()) {
80 return 0;
81 }
82 return d->m_data.count();
83}
84
85QVariant KColorSchemeModel::data(const QModelIndex &index, int role) const
86{
87 if (!index.isValid() || (index.row() >= d->m_data.count())) {
88 return QVariant();
89 }
90
91 switch (role) {
92 case NameRole:
93 return d->m_data.at(index.row()).name;
94 case IconRole: {
95 auto &item = d->m_data[index.row()];
96 if (item.preview.isNull()) {
97 item.preview = KColorSchemeManagerPrivate::createPreview(item.path);
98 }
99 return item.preview;
100 }
101 case PathRole:
102 return d->m_data.at(index.row()).path;
103 case IdRole:
104 return d->m_data.at(index.row()).id;
105 default:
106 return QVariant();
107 }
108}
109
110#include "moc_kcolorschememodel.cpp"
static KSharedConfig::Ptr openConfig(const QString &fileName=QString(), OpenFlags mode=FullConfig, QStandardPaths::StandardLocation type=QStandardPaths::GenericConfigLocation)
QString i18n(const char *text, const TYPE &arg...)
KIOCORE_EXPORT QString dir(const QString &fileClass)
QString name(StandardAction id)
KEDUVOCDOCUMENT_EXPORT QStringList fileNames(const QString &language=QString())
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const const override
QIcon fromTheme(const QString &name)
bool isValid() const const
int row() const const
QObject * parent() const const
QStringList locateAll(StandardLocation type, const QString &fileName, LocateOptions options)
QString chopped(qsizetype len) const const
QFuture< void > map(Iterator begin, Iterator end, MapFunctor &&function)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Fri May 17 2024 11:50:24 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.