Ready to be packaged
[kitchenalert] / src / currentalertstablemodel.cpp
1 /**************************************************************************
2         KitchenAlert
3
4         Copyright (C) 2010  Heli Hyvättinen
5
6         This file is part of KitchenAlert.
7
8         Kitchen Alert is free software: you can redistribute it and/or modify
9         it under the terms of the GNU General Public License as published by
10         the Free Software Foundation, either version 3 of the License, or
11         (at your option) any later version.
12
13         This program is distributed in the hope that it will be useful,
14         but WITHOUT ANY WARRANTY; without even the implied warranty of
15         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16         GNU General Public License for more details.
17
18         You should have received a copy of the GNU General Public License
19         along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
21 **************************************************************************/
22
23
24
25
26
27 #include "currentalertstablemodel.h"
28
29
30 #include <QBrush>
31
32
33 #include <qdebug.h>
34
35 CurrentAlertsTableModel::CurrentAlertsTableModel(QObject *parent) :
36     QAbstractTableModel(parent)
37 {
38
39     updateViewOnChanges_ = true;
40 }
41
42
43 int CurrentAlertsTableModel::rowCount(const QModelIndex &parent) const
44 {
45
46 //No need to mind about the parameter, it has no meaning for table models.
47
48     qDebug () << "rowCount asked";
49
50     qDebug () << currentTimers_.length();
51
52     return currentTimers_.length();
53 }
54
55
56 int CurrentAlertsTableModel::columnCount(const QModelIndex &parent) const
57 {
58
59     //No need to mind about the parameter, it has no meaning for table models.
60     return numberOfColumns_;
61
62 }
63
64
65 QVariant CurrentAlertsTableModel::data(const QModelIndex &index, int role) const
66 {
67     if (!index.isValid())
68         return QVariant();
69
70     QString timeAsText; //here, because seems not to be allowed inside switch
71     int allseconds;     //likewise
72     QString hoursOnly;
73     QString minutesOnly;
74     QString secondsOnly;
75
76
77
78     switch(role)
79     {
80         case Qt::TextAlignmentRole :
81
82             switch (index.column())
83             {
84
85             case alertTextColumnNumber_:
86
87                 return int (Qt::AlignLeft || Qt::AlignVCenter);
88
89
90             case timeRemainingColumnNumber_:
91
92                 return int (Qt::AlignRight || Qt::AlignVCenter);
93
94             case statusColumnNumber_:
95
96                 return int (Qt::AlignLeft || Qt::AlignVCenter);
97
98             }
99
100             break;
101
102         case Qt::DisplayRole :
103
104             switch (index.column())
105             {
106                 case alertTextColumnNumber_:
107
108
109
110                     return currentTimers_.at(index.row())->getAlertText();
111
112
113                 case timeRemainingColumnNumber_:
114
115
116
117                     allseconds = currentTimers_.at(index.row())->getRemainingTimeInSeconds();
118
119
120                     if (allseconds < 0)
121                     {
122                         timeAsText = tr("-", "negative sign");
123                         allseconds = -allseconds;
124
125                     }
126
127                     hoursOnly.setNum( allseconds/(60*60));
128
129
130                     minutesOnly.setNum((allseconds%(60*60))/60);
131
132
133                     secondsOnly.setNum (allseconds%60);
134
135
136                     timeAsText += tr("%1:%2:%3", "%1 is hours, %2 is minutes and % 3 is seconds. Time remaining to alert, not time of day.").arg (hoursOnly,2,'0').arg(minutesOnly,2,'0').arg(secondsOnly,2,'0');
137
138
139
140
141                     qDebug () << timeAsText;
142
143                     return timeAsText;
144
145
146                 case statusColumnNumber_:
147
148                     if (currentTimers_.at(index.row())->isAlerting() == true)
149                         return QString("ALERT!");
150
151                     else return QString();
152
153
154             }
155
156             break;
157
158       case Qt::ForegroundRole :
159
160             //No need to care for the column number, all have the same color
161
162             if (currentTimers_.at(index.row())->isAlerting() == false)
163                 return QBrush (QColor(Qt::white));
164             else return QBrush (QColor(Qt::red)); //change this to black if backgroundrole starts to work!
165
166
167
168       case Qt::BackgroundRole :
169
170             //For some reason, these have no effect at all!!! They are asked by the view though.
171
172             //No need to care for the column number, all have the same color
173
174             qDebug() << "BackgroundRole asked";
175
176             if (currentTimers_.at(index.row())->isAlerting())
177             {
178                 qDebug() << "black background";
179                 return QBrush (QColor(Qt::black));
180             }
181             else
182             {
183                 qDebug() << "red background";
184                 return QBrush (QColor(Qt::red));
185             }
186         default:
187             return QVariant();
188
189     }
190
191
192
193 }
194
195
196
197
198 void CurrentAlertsTableModel::addTimers(QList <Timer *> timers)
199 {
200     foreach (Timer* timer, timers)
201     {
202         connect (timer,SIGNAL(remainingTimeChanged()),this,SLOT(refreshTimeColumn()));
203         qDebug() << "timer connected";
204         timer->setParent(this); //The model becomes the timers parent giving the timer access to model
205     }
206     currentTimers_.append(timers);
207     qDebug() << "Timers should be appended";
208     reset();
209 }
210
211
212 void CurrentAlertsTableModel::refreshTimeColumn()
213 {
214     if (updateViewOnChanges_ == true) //Only update GUI if active to save battery
215     {
216         emit dataChanged(createIndex(0,1),createIndex(rowCount(QModelIndex())-1,1));  //Entire time column refreshed
217         qDebug() << "Refresh time column";
218
219     }
220
221
222 }
223
224
225 void CurrentAlertsTableModel::startTimer(QModelIndex index)
226 {
227     Timer * ptimer = currentTimers_.value(index.row());
228     if (ptimer != NULL)
229     {
230         ptimer->start();
231         refreshTimeColumn();
232     }
233 }
234
235 void CurrentAlertsTableModel::stopTimer(QModelIndex index)
236 {
237     Timer * ptimer = currentTimers_.value(index.row());
238     if (ptimer != NULL)
239     {
240         ptimer->stop();
241         refreshTimeColumn();
242     }
243 }
244
245 void CurrentAlertsTableModel::snoozeTimer(QModelIndex index)
246 {
247     Timer * ptimer = currentTimers_.value(index.row());
248     if (ptimer != NULL)
249     {
250         ptimer->snooze();
251         refreshTimeColumn();
252     }
253 }
254
255 QModelIndex CurrentAlertsTableModel::giveIndexForTimer(Timer * ptimer)
256 {
257     int row = currentTimers_.indexOf(ptimer);
258     if (row <= -1) // if not found
259         return QModelIndex(); //return invalid index
260
261
262     return createIndex(row,0); //return index to the timer row's first column
263
264 }
265
266
267 QVariant CurrentAlertsTableModel::headerData(int section, Qt::Orientation orientation, int role) const
268 {
269     //Reimplemented from QAbsractTableModel
270     //No headers wanted so we just return an empty QVariant
271     return QVariant();
272 }
273
274
275 void CurrentAlertsTableModel::setUpdateViewOnChanges(bool update)
276 {
277     updateViewOnChanges_ = update;
278     if (update == true)
279         reset(); //Refresh view to catch up with past changes
280 }
281
282 bool CurrentAlertsTableModel::isThisTimerAlerting(QModelIndex index)
283 {
284     if (index.isValid())
285     {
286         if (currentTimers_.at(index.row())->isAlerting())
287         {
288             return true;
289         }
290
291     }
292     return false;
293 }