Some fixes to setting dialogs.
[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             break;
85         }
86     }
87 }
88
89 void ThemeScheduler::store()
90 {
91     if(items_.isEmpty())
92     {
93         Settings::instance().remove("theme_scheduler");
94         return;
95     }
96
97     QList<QVariant> list;
98
99     for(int i = 0; i < items_.size(); i++)
100     {
101         QMap<QString, QVariant> map;
102         map["time"] = items_.at(i)->time.toString();
103         map["theme"] = items_.at(i)->theme;
104         list.push_back(map);
105     }
106
107     Settings::instance().setValue("theme_scheduler", list);
108 }
109
110 void ThemeScheduler::loadConfig()
111 {
112     enabled_ = Settings::instance().value("theme_scheduler_enabled", false).toBool();
113
114     QList<QVariant> list = Settings::instance().value("theme_scheduler").toList();
115
116     for(int i = 0; i < list.size(); i++)
117     {
118         QMap<QString, QVariant> map = list.at(i).toMap();
119         QTime time = QTime::fromString(map["time"].toString());
120         addItem(time, map["theme"].toString());
121     }
122 }
123
124 void ThemeScheduler::setEnabled(bool enabled)
125 {
126     enabled_ = enabled;
127 }
128
129 bool ThemeScheduler::isEnabled() const
130 {
131     return enabled_;
132 }
133
134 QString ThemeScheduler::currentTheme() const
135 {
136     if(enabled_)
137     {
138         QTime time = QTime::currentTime();
139
140         for(int i = 0; i < items_.size(); i++)
141         {
142             if(items_.at(i)->time >= time)
143             {
144                 int index = i - 1;
145
146                 if(index < 0)
147                 {
148                     index = items_.size() - 1;
149                 }
150
151                 return items_.at(index)->theme;
152             }
153         }
154
155         if(items_.size() > 0)
156         {
157             return items_.at(items_.size() - 1)->theme;
158         }
159     }
160
161     QString theme = Settings::instance().value("theme", DEFAULT_THEME).toString();
162
163     if(theme.isEmpty())
164     {
165         return DEFAULT_THEME;
166     }
167
168     return theme;
169 }
170
171 QString const& ThemeScheduler::getDefaultTheme()
172 {
173     return DEFAULT_THEME;
174 }
175
176 void ThemeScheduler::clear()
177 {
178     for(int i = 0; i < items_.size(); i++)
179     {
180         delete items_.at(i);
181     }
182
183     items_.clear();
184 }
185
186 void ThemeScheduler::getItems(QList<SchedulerItem>& items)
187 {
188     items.clear();
189
190     for(int i = 0; i < items_.size(); i++)
191     {
192         SchedulerItem item;
193         item.time = items_.at(i)->time;
194         item.theme = items_.at(i)->theme;
195         items.push_back(item);
196     }
197 }
198
199 void ThemeScheduler::emitThemeChanged()
200 {
201     if(enabled_)
202     {
203         emit themeChanged();
204     }
205 }
206
207 bool ThemeScheduler::isEmpty() const
208 {
209     return items_.isEmpty();
210 }