Fresh start from released sources + some work done
[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
141
142         model_.addTimers(alltimers); // give timers to the model, they are started automatically by default
143
144  //       ui->ComingAlertsTableView->resizeColumnsToContents();
145
146
147         //Disable buttons, as selection is cleared when view is refreshed to show the new timer
148         //But only if the timer has not already alerted and thus been selected
149
150         if (!selectedRow().isValid())
151             disableSelectionDependentButtons();
152
153
154
155     }
156     // if cancelled, do nothing
157
158
159
160 }
161
162
163
164
165
166 void KitchenAlertMainWindow::alert(QModelIndex indexOfAlerter)
167 {
168
169     // The program is brought to front and activated when alerted
170
171     raise();
172     activateWindow();
173
174     // The alerting timer is selected
175     ui->ComingAlertsTableView->selectionModel()->select(QItemSelection(indexOfAlerter,indexOfAlerter),QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows );
176     qDebug() << "Should be selected now";
177
178
179     //Snooze button is enabled
180
181
182     ui->SnoozeButton->setEnabled(true);
183
184     //Debug message
185
186
187
188     ui->debugLabel->setText(tr("Alert received from row %1").arg(indexOfAlerter.row()));
189     qDebug() << "Wrote the debug message";
190
191     //The alert sound is played
192    //TESTING TO MOVE THIS OPERATION TO THE TIMER ITSELF
193 //    alertSound_.play();
194
195 }
196
197
198 void KitchenAlertMainWindow::timerSelected(QItemSelection selected,QItemSelection)
199 {
200     ui->DoneButton->setEnabled(true);
201     ui->RestartButton->setEnabled(true);
202
203
204     //snooze button enabled only when alerting
205     QModelIndexList indexes = selected.indexes();
206
207     //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
208     QModelIndex index = indexes.value(0);
209     if (index.isValid())
210     {
211         if (model_.isThisTimerAlerting(index) == true)
212         {
213              ui->SnoozeButton->setEnabled(true);
214         }
215         else ui->SnoozeButton->setDisabled(true);
216     }
217
218 }
219
220 void KitchenAlertMainWindow::snooze()
221 {
222     QModelIndex row = selectedRow();
223     if (row.isValid()) //If there was no row selected invalid row was returned
224     {
225         model_.snoozeTimer(row);
226     }
227     ui->SnoozeButton->setDisabled(true);
228   //  alertSound_.stop();
229
230 }
231
232 void KitchenAlertMainWindow::restart()
233 {
234     QModelIndex row = selectedRow(); //If there was no row selected invalid row was returned
235     if (row.isValid())
236     {
237
238         model_.startTimer(row);
239     }
240     ui->SnoozeButton->setDisabled(true);
241  //   alertSound_.stop();
242
243 }
244
245 void KitchenAlertMainWindow::stop()
246 {
247     QModelIndex row = selectedRow();
248     if (row.isValid()) //If there was no row selected invalid row was returned
249     {
250         model_.stopTimer(row);
251     }
252     ui->SnoozeButton->setDisabled(true);
253 //    alertSound_.stop();
254 }
255
256 QModelIndex KitchenAlertMainWindow::selectedRow()
257 {
258     QModelIndexList chosenRows = ui->ComingAlertsTableView->selectionModel()->selectedRows();
259
260     //The selection mode used allows only one row to be selected at time, so we just take the first
261     //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
262
263     return chosenRows.value(0); //gives an invalid QModelIndex if the list is empty
264 }
265
266 void KitchenAlertMainWindow::openSelectSoundDialog()
267 {
268     //THIS CEASED TO WORK WHEN SOUND WAS MOVED TO TIMERS THEMSELVES
269     SelectSoundDialog dialog;
270    if ( dialog.exec() == QDialog::Accepted) //if user pressed OK
271     {
272        if (dialog.isDefaultSoundChecked() == true)
273            alertSound_.setDefaultSound();
274        else
275             alertSound_.setSound(dialog.getSoundFileName());
276     }
277
278 }
279
280 void KitchenAlertMainWindow::openAbout()
281 {
282     QMessageBox::about(this,tr("About KitchenAlert"),tr("<p>Version %1"
283                                                         "<p>Copyright &copy; Heli Hyv&auml;ttinen 2010"
284                                                          "<p>License: General Public License v3"
285                                                          "<p>Web page: http://kitchenalert.garage.maemo.org/"
286                                                          "<p>Bugtracker: https://garage.maemo.org/projects/kitchenalert/").arg(QApplication::applicationVersion()));
287 }
288
289 bool KitchenAlertMainWindow::event(QEvent *event)
290 {
291     QMainWindow::event(event);
292
293
294
295     switch (event->type())
296     {
297         case QEvent::WindowActivate:
298
299             model_.setUpdateViewOnChanges(true);
300
301
302               break;
303
304        case QEvent::WindowDeactivate:
305             model_.setUpdateViewOnChanges(false);
306             break;
307
308        default:
309             break;
310
311
312     }
313 }
314
315 void KitchenAlertMainWindow::disableSelectionDependentButtons()
316 {
317     ui->DoneButton->setDisabled(true);
318     ui->SnoozeButton->setDisabled(true);
319     ui->RestartButton->setDisabled(true);
320
321 }
322
323 void KitchenAlertMainWindow::initializeAlertSound()
324 {
325     QSettings settings;
326
327     bool useDefaultSound = settings.value("UseDefaultSound",true).toBool();
328     QString filename = settings.value("soundfile","").toString();
329
330     if (useDefaultSound == true)
331     {
332         openSelectSoundDialog();
333     }
334     else if (filename.isEmpty())
335     {
336         openSelectSoundDialog();
337     }
338
339    QString currentFilename = settings.value("soundfile","").toString();
340
341    if (currentFilename.isEmpty())
342    {
343         ui->debugLabel->setText("<FONT color=red>No alert sound file set. Alert sound will not be played!</FONT>");
344
345    }
346
347 }