This commit is contained in:
Martin Rotter 2014-10-06 18:35:34 +02:00
parent 8f5fbf68eb
commit f8945e1da0
8 changed files with 100 additions and 18 deletions

View File

@ -3,7 +3,7 @@
Fixed: Fixed:
<ul> <ul>
<li>Fixed #76, #75, #82.</li> <li>Fixed #76, #75, #82, #79.</li>
</ul> </ul>
Added: Added:

View File

@ -590,6 +590,7 @@ void FormSettings::selectSqlBackend(int index) {
void FormSettings::loadGeneral() { void FormSettings::loadGeneral() {
m_ui->m_checkAutostart->setText(m_ui->m_checkAutostart->text().arg(APP_NAME)); m_ui->m_checkAutostart->setText(m_ui->m_checkAutostart->text().arg(APP_NAME));
m_ui->m_checkForUpdatesOnStart->setChecked(qApp->settings()->value(APP_CFG_GEN, "update_on_start", true).toBool());
// Load auto-start status. // Load auto-start status.
SystemFactory::AutoStartStatus autostart_status = qApp->system()->getAutoStartStatus(); SystemFactory::AutoStartStatus autostart_status = qApp->system()->getAutoStartStatus();
@ -609,14 +610,15 @@ void FormSettings::loadGeneral() {
} }
void FormSettings::saveGeneral() { void FormSettings::saveGeneral() {
// If auto-start feature is available and user wants // If auto-start feature is available and user wants to turn it on, then turn it on.
// to turn it on, then turn it on.
if (m_ui->m_checkAutostart->isChecked()) { if (m_ui->m_checkAutostart->isChecked()) {
qApp->system()->setAutoStartStatus(SystemFactory::Enabled); qApp->system()->setAutoStartStatus(SystemFactory::Enabled);
} }
else { else {
qApp->system()->setAutoStartStatus(SystemFactory::Disabled); qApp->system()->setAutoStartStatus(SystemFactory::Disabled);
} }
qApp->settings()->setValue(APP_CFG_GEN, "update_on_start", m_ui->m_checkForUpdatesOnStart->isChecked());
} }
void FormSettings::loadInterface() { void FormSettings::loadInterface() {

View File

@ -116,6 +116,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QCheckBox" name="m_checkForUpdatesOnStart">
<property name="text">
<string>Check for updates on application startup</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="m_pageDataStorage"> <widget class="QWidget" name="m_pageDataStorage">

View File

@ -52,7 +52,9 @@ SystemTrayIcon::SystemTrayIcon(const QString &normal_icon,
: QSystemTrayIcon(parent), : QSystemTrayIcon(parent),
m_normalIcon(normal_icon), m_normalIcon(normal_icon),
m_plainPixmap(plain_icon), m_plainPixmap(plain_icon),
m_font(QFont()) { m_font(QFont()),
m_bubbleClickTarget(NULL),
m_bubbleClickSlot(NULL) {
qDebug("Creating SystemTrayIcon instance."); qDebug("Creating SystemTrayIcon instance.");
m_font.setBold(true); m_font.setBold(true);
@ -62,8 +64,7 @@ SystemTrayIcon::SystemTrayIcon(const QString &normal_icon,
setContextMenu(parent->trayMenu()); setContextMenu(parent->trayMenu());
// Create necessary connections. // Create necessary connections.
connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(onActivated(QSystemTrayIcon::ActivationReason)));
this, SLOT(onActivated(QSystemTrayIcon::ActivationReason)));
} }
SystemTrayIcon::~SystemTrayIcon() { SystemTrayIcon::~SystemTrayIcon() {
@ -88,9 +89,7 @@ bool SystemTrayIcon::isSystemTrayAvailable() {
} }
bool SystemTrayIcon::isSystemTrayActivated() { bool SystemTrayIcon::isSystemTrayActivated() {
return SystemTrayIcon::isSystemTrayAvailable() && qApp->settings()->value(APP_CFG_GUI, return SystemTrayIcon::isSystemTrayAvailable() && qApp->settings()->value(APP_CFG_GUI, "use_tray_icon", true).toBool();
"use_tray_icon",
true).toBool();
} }
void SystemTrayIcon::showPrivate() { void SystemTrayIcon::showPrivate() {
@ -166,3 +165,23 @@ void SystemTrayIcon::setNumber(int number) {
QSystemTrayIcon::setIcon(QIcon(background)); QSystemTrayIcon::setIcon(QIcon(background));
} }
} }
void SystemTrayIcon::showMessage(const QString &title, const QString &message, QSystemTrayIcon::MessageIcon icon,
int milliseconds_timeout_hint, QObject *click_target, const char *click_slot) {
if (m_bubbleClickTarget != NULL && m_bubbleClickSlot != NULL) {
// Disconnect previous bubble click signalling.
disconnect(this, SIGNAL(messageClicked()), m_bubbleClickTarget, m_bubbleClickSlot);
}
m_bubbleClickSlot = (char*) click_slot;
m_bubbleClickTarget = click_target;
if (click_target != NULL && click_slot != NULL) {
// Establish new connection for bubble click.
connect(this, SIGNAL(messageClicked()), click_target, click_slot);
}
// NOTE: If connections do not work, then use QMetaObject::invokeMethod(...).
QSystemTrayIcon::showMessage(title, message, icon, milliseconds_timeout_hint);
}

View File

@ -19,6 +19,9 @@
#define SYSTEMTRAYICON_H #define SYSTEMTRAYICON_H
#include <QSystemTrayIcon> #include <QSystemTrayIcon>
#include "definitions/definitions.h"
#include <QPointer> #include <QPointer>
#include <QPixmap> #include <QPixmap>
#include <QMenu> #include <QMenu>
@ -51,6 +54,13 @@ class SystemTrayIcon : public QSystemTrayIcon {
FormMain *parent = 0); FormMain *parent = 0);
virtual ~SystemTrayIcon(); virtual ~SystemTrayIcon();
// Sets the number to be visible in the tray icon, number <= 0 removes it.
void setNumber(int number = -1);
void showMessage(const QString &title, const QString &message, MessageIcon icon = Information,
int milliseconds_timeout_hint = TRAY_ICON_BUBBLE_TIMEOUT, QObject *click_target = NULL,
const char *click_slot = NULL);
// Returns true if tray icon CAN be constructed on this machine. // Returns true if tray icon CAN be constructed on this machine.
static bool isSystemTrayAvailable(); static bool isSystemTrayAvailable();
@ -58,9 +68,6 @@ class SystemTrayIcon : public QSystemTrayIcon {
// application settings. // application settings.
static bool isSystemTrayActivated(); static bool isSystemTrayActivated();
// Sets the number to be visible in the tray icon, number <= 0 removes it.
void setNumber(int number = -1);
public slots: public slots:
void show(); void show();
@ -72,6 +79,9 @@ class SystemTrayIcon : public QSystemTrayIcon {
QIcon m_normalIcon; QIcon m_normalIcon;
QPixmap m_plainPixmap; QPixmap m_plainPixmap;
QFont m_font; QFont m_font;
QObject *m_bubbleClickTarget;
char *m_bubbleClickSlot;
}; };
#endif // SYSTEMTRAYICON_H #endif // SYSTEMTRAYICON_H

View File

@ -33,6 +33,7 @@
#include <QThread> #include <QThread>
#include <QTranslator> #include <QTranslator>
#include <QDebug> #include <QDebug>
#include <QTimer>
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
@ -111,11 +112,14 @@ int main(int argc, char *argv[]) {
// Display tray icon if it is enabled and available. // Display tray icon if it is enabled and available.
if (SystemTrayIcon::isSystemTrayActivated()) { if (SystemTrayIcon::isSystemTrayActivated()) {
qApp->showTrayIcon(); qApp->showTrayIcon();
if (qApp->settings()->value(APP_CFG_GEN, "update_on_start", true).toBool()) {
QTimer::singleShot(STARTUP_UPDATE_DELAY, application.system(), SLOT(checkForUpdatesAsynchronously()));
}
} }
// Setup single-instance behavior. // Setup single-instance behavior.
QObject::connect(&application, SIGNAL(messageReceived(QString)), QObject::connect(&application, SIGNAL(messageReceived(QString)), &application, SLOT(processExecutionMessage(QString)));
&application, SLOT(processExecutionMessage(QString)));
// Enter global event loop. // Enter global event loop.
return Application::exec(); return Application::exec();

View File

@ -18,7 +18,9 @@
#include "miscellaneous/systemfactory.h" #include "miscellaneous/systemfactory.h"
#include "network-web/networkfactory.h" #include "network-web/networkfactory.h"
#include "gui/formmain.h"
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include "miscellaneous/systemfactory.h"
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
#include <QSettings> #include <QSettings>
@ -29,7 +31,17 @@
#include <QDomDocument> #include <QDomDocument>
#include <QDomElement> #include <QDomElement>
#include <QDomAttr> #include <QDomAttr>
#include <QFuture>
#include <QFutureWatcher>
#if QT_VERSION >= 0x050000
#include <QtConcurrent/QtConcurrentRun>
#else
#include <QtConcurrentRun>
#endif
typedef QPair<UpdateInfo, QNetworkReply::NetworkError> UpdateCheck;
SystemFactory::SystemFactory(QObject *parent) : QObject(parent) { SystemFactory::SystemFactory(QObject *parent) : QObject(parent) {
} }
@ -43,10 +55,7 @@ SystemFactory::AutoStartStatus SystemFactory::getAutoStartStatus() {
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
QSettings registry_key("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings registry_key("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",
QSettings::NativeFormat); QSettings::NativeFormat);
bool autostart_enabled = registry_key.value(APP_LOW_NAME, bool autostart_enabled = registry_key.value(APP_LOW_NAME, "").toString().replace('\\', '/') == Application::applicationFilePath();
"").toString().replace('\\',
'/') ==
Application::applicationFilePath();
if (autostart_enabled) { if (autostart_enabled) {
return SystemFactory::Enabled; return SystemFactory::Enabled;
@ -200,3 +209,25 @@ UpdateInfo SystemFactory::parseUpdatesFile(const QByteArray &updates_file) {
return update; return update;
} }
void SystemFactory::checkForUpdatesAsynchronously() {
QFutureWatcher<UpdateCheck> *watcher_for_future = new QFutureWatcher<UpdateCheck>(this);
connect(watcher_for_future, SIGNAL(finished()), this, SLOT(handleBackgroundUpdatesCheck()));
watcher_for_future->setFuture(QtConcurrent::run(this, &SystemFactory::checkForUpdates));
}
void SystemFactory::handleBackgroundUpdatesCheck() {
QFutureWatcher<UpdateCheck> *future_watcher = static_cast<QFutureWatcher<UpdateCheck>*>(sender());
UpdateCheck updates = future_watcher->result();
if (updates.second == QNetworkReply::NoError && updates.first.m_availableVersion != APP_VERSION) {
if (SystemTrayIcon::isSystemTrayActivated()) {
qApp->trayIcon()->showMessage(tr("New version available"),
tr("Click the bubble for more information."),
QSystemTrayIcon::Information,
TRAY_ICON_BUBBLE_TIMEOUT,
qApp->mainForm(), SLOT(showUpdates()));
}
}
}

View File

@ -88,6 +88,15 @@ class SystemFactory : public QObject {
// Tries to download list with new updates. // Tries to download list with new updates.
QPair<UpdateInfo, QNetworkReply::NetworkError> checkForUpdates(); QPair<UpdateInfo, QNetworkReply::NetworkError> checkForUpdates();
public slots:
void checkForUpdatesAsynchronously();
private slots:
void handleBackgroundUpdatesCheck();
signals:
void updateCheckedAsynchronously(QPair<UpdateInfo, QNetworkReply::NetworkError> update_info);
private: private:
// Performs parsing of downloaded file with list of updates. // Performs parsing of downloaded file with list of updates.
UpdateInfo parseUpdatesFile(const QByteArray &updates_file); UpdateInfo parseUpdatesFile(const QByteArray &updates_file);