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