Brutally restored choosing alert sound & fixed status column not always updating
[kitchenalert] / src / kitchenalertmainwindow.cpp
1 /**************************************************************************
2
3         KitchenAlert
4
5         Copyright (C) 2010  Heli Hyvättinen
6
7         This file is part of KitchenAlert.
8
9         Kitchen Alert is free software: you can redistribute it and/or modify
10         it under the terms of the GNU General Public License as published by
11         the Free Software Foundation, either version 3 of the License, or
12         (at your option) any later version.
13
14         This program is distributed in the hope that it will be useful,
15         but WITHOUT ANY WARRANTY; without even the implied warranty of
16         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17         GNU General Public License for more details.
18
19         You should have received a copy of the GNU General Public License
20         along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
22 **************************************************************************/
23
24
25
26
27
28 #include "kitchenalertmainwindow.h"
29 #include "ui_kitchenalertmainwindow.h"
30
31 #include <QString>
32 #include <QList>
33
34
35 #include "createtimersequencedialog.h"
36 #include "selectsounddialog.h"
37
38
39
40 #include <QDebug>
41
42 #include <QAction>
43 #include <QMenuBar>
44 #include <QMessageBox>
45 #include <QSettings>
46
47
48
49 KitchenAlertMainWindow::KitchenAlertMainWindow(QWidget *parent) :
50     QMainWindow(parent),
51     ui(new Ui::KitchenAlertMainWindow)
52     {
53     ui->setupUi(this);
54
55     setWindowIcon(QIcon(":/kitchenalert.png"));
56
57
58
59
60   connect(ui->CreateNewScheduleButton, SIGNAL (pressed()), this, SLOT (newTimerSequence()));
61
62
63   //alerts' tableview setup
64
65
66   ui->ComingAlertsTableView->setModel(&model_);
67   ui->ComingAlertsTableView->setSelectionMode(QAbstractItemView::SingleSelection);
68   ui->ComingAlertsTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
69
70   ui->ComingAlertsTableView->horizontalHeader()->hide();
71 //  ui->ComingAlertsTableView->verticalHeader()->setVisible(true);
72
73   ui->ComingAlertsTableView->horizontalHeader()->setResizeMode(QHeaderView::Fixed);
74   ui->ComingAlertsTableView->horizontalHeader()->resizeSection(0,535);
75   ui->ComingAlertsTableView->horizontalHeader()->resizeSection(1,140);
76   ui->ComingAlertsTableView->horizontalHeader()->resizeSection(2,100);
77
78   ui->ComingAlertsTableView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
79
80
81   //Buttons used to reacting an alarm are hidden by default
82
83   disableSelectionDependentButtons();
84
85
86   connect(ui->ComingAlertsTableView->selectionModel(),SIGNAL(selectionChanged(QItemSelection,QItemSelection)),this,SLOT(timerSelected(QItemSelection,QItemSelection)));
87
88   connect(ui->DoneButton,SIGNAL(clicked()),this,SLOT(stop()));
89   connect(ui->RestartButton,SIGNAL(clicked()),this,SLOT(restart()));
90   connect(ui->SnoozeButton,SIGNAL(clicked()),this, SLOT(snooze()));
91
92   // menu setup
93
94   QAction * p_SelectSoundAction = new QAction(tr("Select alert sound"),this);
95   connect(p_SelectSoundAction, SIGNAL(triggered()), this, SLOT(openSelectSoundDialog()));
96   menuBar()->addAction(p_SelectSoundAction);
97
98   QAction * p_AboutAction = new QAction(tr("About"),this);
99   connect(p_AboutAction,SIGNAL(triggered()),this,SLOT(openAbout()));
100   menuBar()->addAction(p_AboutAction);
101     }
102
103 KitchenAlertMainWindow::~KitchenAlertMainWindow()
104 {
105     delete ui;
106 }
107
108 void KitchenAlertMainWindow::changeEvent(QEvent *e)
109 {
110     QMainWindow::changeEvent(e);
111     switch (e->type()) {
112     case QEvent::LanguageChange:
113         ui->retranslateUi(this);
114         break;
115     default:
116         break;
117
118     }
119
120 }
121
122
123 void KitchenAlertMainWindow::newTimerSequence()
124 {
125     CreateTimerSequenceDialog createdialog;
126
127
128     if (createdialog.exec() == QDialog::Accepted) //if user pressed OK
129     {
130
131
132        QList<Timer *>  alltimers = createdialog.getTimers();  //get user input from the dialog
133
134        Timer* timer1 = alltimers.at(0); // take first timer (currently the only one!)
135
136
137
138        connect(timer1,SIGNAL(alert(QModelIndex)),this,SLOT(alert(QModelIndex)));
139
140        //TODO: FIND A WAY TO INFORM THE TIMERS' ALERTSOUND'S OF A CHANGE OF THE SOUND FILE THEY SHOULD USE!!!!
141
142        connect(this,SIGNAL(defaultSoundEnabled()),timer1,SLOT(enableDefaultSound()));
143        connect(this,SIGNAL(soundChanged(QString)),timer1,SLOT(changeAlertSound(QString)));
144
145
146
147         model_.addTimers(alltimers); // give timers to the model, they are started automatically by default
148
149  //       ui->ComingAlertsTableView->resizeColumnsToContents();
150
151
152         //Disable buttons, as selection is cleared when view is refreshed to show the new timer
153         //But only if the timer has not already alerted and thus been selected
154
155         if (!selectedRow().isValid())
156             disableSelectionDependentButtons();
157
158
159
160     }
161     // if cancelled, do nothing
162
163
164
165 }
166
167
168
169
170
171 void KitchenAlertMainWindow::alert(QModelIndex indexOfAlerter)
172 {
173
174     // The program is brought to front and activated when alerted
175
176     raise();
177     activateWindow();
178
179     // The alerting timer is selected
180     ui->ComingAlertsTableView->selectionModel()->select(QItemSelection(indexOfAlerter,indexOfAlerter),QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows );
181     qDebug() << "Should be selected now";
182
183
184     //Snooze button is enabled
185
186
187     ui->SnoozeButton->setEnabled(true);
188
189     //Debug message
190
191
192
193     ui->debugLabel->setText(tr("Alert received from row %1").arg(indexOfAlerter.row()));
194     qDebug() << "Wrote the debug message";
195
196     //The alert sound is played
197    //TESTING TO MOVE THIS OPERATION TO THE TIMER ITSELF
198 //    alertSound_.play();
199
200 }
201
202
203 void KitchenAlertMainWindow::timerSelected(QItemSelection selected,QItemSelection)
204 {
205     ui->DoneButton->setEnabled(true);
206     ui->RestartButton->setEnabled(true);
207
208
209     //snooze button enabled only when alerting
210     QModelIndexList indexes = selected.indexes();
211
212     //the selection model only allows selecting one row at the time & we only need to know the row, so we can just take the first one
213     QModelIndex index = indexes.value(0);
214     if (index.isValid())
215     {
216         if (model_.isThisTimerAlerting(index) == true)
217         {
218              ui->SnoozeButton->setEnabled(true);
219         }
220         else ui->SnoozeButton->setDisabled(true);
221     }
222
223 }
224
225 void KitchenAlertMainWindow::snooze()
226 {
227     QModelIndex row = selectedRow();
228     if (row.isValid()) //If there was no row selected invalid row was returned
229     {
230         model_.snoozeTimer(row);
231     }
232     ui->SnoozeButton->setDisabled(true);
233   //  alertSound_.stop();
234
235 }
236
237 void KitchenAlertMainWindow::restart()
238 {
239     QModelIndex row = selectedRow(); //If there was no row selected invalid row was returned
240     if (row.isValid())
241     {
242
243         model_.startTimer(row);
244     }
245     ui->SnoozeButton->setDisabled(true);
246  //   alertSound_.stop();
247
248 }
249
250 void KitchenAlertMainWindow::stop()
251 {
252     QModelIndex row = selectedRow();
253     if (row.isValid()) //If there was no row selected invalid row was returned
254     {
255         model_.stopTimer(row);
256     }
257     ui->SnoozeButton->setDisabled(true);
258 //    alertSound_.stop();
259 }
260
261 QModelIndex KitchenAlertMainWindow::selectedRow()
262 {
263     QModelIndexList chosenRows = ui->ComingAlertsTableView->selectionModel()->selectedRows();
264
265     //The selection mode used allows only one row to be selected at time, so we just take the first
266     //There are indexes for all columns in the row in the list, but as we only use the row, it does not matter which one we take
267
268     return chosenRows.value(0); //gives an invalid QModelIndex if the list is empty
269 }
270
271 void KitchenAlertMainWindow::openSelectSoundDialog()
272 {
273     //THIS CEASED TO WORK WHEN SOUND WAS MOVED TO TIMERS THEMSELVES
274     SelectSoundDialog dialog;
275    if ( dialog.exec() == QDialog::Accepted) //if user pressed OK
276     {
277        if (dialog.isDefaultSoundChecked() == true)
278            emit defaultSoundEnabled();
279        else
280            emit soundChanged(dialog.getSoundFileName());
281     }
282
283 }
284
285 void KitchenAlertMainWindow::openAbout()
286 {
287     QMessageBox::about(this,tr("About KitchenAlert"),tr("<p>Version %1"
288                                                         "<p>Copyright &copy; Heli Hyv&auml;ttinen 2010"
289                                                          "<p>License: General Public License v3"
290                                                          "<p>Web page: http://kitchenalert.garage.maemo.org/"
291                                                          "<p>Bugtracker: https://garage.maemo.org/projects/kitchenalert/").arg(QApplication::applicationVersion()));
292 }
293
294 bool KitchenAlertMainWindow::event(QEvent *event)
295 {
296     QMainWindow::event(event);
297
298
299
300     switch (event->type())
301     {
302         case QEvent::WindowActivate:
303
304             model_.setUpdateViewOnChanges(true);
305
306
307               break;
308
309        case QEvent::WindowDeactivate:
310             model_.setUpdateViewOnChanges(false);
311             break;
312
313        default:
314             break;
315
316
317     }
318 }
319
320 void KitchenAlertMainWindow::disableSelectionDependentButtons()
321 {
322     ui->DoneButton->setDisabled(true);
323     ui->SnoozeButton->setDisabled(true);
324     ui->RestartButton->setDisabled(true);
325
326 }
327
328 void KitchenAlertMainWindow::initializeAlertSound()
329 {
330     QSettings settings;
331
332     bool useDefaultSound = settings.value("UseDefaultSound",true).toBool();
333     QString filename = settings.value("soundfile","").toString();
334
335     if (useDefaultSound == true)
336     {
337         openSelectSoundDialog();
338     }
339     else if (filename.isEmpty())
340     {
341         openSelectSoundDialog();
342     }
343
344    QString currentFilename = settings.value("soundfile","").toString();
345
346    if (currentFilename.isEmpty())
347    {
348         ui->debugLabel->setText("<FONT color=red>No alert sound file set. Alert sound will not be played!</FONT>");
349
350    }
351
352 }