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