]> ToastFreeware Gitweb - toast/confclerk.git/blobdiff - src/gui/mainwindow.cpp
Used tr() for some more GUI strings (there are plenty more that should be treated...
[toast/confclerk.git] / src / gui / mainwindow.cpp
index e055b6a573aaaa5cf4b9c4808a419b40cd09f266..98a45c8e47a39b352ef554434cd1a502a531dc76 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2012 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
 #include <QNetworkProxy>
 #include <QNetworkAccessManager>
 #include <QNetworkReply>
+#include <QSslConfiguration>
 
 #include "sqlengine.h"
 
 #include "track.h"
 #include "eventmodel.h"
 #include "delegate.h"
+#include "room.h"
 
 #include "conference.h"
 
@@ -63,7 +65,11 @@ MainWindow::MainWindow(QWidget* parent): QMainWindow(parent) {
     conferenceModel = new ConferenceModel(this);
     mXmlParser = new ScheduleXmlParser(sqlEngine, this);
     mNetworkAccessManager = new QNetworkAccessManager(this);
+    systemTrayIcon = new QSystemTrayIcon(qApp->windowIcon(), this);
+    alarmTimer = new QTimer(this);
 
+    alarmTimer->setInterval(60000);
+    alarmTimer->start();
     saved_title = windowTitle();
 
 #ifdef N810
@@ -100,7 +106,22 @@ MainWindow::MainWindow(QWidget* parent): QMainWindow(parent) {
     // search result has changed
     connect(searchTabContainer, SIGNAL(searchResultChanged()), SLOT(onSearchResultChanged()));
 
+    // systm tray icon
+    connect(systemTrayIcon, SIGNAL(messageClicked()), SLOT(onSystemTrayMessageClicked()));
+    connect(systemTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(onSystemTrayMessageClicked()));
 
+    // timer
+    connect(alarmTimer, SIGNAL(timeout()), SLOT(onAlarmTimerTimeout()));
+
+    // add the actions from the main menu to the window, otherwise the shortcuts don't work on MAEMO
+    addAction(conferencesAction);
+    addAction(settingsAction);
+    addAction(quitAction);
+
+    // make it impossible to hide the toolbar by disallowing its context menu
+    toolBar->setContextMenuPolicy(Qt::PreventContextMenu);
+
+    // open conference
     useConference(Conference::activeConference());
     // optimization, see useConference() code
     try {
@@ -110,11 +131,18 @@ MainWindow::MainWindow(QWidget* parent): QMainWindow(parent) {
         clearTabs();
     }
 
+    connect(mNetworkAccessManager, SIGNAL(sslErrors(QNetworkReply*, QList<QSslError>)), SLOT(sslErrors(QNetworkReply*, QList<QSslError>)));
     connect(mNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), SLOT(networkQueryFinished(QNetworkReply*)));
     connect(mXmlParser, SIGNAL(parsingScheduleBegin()), conferenceModel, SLOT(newConferenceBegin()));
     connect(mXmlParser, SIGNAL(parsingScheduleEnd(int)), conferenceModel, SLOT(newConferenceEnd(int)));
 }
 
+
+MainWindow::~MainWindow() {
+    sqlEngine->close();
+}
+
+
 void MainWindow::on_aboutAction_triggered()
 {
     QDialog dialog(this);
@@ -206,6 +234,51 @@ void MainWindow::onSearchResultChanged() {
 }
 
 
+void MainWindow::onSystemTrayMessageClicked() {
+    systemTrayIcon->hide();
+}
+
+
+void MainWindow::onAlarmTimerTimeout() {
+    // 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("HH:mm"));
+        message = tr("\"%1\"\n(%2)").arg(event.title()).arg(event.room()->name());
+    } else {
+        title = tr("%1 upcoming events").arg(events.size());
+        QStringList messages;
+        foreach (event, events) {
+            messages += tr("%1: \"%2\" (%3)").arg(event.start().toString("HH:mm")).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();
+    // 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", tr("Your upcoming events"), QSystemTrayIcon::Information);
+    qApp->processEvents();
+    systemTrayIcon->showMessage(title, message, QSystemTrayIcon::Information, 60*60*24*1000);
+    QApplication::alert(this);
+    QApplication::beep();
+}
+
+
 void MainWindow::useConference(int conferenceId)
 {
     if (conferenceId == -1)  // in case no conference is active
@@ -337,9 +410,29 @@ void MainWindow::on_conferencesAction_triggered()
     }
 }
 
+void MainWindow::sslErrors(QNetworkReply *aReply, const QList<QSslError> &errors) {
+    QString errorString;
+    foreach (const QSslError &error, errors) {
+        if (!errorString.isEmpty()) {
+            errorString += ", ";
+        }
+        errorString += error.errorString();
+    }
+
+    if (QMessageBox::warning(
+                this,
+                tr("SSL errors"),
+                tr("One or more SSL errors have occurred: %1", 0, errors.size()).arg(errorString),
+                QMessageBox::Ignore | QMessageBox::Cancel) == QMessageBox::Ignore) {
+        aReply->ignoreSslErrors();
+    } else {
+        aReply->abort();
+    }
+}
+
 void MainWindow::networkQueryFinished(QNetworkReply *aReply) {
     if (aReply->error() != QNetworkReply::NoError) {
-        error_message(QString("Error occured during download: ") + aReply->errorString());
+        error_message(tr("Error occurred during download: %1").arg(aReply->errorString()));
     } else {
         QUrl redirectUrl = aReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
         if (!redirectUrl.isEmpty()) {
@@ -347,7 +440,7 @@ void MainWindow::networkQueryFinished(QNetworkReply *aReply) {
                 importFromNetwork(redirectUrl.toString(), aReply->request().attribute(QNetworkRequest::User).toInt());
                 return; // don't enable controls
             } else {
-                error_message(QString("Error: Cyclic redirection from %1 to itself.").arg(redirectUrl.toString()));
+                error_message(tr("Error: Cyclic redirection from %1 to itself.").arg(redirectUrl.toString()));
             }
         } else {
             importData(aReply->readAll(), aReply->url().toEncoded(), aReply->request().attribute(QNetworkRequest::User).toInt());
@@ -364,7 +457,11 @@ void MainWindow::importData(const QByteArray &aData, const QString& url, int con
 void MainWindow::importFromNetwork(const QString& url, int conferenceId)
 {
     QNetworkRequest request;
+    QSslConfiguration qSslConfiguration = request.sslConfiguration();
+    qSslConfiguration.setProtocol(QSsl::AnyProtocol);
+    qSslConfiguration.setPeerVerifyMode(QSslSocket::QueryPeer);
     request.setUrl(QUrl(url));
+    request.setSslConfiguration(qSslConfiguration);
     request.setAttribute(QNetworkRequest::User, conferenceId);
 
     mNetworkAccessManager->setProxy(QNetworkProxy::applicationProxy());