Buggy but tolerable
[kitchenalert] / src / kitchenalertmainwindow.cpp
index ff4c78a..5d60117 100644 (file)
@@ -42,8 +42,7 @@
 #include <QAction>
 #include <QMenuBar>
 #include <QMessageBox>
-#include <QFileDialog>
-#include <QFile>
+#include <QSettings>
 
 
 
@@ -53,6 +52,13 @@ KitchenAlertMainWindow::KitchenAlertMainWindow(QWidget *parent) :
     {
     ui->setupUi(this);
 
+    setWindowIcon(QIcon(":/kitchenalert.png"));
+
+
+
+
+  connect(ui->CreateNewScheduleButton, SIGNAL (pressed()), this, SLOT (newTimerSequence()));
+
 
   //alerts' tableview setup
 
@@ -60,36 +66,29 @@ KitchenAlertMainWindow::KitchenAlertMainWindow(QWidget *parent) :
   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);
@@ -129,37 +128,33 @@ void KitchenAlertMainWindow::newTimerSequence()
     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); // take first timer (currently the only one!)
 
-       Timer* timer1 = alltimers.at(0);
-
-
-       //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();
 
 
     }
@@ -178,35 +173,39 @@ void KitchenAlertMainWindow::alert(QModelIndex indexOfAlerter)
 
     // 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 päälle hälytyksessä");
 
 }
 
 
-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
@@ -216,8 +215,13 @@ void KitchenAlertMainWindow::timerSelected(QItemSelection selected,QItemSelectio
         if (model_.isThisTimerAlerting(index) == true)
         {
              ui->SnoozeButton->setEnabled(true);
+qDebug() << "Snooze päälle";
+        }
+        else
+        {
+            ui->SnoozeButton->setDisabled(true);
+qDebug() << "Snooze pois päältä";
         }
-        else ui->SnoozeButton->setDisabled(true);
     }
 
 }
@@ -230,7 +234,7 @@ void KitchenAlertMainWindow::snooze()
         model_.snoozeTimer(row);
     }
     ui->SnoozeButton->setDisabled(true);
-    alertSound_.stop();
+  //  alertSound_.stop();
 
 }
 
@@ -242,8 +246,11 @@ void KitchenAlertMainWindow::restart()
 
         model_.startTimer(row);
     }
+
+
     ui->SnoozeButton->setDisabled(true);
-    alertSound_.stop();
+    qDebug () << "disabled snooze because of restart";
+ //   alertSound_.stop();
 
 }
 
@@ -255,61 +262,67 @@ void KitchenAlertMainWindow::stop()
         model_.stopTimer(row);
     }
     ui->SnoozeButton->setDisabled(true);
-    alertSound_.stop();
-    qDebug() << "Stopped.";
+//    alertSound_.stop();
 }
 
 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
     {
        if (dialog.isDefaultSoundChecked() == true)
-           alertSound_.setDefaultSound();
+           emit defaultSoundEnabled();
        else
-        alertSound_.setSound(dialog.getSoundFileName());
-
-   //opening a dialog clears the selection so the selection dependen buttons must be disabled
+           emit soundChanged(dialog.getSoundFileName());
     }
-    disableSelectionDependentButtons();
+
 }
 
 void KitchenAlertMainWindow::openAbout()
 {
-    QMessageBox::about(this,tr("About KitchenAlert"),tr("<p>Version 0.1.1"
+    QMessageBox::about(this,tr("About KitchenAlert"),tr("<p>Version %1"
                                                         "<p>Copyright &copy; Heli Hyv&auml;ttinen 2010"
                                                          "<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()
@@ -318,132 +331,46 @@ 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;
+    bool useDefaultSound = settings.value("UseDefaultSound",true).toBool();
+    QString filename = settings.value("soundfile","").toString();
 
-
-    //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);
-
-    disableSelectionDependentButtons();
-
-    qDebug() << filename;
-
-    if (filename.isEmpty()) //user cancelled the dialog (or gave an empty name)
+    if (useDefaultSound == true)
     {
-        return;
+        openSelectSoundDialog();
     }
-
-    if (!filename.endsWith(".kitchenalert"))
+    else if (filename.isEmpty())
     {
-        filename.append(".kitchenalert");
-
+        openSelectSoundDialog();
     }
 
-    qDebug() << "filename appended to " << filename;
-
+   QString currentFilename = settings.value("soundfile","").toString();
 
-    //MANUAL CONFIRMATION OF OWERWRITE
-
-    if ( QFile::exists(filename))
-    {
-         //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;
-        }
-    }
-
-
-
-
-
-    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);
-    }
+   if (currentFilename.isEmpty())
+   {
+        ui->debugLabel->setText("<FONT color=red>No alert sound file set. Alert sound will not be played!</FONT>");
 
+   }
 
 }
 
-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);
 }