swift
systemtraywindow.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2014 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "gui/systemtraywindow.h"
5 
6 #include <QAction>
7 #include <QApplication>
8 #include <QCloseEvent>
9 #include <QEvent>
10 #include <QMenu>
11 #include <QMessageBox>
12 #include <QObject>
13 #include <QWidget>
14 #include <QtGlobal>
15 
16 namespace swift::gui
17 {
18 
19  CSystemTrayWindow::CSystemTrayWindow(const QIcon &icon, QWidget *parent) : QMainWindow(parent)
20  {
21  createActions();
22  createTrayIcon(icon);
23  }
24 
25  void CSystemTrayWindow::setSystemTrayMode(SystemTrayMode mode) { m_systemTrayMode = mode; }
26 
27  void CSystemTrayWindow::setSystemTrayIcon(const QIcon &icon)
28  {
29  Q_ASSERT(m_systemTrayIcon);
30  m_systemTrayIcon->setIcon(icon);
31  }
32 
33  void CSystemTrayWindow::setSystemTrayToolTip(const QString &tooltip)
34  {
35  Q_ASSERT(m_systemTrayIcon);
36  m_systemTrayIcon->setToolTip(tooltip);
37  }
38 
39  void CSystemTrayWindow::ps_activateWindow(QSystemTrayIcon::ActivationReason reason)
40  {
41  switch (reason)
42  {
43  case QSystemTrayIcon::Trigger:
44  case QSystemTrayIcon::DoubleClick:
45  showNormal();
46  activateWindow();
47  break;
48  case QSystemTrayIcon::MiddleClick: break;
49  default: break;
50  }
51  }
52 
53  void CSystemTrayWindow::ps_showMessage(const QString &title, const QString &message,
54  QSystemTrayIcon::MessageIcon icon, int millisecondsTimeoutHint)
55  {
56  Q_ASSERT(m_systemTrayIcon);
57  m_systemTrayIcon->showMessage(title, message, icon, millisecondsTimeoutHint);
58  }
59 
60  void CSystemTrayWindow::closeEvent(QCloseEvent *event)
61  {
62  int result = QMessageBox::Close;
63 
64  if (m_systemTrayMode.testFlag(AskOnClose))
65  {
66  QMessageBox msgBox;
67  msgBox.setText("Are you sure you want to close? This will quit swiftcore!");
68  msgBox.setStandardButtons(QMessageBox::Close | QMessageBox::Cancel);
69  msgBox.setDefaultButton(QMessageBox::Close);
70  msgBox.setIcon(QMessageBox::Warning);
71  }
72 
73  result = QMessageBox::Close; // msgBox.exec();
74  switch (result)
75  {
76  case QMessageBox::Close: event->accept(); break;
77  case QMessageBox::Cancel: event->ignore(); break;
78  default: closeEvent(event); break;
79  }
80  }
81 
82  void CSystemTrayWindow::changeEvent(QEvent *event)
83  {
84  QMainWindow::changeEvent(event);
85  if (event->type() == QEvent::WindowStateChange)
86  {
87  if (isMinimized()) { hide(); }
88  }
89  }
90 
91  void CSystemTrayWindow::createActions()
92  {
93  m_actionRestore = new QAction(tr("&Restore"), this);
94  connect(m_actionRestore, &QAction::triggered, this, &QWidget::showNormal);
95 
96  m_actionQuit = new QAction(tr("&Quit"), this);
97  connect(m_actionQuit, &QAction::triggered, qApp, &QApplication::quit);
98  }
99 
100  void CSystemTrayWindow::createTrayIcon(const QIcon &icon)
101  {
102  m_trayIconMenu = new QMenu(this);
103  m_trayIconMenu->addAction(m_actionRestore);
104  m_trayIconMenu->addSeparator();
105  m_trayIconMenu->addAction(m_actionQuit);
106 
107  m_systemTrayIcon = new QSystemTrayIcon(this);
108  m_systemTrayIcon->setContextMenu(m_trayIconMenu);
109  m_systemTrayIcon->setIcon(icon);
110  m_systemTrayIcon->show();
111 
112  connect(m_systemTrayIcon, &QSystemTrayIcon::activated, this, &CSystemTrayWindow::ps_activateWindow);
113  }
114 
115 } // namespace swift::gui
void ps_showMessage(const QString &title, const QString &message, QSystemTrayIcon::MessageIcon icon=QSystemTrayIcon::Information, int millisecondsTimeoutHint=10000)
Show message in the system tray.
void setSystemTrayMode(SystemTrayMode mode)
System tray mode.
virtual void closeEvent(QCloseEvent *event)
void setSystemTrayToolTip(const QString &tooltip)
Set tool tip.
virtual void changeEvent(QEvent *event)
void ps_activateWindow(QSystemTrayIcon::ActivationReason reason)
Activate window from system tray.
CSystemTrayWindow(const QIcon &icon, QWidget *parent=nullptr)
Constructor.
void setSystemTrayIcon(const QIcon &icon)
Set icon.
GUI related classes.