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 2cafd8e..e0d45cd 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 a93c0aa..892e142 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 baaa1b5..a41d794 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 6ab972c..b20b3ba 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 92f87c1..77f8f8d 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 1792271..360772d 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 0f3eb24..79e0f61 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");