1 #include <QSettings>
2 #include <QFileInfo>
3 #include <QFileInfoList>
4 #include <QDir>
5 #include <QTreeWidgetItem>
6 #include <QImageReader>
7 #include <QLocale>
8 #include "lthemeengine.h"
9 #include "cursorthemepage.h"
10 #include "ui_cursorthemepage.h"
11
CursorThemePage(QWidget * parent)12 CursorThemePage::CursorThemePage(QWidget *parent) : TabPage(parent), m_ui(new Ui::CursorThemePage){
13 m_ui->setupUi(this);
14 loadThemes();
15 readSettings();
16 }
17
~CursorThemePage()18 CursorThemePage::~CursorThemePage(){
19 delete m_ui;
20 }
21
writeSettings()22 void CursorThemePage::writeSettings(){
23 QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
24 QTreeWidgetItem *item = m_ui->treeWidget->currentItem();
25 if(item){
26 settings.setValue("Appearance/cursor_theme", item->data(3, Qt::UserRole));
27 lthemeengine::setCursorTheme(item->data(3, Qt::UserRole).toString() );
28 }
29 }
30
readSettings()31 void CursorThemePage::readSettings(){
32 QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
33 QString name = settings.value("Appearance/cursor_theme").toString();
34 if(name.isEmpty()){ return; }
35 for(int i = 0; i < m_ui->treeWidget->topLevelItemCount(); ++i){
36 QTreeWidgetItem *item = m_ui->treeWidget->topLevelItem(i);
37 if(item->data(3, Qt::UserRole).toString() == name){
38 m_ui->treeWidget->setCurrentItem(item);
39 break;
40 }
41 }
42 }
43
loadThemes()44 void CursorThemePage::loadThemes(){
45 /*QFileInfoList themeFileList;
46 foreach(QString path, lthemeengine::iconPaths()){
47 QDir dir(path);
48 dir.setFilter(QDir::Dirs | QDir::NoDotDot | QDir::NoDot);
49 foreach (QFileInfo info, dir.entryInfoList()){
50 QDir themeDir(info.absoluteFilePath());
51 themeDir.setFilter(QDir::Files);
52 themeFileList << themeDir.entryInfoList(QStringList() << "index.theme");
53 }
54 }*/
55 /*foreach(QFileInfo info, themeFileList){
56 loadTheme(info.canonicalFilePath());
57 }*/
58 QStringList themes = lthemeengine::availableSystemCursors();
59 for(int i=0; i<themes.length(); i++){ loadTheme(themes[i]); }
60 }
61
loadTheme(const QString & path)62 void CursorThemePage::loadTheme(const QString &path){
63 //QSettings config(path, QSettings::IniFormat);
64 //config.setIniCodec("UTF-8");
65 //config.beginGroup("Icon Theme");
66 //QStringList dirs = config.value("Directories").toStringList();
67 //if(dirs.isEmpty() || config.value("Hidden", false).toBool()){ return; }
68 QString name, comment;
69 name = comment = path.section("/",-1);
70 /*QString lang = QLocale::system().name();
71 name = config.value(QString("Name[%1]").arg(lang)).toString();
72 comment = config.value(QString("Comment[%1]").arg(lang)).toString();
73 if(lang.contains("_")){ lang = lang.split("_").first(); }
74 if(name.isEmpty()){ name = config.value(QString("Name[%1]").arg(lang)).toString(); }
75 if(comment.isEmpty()){ comment = config.value(QString("Comment[%1]").arg(lang)).toString(); }
76 if(name.isEmpty()){ name = config.value("Name").toString(); }
77 if(comment.isEmpty()){ comment = config.value("Comment").toString(); }
78 config.endGroup();*/
79 QIcon icon1;// = findIcon(path, 24, "document-save");
80 QIcon icon2;//= findIcon(path, 24, "document-print");
81 QIcon icon3;// = findIcon(path, 24, "media-playback-stop");
82 QTreeWidgetItem *item = new QTreeWidgetItem();
83 item->setIcon(0, icon1);
84 item->setIcon(1, icon2);
85 item->setIcon(2, icon3);
86 item->setText(3, name);
87 item->setData(3, Qt::UserRole, path.section("/",-1));
88 item->setToolTip(3, comment);
89 item->setSizeHint(0, QSize(24,24));
90 m_ui->treeWidget->addTopLevelItem(item);
91 m_ui->treeWidget->resizeColumnToContents(0);
92 m_ui->treeWidget->resizeColumnToContents(1);
93 m_ui->treeWidget->resizeColumnToContents(2);
94 m_ui->treeWidget->resizeColumnToContents(3);
95 }
96
findIcon(const QString & themePath,int size,const QString & name)97 QIcon CursorThemePage::findIcon(const QString &themePath, int size, const QString &name){
98 QSettings config(themePath, QSettings::IniFormat);
99 config.beginGroup("Icon Theme");
100 QStringList dirs = config.value("Directories").toStringList();
101 QStringList parents = config.value("Inherits").toStringList();
102 bool haveInherits = config.contains("Inherits");
103 config.endGroup();
104 foreach (QString dir, dirs){
105 config.beginGroup(dir);
106 if(config.value("Size").toInt() == size){
107 QDir iconDir = QFileInfo(themePath).path() + "/" + dir;
108 iconDir.setFilter(QDir::Files);
109 iconDir.setNameFilters(QStringList () << name + ".*");
110 if(iconDir.entryInfoList().isEmpty())
111 continue;
112 return QIcon(iconDir.entryInfoList().first().absoluteFilePath());
113 }
114 config.endGroup();
115 }
116 foreach (QString dir, dirs){
117 config.beginGroup(dir);
118 if(abs(config.value("Size").toInt() - size) < 4){
119 QDir iconDir = QFileInfo(themePath).path() + "/" + dir;
120 iconDir.setFilter(QDir::Files);
121 iconDir.setNameFilters(QStringList () << name + ".*");
122 if(iconDir.entryInfoList().isEmpty())
123 continue;
124 return QIcon(iconDir.entryInfoList().first().absoluteFilePath());
125 }
126 config.endGroup();
127 }
128 if (!haveInherits){ return QIcon(); }
129 parents.append("hicolor"); //add fallback themes
130 parents.append("gnome");
131 parents.removeDuplicates();
132 foreach (QString parent, parents){
133 QString parentThemePath = QDir(QFileInfo(themePath).path() + "/../" + parent).canonicalPath() + "/index.theme";
134 if(!QFile::exists(parentThemePath) || parentThemePath == themePath){ continue; }
135 QIcon icon = findIcon(parentThemePath, size, name);
136 if(!icon.isNull()){ return icon; }
137 }
138 return QIcon();
139 }
140