Alarms are reported via QSystemTray now (see ticket #46).
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Tue, 16 Apr 2013 20:52:25 +0000 (20:52 +0000)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Tue, 16 Apr 2013 20:52:25 +0000 (20:52 +0000)
src/alarm/alarm.h
src/app/appsettings.h
src/gui/eventdialog.cpp
src/gui/mainwindow.cpp
src/mvc/event.cpp
src/mvc/event.h
src/mvc/treeview.cpp

index 2cafd8e86be856052a9fb30b18d2ab1a2a52b32f..e0d45cdcdfc38d097db84f28156c4ea5012695e8 100644 (file)
@@ -29,7 +29,6 @@ extern "C"
 }
 
 #define APPID "confclerk-alarm"
-const int PRE_EVENT_ALARM_SEC = -15*60; // alarm goes off 15 minutes before start of event
 
 class Alarm : public QObject
 {
index a93c0aa1185719f14a504bab0272d69fb63d2064..892e1426d6b8985a60f3134e7ad6afeb9b9ec577 100644 (file)
@@ -40,6 +40,7 @@ class AppSettings
         static void setProxyAddress(const QString &aAddress);
         static void setProxyPort(const quint16 aPort);
         static void setDirectConnection(bool aDirectConnection);
+        static int preEventAlarmSec() {return 60*15;} ///< seconds that alarm should ring before an event starts
 };
 
 #endif /* APPSETTINGS_H */
index baaa1b5407522e1f252dff3e2b305a52d849b20f..a41d7949446cb5d653c9037e8f8fda52b0212fe3 100644 (file)
@@ -112,7 +112,7 @@ void EventDialog::alarmClicked()
 #ifdef MAEMO
         // add alarm to the 'alarmd'
         Alarm alarm;
-        alarm.addAlarm(event.conferenceId(), event.id(), event.title(), event.start().addSecs(PRE_EVENT_ALARM_SEC));
+        alarm.addAlarm(event.conferenceId(), event.id(), event.title(), event.start().addSecs(-AppSettings::preEventAlarmSec()));
 #endif /* MAEMO */
     }
     event.update("alarm");
index 6ab972c8ae742ec94d1bd08703c2cffa558e816b..b20b3ba75b652604080c567f9e1bb61d1effc111 100644 (file)
@@ -30,6 +30,7 @@
 #include "track.h"
 #include "eventmodel.h"
 #include "delegate.h"
+#include "room.h"
 
 #include "conference.h"
 
@@ -106,6 +107,7 @@ MainWindow::MainWindow(QWidget* parent): QMainWindow(parent) {
 
     // systm tray icon
     connect(systemTrayIcon, SIGNAL(messageClicked()), SLOT(onSystemTrayMessageClicked()));
+    connect(systemTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(onSystemTrayMessageClicked()));
 
     // timer
     connect(alarmTimer, SIGNAL(timeout()), SLOT(onAlarmTimerTimeout()));
@@ -217,20 +219,47 @@ void MainWindow::onSearchResultChanged() {
 
 
 void MainWindow::onSystemTrayMessageClicked() {
-    // TODO: Hide icon
-    // systemTrayIcon->hide();
+    systemTrayIcon->hide();
 }
 
 
 void MainWindow::onAlarmTimerTimeout() {
-    // TODO: Show Message if an alarm is set on an event that's starting soon and delete the corresponding alarm.
-    /*
+    // determine if an alarm is set on an event that's starting soon
+    QList<Event> events = Event::getImminentAlarmEvents(AppSettings::preEventAlarmSec(), Conference::activeConference());
+    if (events.empty()) return;
+
+    // build a message string
+    Event event;
+    QString title;
+    QString message;
+    if (events.size() == 1) {
+        event = events.first();
+        title = tr("Next event at %1").arg(event.start().toString());
+        message = tr("Title: %1\nRoom: %2").arg(event.title()).arg(event.room()->name());
+    } else {
+        title = tr("%1 upcoming events").arg(events.size());
+        QStringList messages;
+        foreach (event, events) {
+            messages += tr("Start: %1; Title: %2; Room: %3").arg(event.start().toString()).arg(event.title()).arg(event.room()->name());
+        }
+        message = messages.join("\n");
+    }
+
+    // and delete the corresponding alarm
+    foreach (event, events) {
+        event.setHasAlarm(false);
+        event.update("alarm");
+        onEventChanged(event.id(), false);
+    }
+
+    // show message
     systemTrayIcon->show();
-    qDebug() << systemTrayIcon->geometry(); // gets moved to the correct location only at second usage. at least under X11/awesome, not on Win32/XP
-    systemTrayIcon->showMessage("title", "message", QSystemTrayIcon::Information, 1000);
+    // The next two lines are to prevent a very strange position of the message box the first time at X11/aweseome (not Win32/XP)
+    systemTrayIcon->showMessage("ConfClerk", "Your upcoming events", QSystemTrayIcon::Information);
+    qApp->processEvents();
+    systemTrayIcon->showMessage(title, message, QSystemTrayIcon::Information, 60*60*24*1000);
     QApplication::alert(this);
     QApplication::beep();
-    */
 }
 
 
index 92f87c16cd9c1683d10d426a072b67d8cfeb76c9..77f8f8df4dda2eb3d82471fc1f5213d5501b427a 100644 (file)
@@ -94,6 +94,15 @@ QList<Event> Event::conflictEvents(int aEventId, int conferenceId) {
 }
 
 
+QList<Event> Event::getImminentAlarmEvents(int maxSecToAlarm, int conferenceId) {
+    QSqlQuery query;
+    query.prepare(selectQuery() + "WHERE xid_conference = :conf AND (start < :start AND alarm = 1) ORDER BY start, duration");
+    query.bindValue(":conf", conferenceId);
+    query.bindValue(":start", convertToDb(QDateTime::currentDateTime().addSecs(maxSecToAlarm), QVariant::DateTime));
+    return load(query);
+}
+
+
 QList<Event> Event::getFavByDate(const QDate& date, int conferenceId)
 {
     QSqlQuery query;
index 1792271116135e19c5406e50189c5beeb2bbd346..360772d345ea1df863536d294498f589d1de7634 100644 (file)
@@ -49,6 +49,7 @@ public:
     static QList<Event> getByTrack(int id);
     static QList<Event> getByDateAndRoom(const QDate& date, int conferenceId);
     static QList<Event> conflictEvents(int aEventId, int conferenceId);
+    static QList<Event> getImminentAlarmEvents(int maxSecToAlarm, int conferenceId);
 public:
     int id() const { return value("id").toInt(); }
     int conferenceId() const { return value("xid_conference").toInt(); }
index 0f3eb24f927642bff7398cdd23559a48e022afd3..79e0f61ed28d4f6cfbf7bb1ef8b5c91d864248b5 100644 (file)
@@ -110,7 +110,7 @@ bool TreeView::testForControlClicked(const QModelIndex &aIndex, const QPoint &aP
 #ifdef MAEMO
                     // add alarm to the 'alarmd'
                     Alarm alarm;
-                    alarm.addAlarm(event.conferenceId(), event.id(), event.title(),event.start().addSecs(PRE_EVENT_ALARM_SEC));
+                    alarm.addAlarm(event.conferenceId(), event.id(), event.title(),event.start().addSecs(-AppSettings::preEventAlarmSec()));
 #endif /* MAEMO */
                 }
                 event.update("alarm");