Check if system has system tray using QSystemTrayIcon::isSystemTrayAvailable()

This commit is contained in:
Jonas Kvinge 2018-09-30 15:33:27 +02:00
parent 6d888eb51a
commit 298dbe96c8
5 changed files with 79 additions and 55 deletions

View File

@ -29,6 +29,7 @@
#include <QApplication> #include <QApplication>
#include <QObject> #include <QObject>
#include <QWidget> #include <QWidget>
#include <QSystemTrayIcon>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include <QByteArray> #include <QByteArray>
#include <QDir> #include <QDir>
@ -574,15 +575,16 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co
mac::SetApplicationHandler(this); mac::SetApplicationHandler(this);
#endif #endif
// Tray icon // Tray icon
tray_icon_->SetupMenu(ui_->action_previous_track, ui_->action_play_pause, ui_->action_stop, ui_->action_stop_after_this_track, ui_->action_next_track, ui_->action_mute, ui_->action_quit); if (tray_icon_) {
tray_icon_->SetupMenu(ui_->action_previous_track, ui_->action_play_pause, ui_->action_stop, ui_->action_stop_after_this_track, ui_->action_next_track, ui_->action_mute, ui_->action_quit);
connect(tray_icon_, SIGNAL(PlayPause()), app_->player(), SLOT(PlayPause())); connect(tray_icon_, SIGNAL(PlayPause()), app_->player(), SLOT(PlayPause()));
connect(tray_icon_, SIGNAL(SeekForward()), app_->player(), SLOT(SeekForward())); connect(tray_icon_, SIGNAL(SeekForward()), app_->player(), SLOT(SeekForward()));
connect(tray_icon_, SIGNAL(SeekBackward()), app_->player(), SLOT(SeekBackward())); connect(tray_icon_, SIGNAL(SeekBackward()), app_->player(), SLOT(SeekBackward()));
connect(tray_icon_, SIGNAL(NextTrack()), app_->player(), SLOT(Next())); connect(tray_icon_, SIGNAL(NextTrack()), app_->player(), SLOT(Next()));
connect(tray_icon_, SIGNAL(PreviousTrack()), app_->player(), SLOT(Previous())); connect(tray_icon_, SIGNAL(PreviousTrack()), app_->player(), SLOT(Previous()));
connect(tray_icon_, SIGNAL(ShowHide()), SLOT(ToggleShowHide())); connect(tray_icon_, SIGNAL(ShowHide()), SLOT(ToggleShowHide()));
connect(tray_icon_, SIGNAL(ChangeVolume(int)), SLOT(VolumeWheelEvent(int))); connect(tray_icon_, SIGNAL(ChangeVolume(int)), SLOT(VolumeWheelEvent(int)));
}
// Windows 7 thumbbar buttons // Windows 7 thumbbar buttons
thumbbar_->SetActions(QList<QAction*>() << ui_->action_previous_track << ui_->action_play_pause << ui_->action_stop << ui_->action_next_track << nullptr); // spacer thumbbar_->SetActions(QList<QAction*>() << ui_->action_previous_track << ui_->action_play_pause << ui_->action_stop << ui_->action_next_track << nullptr); // spacer
@ -720,31 +722,32 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co
// Reload playlist settings, for BG and glowing // Reload playlist settings, for BG and glowing
ui_->playlist->view()->ReloadSettings(); ui_->playlist->view()->ReloadSettings();
#ifdef Q_OS_MACOS // Always show mainwindow on startup if on macos
#ifndef Q_OS_MACOS show();
#else
QSettings settings; QSettings settings;
settings.beginGroup(BehaviourSettingsPage::kSettingsGroup); settings.beginGroup(BehaviourSettingsPage::kSettingsGroup);
StartupBehaviour behaviour = StartupBehaviour(settings.value("startupbehaviour", Startup_Remember).toInt()); StartupBehaviour behaviour = StartupBehaviour(settings.value("startupbehaviour", Startup_Remember).toInt());
settings.endGroup(); settings.endGroup();
bool hidden = settings_.value("hidden", false).toBool(); bool hidden = settings_.value("hidden", false).toBool();
if (hidden && (!QSystemTrayIcon::isSystemTrayAvailable() || !tray_icon_ || !tray_icon_->IsVisible())) {
hidden = false;
switch (behaviour) {
case Startup_AlwaysHide: hide(); break;
case Startup_AlwaysShow: show(); break;
case Startup_Remember:
setVisible(!hidden);
break;
}
// Force the window to show in case somehow the config has tray and window set to hide
if (hidden && !tray_icon_->IsVisible()) {
settings_.setValue("hidden", false); settings_.setValue("hidden", false);
show(); show();
} }
#else // Q_OS_MACOS else {
// Always show mainwindow on startup on OS X. switch (behaviour) {
show(); case Startup_AlwaysHide:
hide();
break;
case Startup_AlwaysShow:
show();
break;
case Startup_Remember:
setVisible(!hidden);
break;
}
}
#endif #endif
QShortcut *close_window_shortcut = new QShortcut(this); QShortcut *close_window_shortcut = new QShortcut(this);
@ -759,7 +762,7 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co
qLog(Debug) << "Started"; qLog(Debug) << "Started";
RefreshStyleSheet(); RefreshStyleSheet();
initialised_ = true; initialised_ = true;
} }
@ -774,13 +777,11 @@ void MainWindow::ReloadSettings() {
QSettings settings; QSettings settings;
#ifndef Q_OS_MACOS #ifndef Q_OS_MACOS
settings.beginGroup(BehaviourSettingsPage::kSettingsGroup); settings.beginGroup(BehaviourSettingsPage::kSettingsGroup);
bool showtrayicon = settings.value("showtrayicon", true).toBool(); bool showtrayicon = settings.value("showtrayicon", true).toBool();
settings.endGroup(); settings.endGroup();
if (tray_icon_) tray_icon_->SetVisible(showtrayicon);
tray_icon_->SetVisible(showtrayicon); if ((!showtrayicon || !QSystemTrayIcon::isSystemTrayAvailable()) && !isVisible()) show();
if (!showtrayicon && !isVisible()) show();
#endif #endif
settings.beginGroup(PlaylistSettingsPage::kSettingsGroup); settings.beginGroup(PlaylistSettingsPage::kSettingsGroup);
@ -828,8 +829,10 @@ void MainWindow::MediaStopped() {
track_position_timer_->stop(); track_position_timer_->stop();
track_slider_timer_->stop(); track_slider_timer_->stop();
ui_->track_slider->SetStopped(); ui_->track_slider->SetStopped();
tray_icon_->SetProgress(0); if (tray_icon_) {
tray_icon_->SetStopped(); tray_icon_->SetProgress(0);
tray_icon_->SetStopped();
}
song_playing_ = Song(); song_playing_ = Song();
song_ = Song(); song_ = Song();
@ -849,7 +852,7 @@ void MainWindow::MediaPaused() {
track_position_timer_->stop(); track_position_timer_->stop();
track_slider_timer_->stop(); track_slider_timer_->stop();
tray_icon_->SetPaused(); if (tray_icon_) tray_icon_->SetPaused();
} }
@ -866,7 +869,7 @@ void MainWindow::MediaPlaying() {
bool can_seek = !(app_->player()->GetCurrentItem()->options() & PlaylistItem::SeekDisabled); bool can_seek = !(app_->player()->GetCurrentItem()->options() & PlaylistItem::SeekDisabled);
ui_->track_slider->SetCanSeek(can_seek); ui_->track_slider->SetCanSeek(can_seek);
tray_icon_->SetPlaying(enable_play_pause); if (tray_icon_) tray_icon_->SetPlaying(enable_play_pause);
track_position_timer_->start(); track_position_timer_->start();
track_slider_timer_->start(); track_slider_timer_->start();
@ -876,7 +879,7 @@ void MainWindow::MediaPlaying() {
void MainWindow::VolumeChanged(int volume) { void MainWindow::VolumeChanged(int volume) {
ui_->action_mute->setChecked(!volume); ui_->action_mute->setChecked(!volume);
tray_icon_->MuteButtonStateChanged(!volume); if (tray_icon_) tray_icon_->MuteButtonStateChanged(!volume);
} }
void MainWindow::SongChanged(const Song &song) { void MainWindow::SongChanged(const Song &song) {
@ -884,7 +887,7 @@ void MainWindow::SongChanged(const Song &song) {
song_playing_ = song; song_playing_ = song;
song_ = song; song_ = song;
setWindowTitle(song.PrettyTitleWithArtist()); setWindowTitle(song.PrettyTitleWithArtist());
tray_icon_->SetProgress(0); if (tray_icon_) tray_icon_->SetProgress(0);
} }
@ -1078,7 +1081,7 @@ void MainWindow::closeEvent(QCloseEvent *event) {
bool keep_running = settings.value("keeprunning", false).toBool(); bool keep_running = settings.value("keeprunning", false).toBool();
settings.endGroup(); settings.endGroup();
if (keep_running && event->spontaneous()) { if (keep_running && event->spontaneous() && QSystemTrayIcon::isSystemTrayAvailable()) {
event->ignore(); event->ignore();
SetHiddenInTray(true); SetHiddenInTray(true);
} }
@ -1111,7 +1114,7 @@ void MainWindow::Seeked(qlonglong microseconds) {
const int position = microseconds / kUsecPerSec; const int position = microseconds / kUsecPerSec;
const int length = app_->player()->GetCurrentItem()->Metadata().length_nanosec() / kNsecPerSec; const int length = app_->player()->GetCurrentItem()->Metadata().length_nanosec() / kNsecPerSec;
tray_icon_->SetProgress(double(position) / length * 100); if (tray_icon_) tray_icon_->SetProgress(double(position) / length * 100);
} }
@ -1132,9 +1135,8 @@ void MainWindow::UpdateTrackPosition() {
} }
// Update the tray icon every 10 seconds // Update the tray icon every 10 seconds
if (position % 10 == 0) { if (position % 10 == 0 && tray_icon_) tray_icon_->SetProgress(double(position) / length * 100);
tray_icon_->SetProgress(double(position) / length * 100);
}
} }
void MainWindow::UpdateTrackSliderPosition() { void MainWindow::UpdateTrackSliderPosition() {
@ -2202,7 +2204,7 @@ void MainWindow::Exit() {
if (app_->player()->GetState() == Engine::Playing) { if (app_->player()->GetState() == Engine::Playing) {
app_->player()->Stop(); app_->player()->Stop();
hide(); hide();
tray_icon_->SetVisible(false); if (tray_icon_) tray_icon_->SetVisible(false);
return; // Don't quit the application now: wait for the fadeout finished signal return; // Don't quit the application now: wait for the fadeout finished signal
} }
} }

View File

@ -44,8 +44,7 @@ QtSystemTrayIcon::QtSystemTrayIcon(QObject *parent)
action_play_pause_(nullptr), action_play_pause_(nullptr),
action_stop_(nullptr), action_stop_(nullptr),
action_stop_after_this_track_(nullptr), action_stop_after_this_track_(nullptr),
action_mute_(nullptr) action_mute_(nullptr) {
{
QIcon theme_icon = IconLoader::Load("strawberry", 48); QIcon theme_icon = IconLoader::Load("strawberry", 48);
QIcon theme_icon_grey = IconLoader::Load("strawberry-grey", 48); QIcon theme_icon_grey = IconLoader::Load("strawberry-grey", 48);

View File

@ -23,6 +23,7 @@
#include <cmath> #include <cmath>
#include <QObject> #include <QObject>
#include <QSystemTrayIcon>
#include <QPixmap> #include <QPixmap>
#include <QPainter> #include <QPainter>
#include <QPoint> #include <QPoint>
@ -105,10 +106,11 @@ void SystemTrayIcon::SetStopped() {
UpdateIcon(); UpdateIcon();
} }
SystemTrayIcon* SystemTrayIcon::CreateSystemTrayIcon(QObject *parent) { SystemTrayIcon *SystemTrayIcon::CreateSystemTrayIcon(QObject *parent) {
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
return new MacSystemTrayIcon(parent); return new MacSystemTrayIcon(parent);
#else #else
return new QtSystemTrayIcon(parent); if (QSystemTrayIcon::isSystemTrayAvailable()) return new QtSystemTrayIcon(parent);
else return nullptr;
#endif #endif
} }

View File

@ -22,6 +22,7 @@
#include <QVariant> #include <QVariant>
#include <QSettings> #include <QSettings>
#include <QSystemTrayIcon>
#include <QCheckBox> #include <QCheckBox>
#include <QRadioButton> #include <QRadioButton>
#include <QSpinBox> #include <QSpinBox>
@ -46,6 +47,15 @@ BehaviourSettingsPage::BehaviourSettingsPage(SettingsDialog *dialog) : SettingsP
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
ui_->checkbox_showtrayicon->setEnabled(false); ui_->checkbox_showtrayicon->setEnabled(false);
ui_->groupbox_startup->setEnabled(false); ui_->groupbox_startup->setEnabled(false);
#else
if (QSystemTrayIcon::isSystemTrayAvailable()) {
ui_->checkbox_showtrayicon->setEnabled(true);
ui_->groupbox_startup->setEnabled(true);
}
else {
ui_->checkbox_showtrayicon->setEnabled(false);
ui_->groupbox_startup->setEnabled(false);
}
#endif #endif
} }
@ -59,9 +69,22 @@ void BehaviourSettingsPage::Load() {
QSettings s; QSettings s;
s.beginGroup(kSettingsGroup); s.beginGroup(kSettingsGroup);
ui_->checkbox_showtrayicon->setChecked(s.value("showtrayicon", true).toBool()); #ifdef Q_OS_MACOS
ui_->checkbox_scrolltrayicon->setChecked(s.value("scrolltrayicon", ui_->checkbox_showtrayicon->isChecked()).toBool()); ui_->checkbox_showtrayicon->setChecked(false);
ui_->checkbox_keeprunning->setChecked(s.value("keeprunning", false).toBool()); ui_->checkbox_scrolltrayicon->setChecked(false);
ui_->checkbox_keeprunning->setChecked(false);
#else
if (QSystemTrayIcon::isSystemTrayAvailable()) {
ui_->checkbox_showtrayicon->setChecked(s.value("showtrayicon", true).toBool());
ui_->checkbox_scrolltrayicon->setChecked(s.value("scrolltrayicon", ui_->checkbox_showtrayicon->isChecked()).toBool());
ui_->checkbox_keeprunning->setChecked(s.value("keeprunning", false).toBool());
}
else {
ui_->checkbox_showtrayicon->setChecked(false);
ui_->checkbox_scrolltrayicon->setChecked(false);
ui_->checkbox_keeprunning->setChecked(false);
}
#endif
MainWindow::StartupBehaviour behaviour = MainWindow::StartupBehaviour(s.value("startupbehaviour", MainWindow::Startup_Remember).toInt()); MainWindow::StartupBehaviour behaviour = MainWindow::StartupBehaviour(s.value("startupbehaviour", MainWindow::Startup_Remember).toInt());
switch (behaviour) { switch (behaviour) {

View File

@ -112,9 +112,7 @@ void OSD::ReshowCurrentSong() {
void OSD::AlbumArtLoaded(const Song &song, const QString &uri, const QImage &image) { void OSD::AlbumArtLoaded(const Song &song, const QString &uri, const QImage &image) {
// Don't change tray icon details if it's a preview // Don't change tray icon details if it's a preview
if (!preview_mode_) { if (!preview_mode_ && tray_icon_) tray_icon_->SetNowPlaying(song, uri);
tray_icon_->SetNowPlaying(song, uri);
}
last_song_ = song; last_song_ = song;
last_image_ = image; last_image_ = image;
@ -179,7 +177,7 @@ void OSD::Paused() {
} }
void OSD::Stopped() { void OSD::Stopped() {
tray_icon_->ClearNowPlaying(); if (tray_icon_) tray_icon_->ClearNowPlaying();
if (ignore_next_stopped_) { if (ignore_next_stopped_) {
ignore_next_stopped_ = false; ignore_next_stopped_ = false;
return; return;
@ -222,7 +220,7 @@ void OSD::ShowMessage(const QString &summary, const QString &message, const QStr
#ifndef Q_OS_MACOS #ifndef Q_OS_MACOS
case TrayPopup: case TrayPopup:
tray_icon_->ShowPopup(summary, message, timeout_msec_); if (tray_icon_) tray_icon_->ShowPopup(summary, message, timeout_msec_);
break; break;
#endif #endif