Themescheduler settings saving fixed.
[jspeed] / src / themescheduler.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/QString>
20 #include <QtCore/QDebug>
21 #include "themescheduler.h"
22 #include "settings.h"
23
24 namespace
25 {
26     QString const DEFAULT_THEME = "default";
27 }
28
29 ThemeScheduler::ThemeScheduler(): QObject(0), enabled_(false)
30 {
31     loadConfig();
32 }
33
34 ThemeScheduler::~ThemeScheduler()
35 {
36     store();
37     clear();
38 }
39
40 ThemeScheduler& ThemeScheduler::instance()
41 {
42     static ThemeScheduler instance;
43     return instance;
44 }
45
46 void ThemeScheduler::addItem(QTime const& time, QString const& theme)
47 {
48     removeItem(time);
49     ItemDetails* details = new ItemDetails;
50     details->time = time;
51     details->theme = theme;
52
53     int msecs = QTime::currentTime().msecsTo(time);
54
55     if(msecs < 0)
56     {
57         msecs += 86400000;
58     }
59
60     details->timer.setSingleShot(true);
61     details->timer.start(msecs + 500);
62     connect(&details->timer, SIGNAL(timeout()), this, SLOT(emitThemeChanged()));
63
64     for(int i = 0; i < items_.size(); i++)
65     {
66         if(items_.at(i)->time > time)
67         {
68             items_.insert(i, details);
69             return;
70         }
71     }
72
73     items_.push_back(details);
74 }
75
76 void ThemeScheduler::removeItem(QTime const& time)
77 {
78     for(int i = 0; i < items_.size(); i++)
79     {
80         if(items_.at(i)->time == time)
81         {
82             delete items_.at(i);
83             items_.removeAt(i);
84             return;
85         }
86     }
87 }
88
89 void ThemeScheduler::store()
90 {
91     Settings::instance().setValue("theme_scheduler_enabled", enabled_);
92
93     if(items_.isEmpty())
94     {
95         Settings::instance().remove("theme_scheduler");
96         return;
97     }
98
99     QList<QVariant> list;
100
101     for(int i = 0; i < items_.size(); i++)
102     {
103         QMap<QString, QVariant> map;
104         map["time"] = items_.at(i)->time.toString();
105         map["theme"] = items_.at(i)->theme;
106         list.push_back(map);
107     }
108
109     Settings::instance().setValue("theme_scheduler", list);
110 }
111
112 void ThemeScheduler::loadConfig()
113 {
114     enabled_ = Settings::instance().value("theme_scheduler_enabled", false).toBool();
115
116     QList<QVariant> list = Settings::instance().value("theme_scheduler").toList();
117
118     for(int i = 0; i < list.size(); i++)
119     {
120         QMap<QString, QVariant> map = list.at(i).toMap();
121         QTime time = QTime::fromString(map["time"].toString());
122         addItem(time, map["theme"].toString());
123     }
124 }
125
126 void ThemeScheduler::setEnabled(bool enabled)
127 {
128     enabled_ = enabled;
129 }
130
131 bool ThemeScheduler::isEnabled() const
132 {
133     return enabled_;
134 }
135
136 QString ThemeScheduler::currentTheme() const
137 {
138     if(enabled_)
139     {
140         QTime time = QTime::currentTime();
141
142         for(int i = 0; i < items_.size(); i++)
143         {
144             if(items_.at(i)->time >= time)
145             {
146                 int index = i - 1;
147
148                 if(index < 0)
149                 {
150                     index = items_.size() - 1;
151                 }
152
153                 return items_.at(index)->theme;
154             }
155         }
156
157         if(items_.size() > 0)
158         {
159             return items_.at(items_.size() - 1)->theme;
160         }
161     }
162
163     QString theme = Settings::instance().value("theme", DEFAULT_THEME).toString();
164
165     if(theme.isEmpty())
166     {
167         return DEFAULT_THEME;
168     }
169
170     return theme;
171 }
172
173 QString const& ThemeScheduler::getDefaultTheme()
174 {
175     return DEFAULT_THEME;
176 }
177
178 void ThemeScheduler::clear()
179 {
180     for(int i = 0; i < items_.size(); i++)
181     {
182         delete items_.at(i);
183     }
184
185     items_.clear();
186 }
187
188 void ThemeScheduler::getItems(QList<SchedulerItem>& items)
189 {
190     items.clear();
191
192     for(int i = 0; i < items_.size(); i++)
193     {
194         SchedulerItem item;
195         item.time = items_.at(i)->time;
196         item.theme = items_.at(i)->theme;
197         items.push_back(item);
198     }
199 }
200
201 void ThemeScheduler::emitThemeChanged()
202 {
203     if(enabled_)
204     {
205         emit themeChanged();
206     }
207 }
208
209 bool ThemeScheduler::isEmpty() const
210 {
211     return items_.isEmpty();
212 }