f65a002718375f71cbdf29436074b6dadf9130f6
[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   connect(ui->RemoveButton,SIGNAL(clicked()),this,SLOT(remove()));
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
177     activateWindow();
178     raise();
179
180     // The alerting timer is selected
181     ui->ComingAlertsTableView->selectionModel()->select(QItemSelection(indexOfAlerter,indexOfAlerter),QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows );
182
183     //Scrolls the view so that the alerting timer is visible
184     ui->ComingAlertsTableView->scrollTo(indexOfAlerter);
185
186    // qDebug() << "Should be selected now";
187
188
189     //Snooze button is enabled
190
191
192     ui->SnoozeButton->setEnabled(true);
193
194     //Debug message
195
196
197
198     ui->debugLabel->setText(tr("Alert received from row %1").arg(indexOfAlerter.row()));
199     qDebug() << "Wrote the debug message";
200
201     //The alert sound is played
202    //TESTING TO MOVE THIS OPERATION TO THE TIMER ITSELF
203 //    alertSound_.play();
204
205 }
206
207
208 void KitchenAlertMainWindow::timerSelected(QItemSelection selected,QItemSelection)
209 {
210     ui->DoneButton->setEnabled(true);
211     ui->RestartButton->setEnabled(true);
212     ui->RemoveButton->setEnabled(true);
213
214
215     //snooze button enabled only when alerting
216     QModelIndexList indexes = selected.indexes();
217
218     //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
219     QModelIndex index = indexes.value(0);
220     if (index.isValid())
221     {
222         if (model_.isThisTimerAlerting(index) == true)
223         {
224              ui->SnoozeButton->setEnabled(true);
225         }
226         else ui->SnoozeButton->setDisabled(true);
227     }
228
229 }
230
231 void KitchenAlertMainWindow::snooze()
232 {
233     QModelIndex row = selectedRow();
234     if (row.isValid()) //If there was no row selected invalid row was returned
235     {
236         model_.snoozeTimer(row);
237     }
238     ui->SnoozeButton->setDisabled(true);
239   //  alertSound_.stop();
240
241 }
242
243 void KitchenAlertMainWindow::restart()
244 {
245     QModelIndex row = selectedRow(); //If there was no row selected invalid row was returned
246     if (row.isValid())
247     {
248
249         model_.startTimer(row);
250     }
251     ui->SnoozeButton->setDisabled(true);
252  //   alertSound_.stop();
253
254 }
255
256 void KitchenAlertMainWindow::stop()
257 {
258     QModelIndex row = selectedRow();
259     if (row.isValid()) //If there was no row selected invalid row was returned
260     {
261         model_.stopTimer(row);
262     }
263     ui->SnoozeButton->setDisabled(true);
264 //    alertSound_.stop();
265 }
266
267 QModelIndex KitchenAlertMainWindow::selectedRow()
268 {
269     //Returns the cells in row 0 that have the whole row selected (the selection mode used allows only selecting whole rows
270
271     QModelIndexList chosenRows = ui->ComingAlertsTableView->selectionModel()->selectedRows();
272
273     //The selection mode used allows only one row to be selected at time, so we just take the first
274
275
276     return chosenRows.value(0); //gives an invalid QModelIndex if the list is empty
277 }
278
279 void KitchenAlertMainWindow::openSelectSoundDialog()
280 {
281
282     SelectSoundDialog dialog;
283    if ( dialog.exec() == QDialog::Accepted) //if user pressed OK
284     {
285        if (dialog.isDefaultSoundChecked() == true)
286            emit defaultSoundEnabled();
287        else
288            emit soundChanged(dialog.getSoundFileName());
289     }
290
291 }
292
293 void KitchenAlertMainWindow::openAbout()
294 {
295     QMessageBox::about(this,tr("About KitchenAlert"),tr("<p>Version %1"
296                                                         "<p>Copyright &copy; Heli Hyv&auml;ttinen 2010"
297                                                          "<p>License: General Public License v3"
298                                                          "<p>Web page: http://kitchenalert.garage.maemo.org/"
299                                                          "<p>Bugtracker: https://garage.maemo.org/projects/kitchenalert/").arg(QApplication::applicationVersion()));
300 }
301
302 bool KitchenAlertMainWindow::event(QEvent *event)
303 {
304     QMainWindow::event(event);
305
306
307
308     switch (event->type())
309     {
310         case QEvent::WindowActivate:
311
312             model_.setUpdateViewOnChanges(true);
313             ui->debugLabel->setText("Returned to the application!");
314
315
316               break;
317
318        case QEvent::WindowDeactivate:
319             model_.setUpdateViewOnChanges(false);
320             ui->debugLabel->setText("");
321             break;
322
323        default:
324             break;
325
326
327     }
328 }
329
330 void KitchenAlertMainWindow::disableSelectionDependentButtons()
331 {
332     ui->DoneButton->setDisabled(true);
333     ui->SnoozeButton->setDisabled(true);
334     ui->RestartButton->setDisabled(true);
335     ui->RemoveButton->setDisabled(true);
336
337 }
338
339 void KitchenAlertMainWindow::initializeAlertSound()
340 {
341     QSettings settings;
342
343     bool useDefaultSound = settings.value("UseDefaultSound",true).toBool();
344     QString filename = settings.value("soundfile","").toString();
345
346     if (useDefaultSound == true)
347     {
348         openSelectSoundDialog();
349     }
350     else if (filename.isEmpty())
351     {
352         openSelectSoundDialog();
353     }
354
355    QString currentFilename = settings.value("soundfile","").toString();
356
357    if (currentFilename.isEmpty())
358    {
359         ui->debugLabel->setText("<FONT color=red>No alert sound file set. Alert sound will not be played!</FONT>");
360
361    }
362
363 }
364
365 void KitchenAlertMainWindow::remove()
366 {
367     QModelIndex row = selectedRow();
368     if (row.isValid()) //If there was no row selected invalid row was returned
369     {
370         QString text = tr("Are you sure you want to remove this timer from the list:\n");
371         text.append((row.data().toString()));
372         if (QMessageBox::question(this,tr("Confirm timer removal"),text,QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
373         {
374             model_.removeTimer(row);
375         }
376     }
377     ui->SnoozeButton->setDisabled(true);
378 }