From e587f59ddbdf6a12aa8f82a64ebef537a58f4ad7 Mon Sep 17 00:00:00 2001 From: Felix Kauselmann Date: Sat, 26 May 2018 16:20:24 +0200 Subject: [PATCH] Add support for minimize and start to tray. --- YACReaderLibrary/YACReaderLibrary.pro | 5 +++ YACReaderLibrary/library_window.cpp | 53 ++++++++++++++++----------- YACReaderLibrary/library_window.h | 5 +-- YACReaderLibrary/main.cpp | 42 ++++++++++++--------- YACReaderLibrary/options_dialog.cpp | 8 ++++ YACReaderLibrary/options_dialog.h | 31 +++++++--------- YACReaderLibrary/trayhandler.h | 7 ++++ YACReaderLibrary/trayhandler.mm | 11 ++++++ common/yacreader_global_gui.h | 2 + 9 files changed, 103 insertions(+), 61 deletions(-) create mode 100644 YACReaderLibrary/trayhandler.h create mode 100644 YACReaderLibrary/trayhandler.mm diff --git a/YACReaderLibrary/YACReaderLibrary.pro b/YACReaderLibrary/YACReaderLibrary.pro index f8460faf..c1365c47 100644 --- a/YACReaderLibrary/YACReaderLibrary.pro +++ b/YACReaderLibrary/YACReaderLibrary.pro @@ -221,6 +221,11 @@ SOURCES += comic_flow.cpp \ SOURCES += ../common/gl/yacreader_flow_gl.cpp } +macx { + HEADERS += trayhandler.h + OBJECTIVE_SOURCES += trayhandler.mm +} + include(./server/server.pri) include(../custom_widgets/custom_widgets_yacreaderlibrary.pri) diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index eae3f19e..b19d1832 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -86,6 +86,9 @@ #ifdef Q_OS_WIN #include #endif +#ifdef Q_OS_MACOS + #include "trayhandler.h" +#endif LibraryWindow::LibraryWindow() : QMainWindow(), fullscreen(false), previousFilter(""), fetching(false), status(LibraryWindow::Normal), removeError(false) @@ -139,35 +142,41 @@ void LibraryWindow::setupUI() } /* //disabled until icons are ready and macos native code is done trayIcon.setIcon(QApplication::windowIcon()); - trayIcon.show(); - connect(&trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), - this, SLOT(trayActivation(QSystemTrayIcon::ActivationReason))); } -} + else + { + // TODO: Luis: This is a placeholder. Add MacOS, Windows and maybe a fallback + // for other systems here. + trayIcon.setIcon(QIcon(":/images/iconLibrary.png")); + } -void LibraryWindow::trayActivation(QSystemTrayIcon::ActivationReason reason) -{ - if (reason == QSystemTrayIcon::Trigger) - { - setWindowState((windowState() & ~Qt::WindowMinimized)); - show(); - activateWindow(); - raise(); - } + connect(&trayIcon, &QSystemTrayIcon::activated, + [=] (QSystemTrayIcon::ActivationReason reason) { + if (reason == QSystemTrayIcon::Trigger) + { + #ifdef Q_OS_MACOS + OSXShowDockIcon(); + #endif + setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); + show(); + } + }); + trayIcon.setVisible(settings->value(MINIMIZE_TO_TRAY, true).toBool()); } - void LibraryWindow::changeEvent(QEvent *event) { - if (event->type() == QEvent::WindowStateChange && isMinimized()) - { - hide(); - } - else - { + if (event->type() == QEvent::WindowStateChange && isMinimized() && + trayIcon.isVisible()) + { + #ifdef Q_OS_MACOS + OSXHideDockIcon(); + #endif + hide(); + return; + } QMainWindow::changeEvent(event); - } -}*/ +} void LibraryWindow::doLayout() { diff --git a/YACReaderLibrary/library_window.h b/YACReaderLibrary/library_window.h index 1f2bc896..c934946e 100644 --- a/YACReaderLibrary/library_window.h +++ b/YACReaderLibrary/library_window.h @@ -385,7 +385,7 @@ public slots: void checkMaxNumLibraries(); void showErrorUpgradingLibrary(const QString &path); - //void changeEvent(QEvent *event); + void changeEvent(QEvent *event); private: //fullscreen mode in Windows for preventing this bug: QTBUG-41309 https://bugreports.qt.io/browse/QTBUG-41309 @@ -394,9 +394,6 @@ private: QSize previousSize; std::future upgradeLibraryFuture; QSystemTrayIcon trayIcon; - -private slots: - //void trayActivation(QSystemTrayIcon::ActivationReason reason); }; #endif diff --git a/YACReaderLibrary/main.cpp b/YACReaderLibrary/main.cpp index 8501179d..c65fc245 100644 --- a/YACReaderLibrary/main.cpp +++ b/YACReaderLibrary/main.cpp @@ -20,6 +20,9 @@ #include "yacreader_libraries.h" #include "exit_check.h" #include "opengl_checker.h" +#ifdef Q_OS_MACOS + #include "trayhandler.h" +#endif #include "QsLog.h" #include "QsLogDest.h" @@ -127,9 +130,12 @@ int main(int argc, char **argv) app.setApplicationVersion(VERSION); app.setAttribute(Qt::AA_UseHighDpiPixmaps); - if (QIcon::hasThemeIcon("YACReaderLibrary")) { - app.setWindowIcon(QIcon::fromTheme("YACReaderLibrary")); - } + // Set window icon according to Freedesktop icon specification + // This is mostly relevant for Linux and other Unix systems + if (QIcon::hasThemeIcon("YACReaderLibrary")) { + app.setWindowIcon(QIcon::fromTheme("YACReaderLibrary")); + } + // TODO: We might want to add a fallback icon here. QString destLog = YACReader::getSettingsPath() + "/yacreaderlibrary.log"; QDir().mkpath(YACReader::getSettingsPath()); @@ -210,18 +216,18 @@ int main(int argc, char **argv) } #ifdef SERVER_RELEASE - QSettings *settings = new QSettings(YACReader::getSettingsPath() + "/YACReaderLibrary.ini", QSettings::IniFormat); //TODO unificar la creaci�n del fichero de config con el servidor - settings->beginGroup("libraryConfig"); + QSettings * settings = new QSettings(YACReader::getSettingsPath()+"/YACReaderLibrary.ini",QSettings::IniFormat); //TODO unificar la creaci�n del fichero de config con el servidor + settings->beginGroup("libraryConfig"); - s = new Startup(); + s = new Startup(); if (settings->value(SERVER_ON, true).toBool()) { s->start(); } #endif - QLOG_INFO() << "YACReaderLibrary attempting to start"; + QLOG_INFO() << "YACReaderLibrary attempting to start"; - logSystemAndConfig(); + logSystemAndConfig(); if (YACReaderLocalServer::isRunning()) //s�lo se permite una instancia de YACReaderLibrary { @@ -235,24 +241,24 @@ int main(int argc, char **argv) auto mw = new LibraryWindow(); - mw->connect(localServer, SIGNAL(comicUpdated(quint64, const ComicDB &)), mw, SLOT(updateComicsView(quint64, const ComicDB &)), Qt::QueuedConnection); + mw->connect(localServer,SIGNAL(comicUpdated(quint64, const ComicDB &)),mw,SLOT(updateComicsView(quint64, const ComicDB &)), Qt::QueuedConnection); - //connections to localServer + //connections to localServer - mw->show(); + mw->show(); - int ret = app.exec(); + int ret = app.exec(); QLOG_INFO() << "YACReaderLibrary closed with exit code :" << ret; YACReader::exitCheck(ret); - //shutdown - s->stop(); - delete s; - localServer->close(); - delete localServer; - delete mw; + //shutdown + s->stop(); + delete s; + localServer->close(); + delete localServer; + delete mw; QsLogging::Logger::destroyInstance(); diff --git a/YACReaderLibrary/options_dialog.cpp b/YACReaderLibrary/options_dialog.cpp index 5667ff73..cfe04926 100644 --- a/YACReaderLibrary/options_dialog.cpp +++ b/YACReaderLibrary/options_dialog.cpp @@ -43,6 +43,9 @@ OptionsDialog::OptionsDialog(QWidget *parent) #ifndef NO_OPENGL sw->hide(); #endif + // Tray icon settings + QGroupBox * trayIconBox = new QGroupBox(tr("Tray icon settings")); + QVBoxLayout * trayLayout = new QVBoxLayout(); auto apiKeyLayout = new QVBoxLayout(); auto apiKeyButton = new QPushButton(tr("Edit Comic Vine API key")); @@ -115,6 +118,7 @@ OptionsDialog::OptionsDialog(QWidget *parent) auto generalW = new QWidget; generalW->setLayout(generalLayout); + generalLayout->addWidget(trayIconBox); generalLayout->addWidget(shortcutsBox); generalLayout->addWidget(apiKeyBox); generalLayout->addStretch(); @@ -146,6 +150,10 @@ void OptionsDialog::restoreOptions(QSettings *settings) { YACReaderOptionsDialog::restoreOptions(settings); + trayIconCheckbox->setChecked(settings->value(MINIMIZE_TO_TRAY, true).toBool()); + startToTrayCheckbox->setChecked(settings->value(START_TO_TRAY, false).toBool()); + startToTrayCheckbox->setEnabled(trayIconCheckbox->isChecked()); + bool useBackgroundImage = settings->value(USE_BACKGROUND_IMAGE_IN_GRID_VIEW, true).toBool(); useBackgroundImageCheck->setChecked(useBackgroundImage); diff --git a/YACReaderLibrary/options_dialog.h b/YACReaderLibrary/options_dialog.h index 20c542a1..39e8fb9f 100644 --- a/YACReaderLibrary/options_dialog.h +++ b/YACReaderLibrary/options_dialog.h @@ -19,23 +19,20 @@ public slots: void editApiKey(); void restoreOptions(QSettings *settings) override; -private slots: - void useBackgroundImageCheckClicked(bool checked); - void backgroundImageOpacitySliderChanged(int value); - void backgroundImageBlurRadiusSliderChanged(int value); - void useCurrentComicCoverCheckClicked(bool checked); - void resetToDefaults(); - -private: - QCheckBox *useBackgroundImageCheck; - QCheckBox *useCurrentComicCoverCheck; - QSlider *backgroundImageOpacitySlider; - QSlider *backgroundImageBlurRadiusSlider; - QLabel *opacityLabel; - QLabel *blurLabel; - QPushButton *resetButton; - - QCheckBox *displayContinueReadingBannerCheck; + private slots: + void useBackgroundImageCheckClicked(bool checked); + void backgroundImageOpacitySliderChanged(int value); + void backgroundImageBlurRadiusSliderChanged(int value); + void useCurrentComicCoverCheckClicked(bool checked); + void resetToDefaults(); + private: + QCheckBox * useBackgroundImageCheck; + QCheckBox * useCurrentComicCoverCheck; + QSlider * backgroundImageOpacitySlider; + QSlider * backgroundImageBlurRadiusSlider; + QLabel * opacityLabel; + QLabel * blurLabel; + QPushButton * resetButton; }; #endif diff --git a/YACReaderLibrary/trayhandler.h b/YACReaderLibrary/trayhandler.h new file mode 100644 index 00000000..ce898a0e --- /dev/null +++ b/YACReaderLibrary/trayhandler.h @@ -0,0 +1,7 @@ +#ifndef TRAY_HANDLER +#define TRAY_HANDLER + +void OSXShowDockIcon(); +void OSXHideDockIcon(); + +#endif \ No newline at end of file diff --git a/YACReaderLibrary/trayhandler.mm b/YACReaderLibrary/trayhandler.mm new file mode 100644 index 00000000..9c3cce37 --- /dev/null +++ b/YACReaderLibrary/trayhandler.mm @@ -0,0 +1,11 @@ +#import +#include "trayhandler.h" + +void OSXShowDockIcon() +{ + [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; +} +void OSXHideDockIcon() +{ + [NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory]; +} \ No newline at end of file diff --git a/common/yacreader_global_gui.h b/common/yacreader_global_gui.h index 0ec4ab1b..df8af780 100644 --- a/common/yacreader_global_gui.h +++ b/common/yacreader_global_gui.h @@ -17,6 +17,8 @@ #define FULLSCREEN "FULLSCREEN" #define Y_WINDOW_GEOMETRY "GEOMETRY" #define MAXIMIZED "MAXIMIZED" +#define MINIMIZE_TO_TRAY "MINIMIZE_TO_TRAY" +#define START_TO_TRAY "START_TO_TRAY" #define DOUBLE_PAGE "DOUBLE_PAGE" #define DOUBLE_MANGA_PAGE "DOUBLE_MANGA_PAGE" #define BACKGROUND_COLOR "BACKGROUND_COLOR"