KitchenAlert
- Copyright (C) 2010 Heli Hyvättinen
+ Copyright (C) 2010-2011 Heli Hyvättinen
This file is part of KitchenAlert.
#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
-#include <QFileDialog>
-#include <QFile>
+#include <QSettings>
{
ui->setupUi(this);
+ setWindowIcon(QIcon(":/kitchenalert.png"));
+
+
+
+
+ connect(ui->CreateNewScheduleButton, SIGNAL (pressed()), this, SLOT (newTimerSequence()));
+
//alerts' tableview setup
ui->ComingAlertsTableView->setModel(&model_);
ui->ComingAlertsTableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->ComingAlertsTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
+
+ ui->ComingAlertsTableView->horizontalHeader()->hide();
+// ui->ComingAlertsTableView->verticalHeader()->setVisible(true);
+
ui->ComingAlertsTableView->horizontalHeader()->setResizeMode(QHeaderView::Fixed);
- ui->ComingAlertsTableView->horizontalHeader()->resizeSection(0,460);
+ ui->ComingAlertsTableView->horizontalHeader()->resizeSection(0,535);
ui->ComingAlertsTableView->horizontalHeader()->resizeSection(1,140);
ui->ComingAlertsTableView->horizontalHeader()->resizeSection(2,100);
ui->ComingAlertsTableView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
-// ui->ComingAlertsTableView->verticalHeader()->setDefaultSectionSize(40); //Needed with fixed cell heght only
-
-
-
-
- ui->ComingAlertsTableView->horizontalHeader()->hide();
- ui->ComingAlertsTableView->setWordWrap(true);
- //Buttons used when a timer is selected are disabled by default and enabled upon selection
+ //Buttons used to reacting an alarm are hidden by default
disableSelectionDependentButtons();
+
connect(ui->ComingAlertsTableView->selectionModel(),SIGNAL(selectionChanged(QItemSelection,QItemSelection)),this,SLOT(timerSelected(QItemSelection,QItemSelection)));
- //connect buttons to respective functions
- connect(ui->CreateNewScheduleButton, SIGNAL (pressed()), this, SLOT (newTimerSequence()));
connect(ui->DoneButton,SIGNAL(clicked()),this,SLOT(stop()));
connect(ui->RestartButton,SIGNAL(clicked()),this,SLOT(restart()));
connect(ui->SnoozeButton,SIGNAL(clicked()),this, SLOT(snooze()));
connect(ui->RemoveButton,SIGNAL(clicked()),this,SLOT(remove()));
- connect(ui->SaveButton,SIGNAL(clicked()),this,SLOT(saveTimer()));
- connect(ui->loadButton,SIGNAL(clicked()),this,SLOT(loadTimer()));
-
// menu setup
QAction * p_SelectSoundAction = new QAction(tr("Select alert sound"),this);
if (createdialog.exec() == QDialog::Accepted) //if user pressed OK
{
- //get user input from the dialog
-
-
- QList<Timer *> alltimers = createdialog.getTimers();
-
- // take first timer (currently the only one!)
+ QList<Timer *> alltimers = createdialog.getTimers(); //get user input from the dialog
- Timer* timer1 = alltimers.at(0);
+ Timer* timer1 = alltimers.at(0); // take first timer (currently the only one!)
- //connect alert
-
connect(timer1,SIGNAL(alert(QModelIndex)),this,SLOT(alert(QModelIndex)));
- //Disable buttons, as selection is cleared when view is refreshed to show the new timer
- disableSelectionDependentButtons();
+ connect(this,SIGNAL(defaultSoundEnabled()),timer1,SLOT(enableDefaultSound()));
+ connect(this,SIGNAL(soundChanged(QString)),timer1,SLOT(changeAlertSound(QString)));
+
- // give timers to the model
+ model_.addTimers(alltimers); // give timers to the model, they are started automatically by default
- model_.addTimers(alltimers);
+ // ui->ComingAlertsTableView->resizeColumnsToContents();
- //start the timer when it's safely in the model (consider moving this to the model's addTimers function)
+ //Disable buttons, as selection is cleared when view is refreshed to show the new timer
+ //But only if the timer has not already alerted and thus been selected
+ if (!selectedRow().isValid())
+ disableSelectionDependentButtons();
- timer1->start();
}
// The program is brought to front and activated when alerted
- raise();
+
activateWindow();
+// removing everything below does not solve the bug #6752!
+
+ raise(); //this may be unnecessary
+
// The alerting timer is selected
ui->ComingAlertsTableView->selectionModel()->select(QItemSelection(indexOfAlerter,indexOfAlerter),QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows );
-// qDebug() << "Should be selected now";
+ //Scrolls the view so that the alerting timer is visible
+ ui->ComingAlertsTableView->scrollTo(indexOfAlerter);
- //Snooze button is enabled
+ // qDebug() << "Should be selected now";
- ui->SnoozeButton->setEnabled(true);
+ //Snooze button is enabled
- //The alert sound is played (consider moving this operation inside timer, as now stopping one alert will silence all alerting alerts)
- alertSound_.play();
+ ui->SnoozeButton->setEnabled(true);
+//qDebug ("Snooze on when alerting");
}
-void KitchenAlertMainWindow::timerSelected(QItemSelection selected,QItemSelection deselected)
+void KitchenAlertMainWindow::timerSelected(QItemSelection selected,QItemSelection)
{
ui->DoneButton->setEnabled(true);
ui->RestartButton->setEnabled(true);
ui->RemoveButton->setEnabled(true);
- ui->SaveButton->setEnabled(true);
- //enabled only when alerting
+ //snooze button enabled only when alerting
QModelIndexList indexes = selected.indexes();
//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
if (model_.isThisTimerAlerting(index) == true)
{
ui->SnoozeButton->setEnabled(true);
+//qDebug() << "Snooze on";
+ }
+ else
+ {
+ ui->SnoozeButton->setDisabled(true);
+//qDebug() << "Snooze off";
}
- else ui->SnoozeButton->setDisabled(true);
}
}
model_.snoozeTimer(row);
}
ui->SnoozeButton->setDisabled(true);
- alertSound_.stop();
+
}
model_.startTimer(row);
}
- ui->SnoozeButton->setDisabled(true);
- alertSound_.stop();
+
+
+ if (model_.isThisTimerAlerting(row) == false) //This has to be checked, because 00:00:00 alerts alert *before* the program execution reaches here
+ {
+ ui->SnoozeButton->setDisabled(true);
+ }
+ // qDebug () << "disabled snooze because of restart";
+
}
model_.stopTimer(row);
}
ui->SnoozeButton->setDisabled(true);
- alertSound_.stop();
- qDebug() << "Stopped.";
+
}
QModelIndex KitchenAlertMainWindow::selectedRow()
{
+ //Returns the cells in row 0 that have the whole row selected (the selection mode used allows only selecting whole rows
+
QModelIndexList chosenRows = ui->ComingAlertsTableView->selectionModel()->selectedRows();
//The selection mode used allows only one row to be selected at time, so we just take the first
- //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
+
return chosenRows.value(0); //gives an invalid QModelIndex if the list is empty
}
void KitchenAlertMainWindow::openSelectSoundDialog()
{
+
SelectSoundDialog dialog;
if ( dialog.exec() == QDialog::Accepted) //if user pressed OK
{
+ QSettings settings ("KitchenAlert","KitchenAlert");
+
if (dialog.isDefaultSoundChecked() == true)
- alertSound_.setDefaultSound();
- else
- alertSound_.setSound(dialog.getSoundFileName());
+ {
+
+ settings.setValue("UseDefaultSound",true);
+ emit defaultSoundEnabled();
+ }
+ else
+ {
+ QString filename = dialog.getSoundFileName();
+ settings.setValue("UseDefaultSound",false);
+ settings.setValue("soundfile",filename);
+ emit soundChanged(filename);
+ }
- //opening a dialog clears the selection so the selection dependen buttons must be disabled
}
- disableSelectionDependentButtons();
+
}
void KitchenAlertMainWindow::openAbout()
{
- QMessageBox::about(this,tr("About KitchenAlert"),tr("<p>Version 0.1.1"
- "<p>Copyright © Heli Hyvättinen 2010"
+ QMessageBox::about(this,tr("About KitchenAlert"),tr("<p>Version %1"
+ "<p>Copyright © Heli Hyvättinen 2010-2011"
"<p>License: General Public License v3"
- "<p>Bugtracker and project page: https://garage.maemo.org/projects/kitchenalert/"));
+ "<p>Web page: http://kitchenalert.garage.maemo.org/"
+ "<p>Bugtracker: https://garage.maemo.org/projects/kitchenalert/").arg(QApplication::applicationVersion()));
}
bool KitchenAlertMainWindow::event(QEvent *event)
{
- QMainWindow::event(event);
+
switch (event->type())
{
case QEvent::WindowActivate:
model_.setUpdateViewOnChanges(true);
- break;
+// ui->debugLabel->setText("Returned to the application!");
+ break;
case QEvent::WindowDeactivate:
model_.setUpdateViewOnChanges(false);
+// ui->debugLabel->setText("");
break;
default:
break;
+
}
+
+ return QMainWindow::event(event); // Send the event to the base class implementation (also when handling the event in this function): necessary for the program to work!
}
void KitchenAlertMainWindow::disableSelectionDependentButtons()
ui->SnoozeButton->setDisabled(true);
ui->RestartButton->setDisabled(true);
ui->RemoveButton->setDisabled(true);
- ui->SaveButton->setDisabled(true);
-}
-void KitchenAlertMainWindow::remove()
-{
- QModelIndex row = selectedRow();
- if (row.isValid())
- {
- model_.removeTimer(row);
- alertSound_.stop();
- ui->ComingAlertsTableView->clearSelection();
- disableSelectionDependentButtons();
- }
}
-void KitchenAlertMainWindow::saveTimer()
+void KitchenAlertMainWindow::initializeAlertSound()
{
+ QSettings settings;
- QModelIndex row = selectedRow();
-
- if (row.isValid() == false) //If there was no row selected invalid row was returned
- return;
-
-
- //file name is asked. As the filename will be appended, there's no point in confirming owerwrite here
- QString filename = QFileDialog::getSaveFileName(this, "", "", "*.kitchenalert",NULL,QFileDialog::DontConfirmOverwrite);
+ bool useDefaultSound = settings.value("UseDefaultSound",true).toBool();
+ QString filename = settings.value("soundfile","").toString();
- disableSelectionDependentButtons();
-
- qDebug() << filename;
-
- if (filename.isEmpty()) //user cancelled the dialog (or gave an empty name)
+ if (useDefaultSound == true)
{
- return;
+ openSelectSoundDialog();
}
-
- if (!filename.endsWith(".kitchenalert"))
- {
- filename.append(".kitchenalert");
-
- }
-
- qDebug() << "filename appended to " << filename;
-
-
- //MANUAL CONFIRMATION OF OWERWRITE
-
- if ( QFile::exists(filename))
+ else if (filename.isEmpty())
{
- //ASK FOR CONFIRMATION
-
- QString overwriteQuestion ("File ");
- overwriteQuestion.append(filename);
- overwriteQuestion.append(" already exists. Do you want to overwrite it?");
- if (QMessageBox::question(this,"Confirm overwrite?", overwriteQuestion,QMessageBox::Yes | QMessageBox::No,QMessageBox::No) != QMessageBox::Yes)
- {
- return;
- }
+ openSelectSoundDialog();
}
+ QString currentFilename = settings.value("soundfile","").toString();
+ if (currentFilename.isEmpty())
+ {
+ ui->debugLabel->setText("<FONT color=red>No alert sound file set. Alert sound will not be played!</FONT>");
-
-
- QString errorMessage(tr("Cannot write to file "));
- errorMessage.append(filename);
-
- if (!model_.saveTimer(row,filename)) //Save the file, if not successful give an error message
- {
- QMessageBox::critical(this,tr("Save timer failed!"), errorMessage);
- }
-
+ }
}
-void KitchenAlertMainWindow::loadTimer()
+void KitchenAlertMainWindow::remove()
{
- QString filename = QFileDialog::getOpenFileName(this,"","",tr("KitchenAlert timer files (*.kitchenalert)"));
- if (!filename.isEmpty())
+ QModelIndex row = selectedRow();
+ if (row.isValid()) //If there was no row selected invalid row was returned
{
-
-// if (!filename.endsWith(".kitchenalert")) //not needed, the dialog won't let the user to select files not ending with ".kitchenalert"
-// {
-// filename.append(".kitchenalert");
-// }
-
- QString errorTitle(tr("Failed to load file "));
- errorTitle.append(filename);
-
- Timer * p_timer = new Timer();
- if (!p_timer->load(filename))
+ QString text = tr("Are you sure you want to remove this timer from the list:\n");
+ text.append((row.data().toString()));
+ if (QMessageBox::question(this,tr("Confirm timer removal"),text,QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
{
- QMessageBox::critical(this,errorTitle,tr("Unable to open file or not a valid KitchenAlert timer file."));
- delete p_timer;
- return;
+ model_.removeTimer(row);
}
-
- initializeTimer(p_timer);
}
-}
-
-
-void KitchenAlertMainWindow::initializeTimer(Timer *p_timer)
-{
-
-//connect alert
-
-
-connect(p_timer,SIGNAL(alert(QModelIndex)),this,SLOT(alert(QModelIndex)));
-
-
-//Disable buttons, as selection is cleared when view is refreshed to show the new timer
-
-disableSelectionDependentButtons();
-
-
-// give timers to the model (model wants list of timers now..)
-
-QList<Timer *> timerList;
-
-timerList.append(p_timer);
-model_.addTimers(timerList);
-
-
-//start the timer when it's safely in the model (consider moving this to the model's addTimers function)
-
-
-p_timer->start();
+ ui->SnoozeButton->setDisabled(true);
}