Changelog fixed.
[jspeed] / src / themeselector.cpp
1 /*
2  * This file is part of jSpeed.
3  *
4  * jSpeed is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * jSpeed is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with jSpeed.  If not, see <http://www.gnu.org/licenses/>.
16  *
17  */
18
19 #include <QtCore/QDir>
20 #include <QtCore/QDebug>
21 #include <QtCore/QString>
22 #include <QtCore/QStringList>
23 #include <QtGui/QFileDialog>
24 #include <QtGui/QDialogButtonBox>
25 #include <QtGui/QPushButton>
26 #include <QtGui/QHBoxLayout>
27 #include <QtGui/QVBoxLayout>
28 #include <QtGui/QMessageBox>
29 #include "themeselector.h"
30 #include "buttonselector.h"
31 #include "themeloader.h"
32 #include "settings.h"
33
34 ThemeSelector::ThemeSelector(QWidget* parent): QDialog(parent)
35 {
36     setWindowTitle(tr("Select theme"));
37
38     QHBoxLayout* layout = new QHBoxLayout;
39     QHBoxLayout* left = new QHBoxLayout;
40
41     QPushButton* saveButton = new QPushButton(tr("Save"));
42     connect(saveButton, SIGNAL(clicked(bool)), this, SLOT(saveTheme()));
43     QDialogButtonBox* buttons = new QDialogButtonBox;
44     buttons->setCenterButtons(false);
45     buttons->addButton(saveButton, QDialogButtonBox::AcceptRole);
46
47     selector_ = new ButtonSelector(tr("Theme"), this);
48     theme_ = Settings::instance().value("theme", "default").toString();
49
50     QPushButton* loadButton = new QPushButton(tr("Import"));
51     connect(loadButton, SIGNAL(clicked(bool)), this, SLOT(loadFromFile()));
52
53     left->addWidget(selector_, Qt::AlignLeft);
54     left->addWidget(loadButton);
55
56     layout->addLayout(left, Qt::AlignLeft);
57     layout->addWidget(buttons);
58
59     setLayout(layout);
60
61 }
62
63 void ThemeSelector::saveTheme()
64 {
65     QString theme = selector_->value().toString();
66
67     if(theme == theme_)
68     {
69         hide();
70         return;
71     }
72
73     Settings::instance().setValue("theme", theme);
74     hide();
75     theme_ = theme;
76     emit themeChanged();
77 }
78
79 void ThemeSelector::loadFromFile()
80 {
81     QString filename = QFileDialog::getOpenFileName(this, tr("Open file"),
82                                                     QDir::home().path(),
83                                                     tr("Theme files") + "(*" + ThemeLoader::getThemeSuffix() + ")");
84
85     if(filename.isEmpty())
86     {
87         return;
88     }
89
90     qDebug() << filename;
91
92     QString basename;
93     int i = filename.lastIndexOf(QDir::separator());
94
95     if(i == -1)
96     {
97         basename = filename;
98     }
99     else
100     {
101         basename = filename.mid(i + 1);
102     }
103
104     QString targetFile = ThemeLoader::getThemeDir() + basename;
105
106     qDebug() << targetFile;
107
108     bool ok = true;
109
110     if(QFile::exists(targetFile))
111     {
112         ok = confirmCopy(basename);
113
114         if(ok)
115         {
116             QFile::remove(targetFile);
117         }
118     }
119
120     if(ok)
121     {
122         QFile::copy(filename, targetFile);
123         QString name;
124         QString id;
125         getThemeDetails(basename, name, id);
126         theme_ = id;
127         loadThemes();
128     }
129 }
130
131 void ThemeSelector::loadThemes()
132 {
133     selector_->clear();
134     selector_->addItem(tr("Default"), "default");
135     QDir themeDir(ThemeLoader::getThemeDir());
136
137     if(!themeDir.exists() || !themeDir.isReadable())
138     {
139         qDebug() << "Warning: theme dir (" + ThemeLoader::getThemeDir() + ") doesn't exist or is read protected";
140         return;
141     }
142
143     QStringList filters;
144     filters << "*" + ThemeLoader::getThemeSuffix();
145     themeDir.setNameFilters(filters);
146     themeDir.setFilter(QDir::Files);
147     QStringList files = themeDir.entryList();
148
149     for(int i = 0; i < files.size(); i++)
150     {
151         QString name;
152         QString id;
153         getThemeDetails(files.at(i), name, id);
154         selector_->addItem(name, id);
155
156         if(id == theme_)
157         {
158             selector_->setCurrentIndex(i + 1);
159         }
160     }
161
162 }
163
164 void ThemeSelector::getThemeDetails(QString filename,
165                                     QString& name,
166                                     QString& id)
167 {
168     static QRegExp cleaner(QRegExp::escape(ThemeLoader::getThemeSuffix()) + "$");
169     filename = filename.replace(cleaner, "");
170
171     id = filename;
172     name = filename.at(0).toUpper() + filename.mid(1);
173 }
174
175 bool ThemeSelector::confirmCopy(QString const& filename)
176 {
177     QMessageBox::StandardButton result =  QMessageBox::question(this, tr("File exists"),
178              tr("Theme file %1 already exists in theme directory, overwrite?").arg(filename),
179              QMessageBox::Yes | QMessageBox::No);
180
181     return (result == QMessageBox::Yes);
182 }
183
184 void ThemeSelector::setVisible(bool visible)
185 {
186     if(visible)
187     {
188         loadThemes();
189     }
190
191     QDialog::setVisible(visible);
192 }