mirror of
https://github.com/fergalmoran/flameshot.git
synced 2026-01-09 12:48:01 +00:00
* Cppcheck and clazy warning fixes * Clang-format * Revert QRect call by value * Revert QPoint call by value * Revert complained renamings --------- Co-authored-by: Haris Gušić <harisgusic.dev@gmail.com>
194 lines
5.6 KiB
C++
194 lines
5.6 KiB
C++
#include "trayicon.h"
|
|
|
|
#include "src/core/flameshot.h"
|
|
#include "src/core/flameshotdaemon.h"
|
|
#include "src/utils/globalvalues.h"
|
|
|
|
#include "src/utils/confighandler.h"
|
|
#include <QApplication>
|
|
#include <QMenu>
|
|
#include <QTimer>
|
|
#include <QUrl>
|
|
#include <QVersionNumber>
|
|
|
|
#if defined(Q_OS_MACOS)
|
|
#include <QOperatingSystemVersion>
|
|
#endif
|
|
|
|
TrayIcon::TrayIcon(QObject* parent)
|
|
: QSystemTrayIcon(parent)
|
|
{
|
|
initMenu();
|
|
|
|
setToolTip(QStringLiteral("Flameshot"));
|
|
#if defined(Q_OS_MACOS)
|
|
// Because of the following issues on MacOS "Catalina":
|
|
// https://bugreports.qt.io/browse/QTBUG-86393
|
|
// https://developer.apple.com/forums/thread/126072
|
|
auto currentMacOsVersion = QOperatingSystemVersion::current();
|
|
if (currentMacOsVersion >= currentMacOsVersion.MacOSBigSur) {
|
|
setContextMenu(m_menu);
|
|
}
|
|
#else
|
|
setContextMenu(m_menu);
|
|
#endif
|
|
QIcon icon =
|
|
QIcon::fromTheme("flameshot-tray", QIcon(GlobalValues::iconPathPNG()));
|
|
setIcon(icon);
|
|
|
|
#if defined(Q_OS_MACOS)
|
|
if (currentMacOsVersion < currentMacOsVersion.MacOSBigSur) {
|
|
// Because of the following issues on MacOS "Catalina":
|
|
// https://bugreports.qt.io/browse/QTBUG-86393
|
|
// https://developer.apple.com/forums/thread/126072
|
|
auto trayIconActivated = [this](QSystemTrayIcon::ActivationReason r) {
|
|
if (m_menu->isVisible()) {
|
|
m_menu->hide();
|
|
} else {
|
|
m_menu->popup(QCursor::pos());
|
|
}
|
|
};
|
|
connect(this, &QSystemTrayIcon::activated, this, trayIconActivated);
|
|
}
|
|
#else
|
|
connect(this, &TrayIcon::activated, this, [this](ActivationReason r) {
|
|
if (r == Trigger) {
|
|
startGuiCapture();
|
|
}
|
|
});
|
|
#endif
|
|
|
|
#ifdef Q_OS_WIN
|
|
// Ensure proper removal of tray icon when program quits on Windows.
|
|
connect(qApp, &QCoreApplication::aboutToQuit, this, &TrayIcon::hide);
|
|
#endif
|
|
|
|
show(); // TODO needed?
|
|
|
|
if (ConfigHandler().showStartupLaunchMessage()) {
|
|
showMessage(
|
|
"Flameshot",
|
|
QObject::tr(
|
|
"Hello, I'm here! Click icon in the tray to take a screenshot or "
|
|
"click with a right button to see more options."),
|
|
icon,
|
|
3000);
|
|
}
|
|
|
|
connect(ConfigHandler::getInstance(),
|
|
&ConfigHandler::fileChanged,
|
|
this,
|
|
[this]() {});
|
|
}
|
|
|
|
TrayIcon::~TrayIcon()
|
|
{
|
|
delete m_menu;
|
|
}
|
|
|
|
#if !defined(DISABLE_UPDATE_CHECKER)
|
|
QAction* TrayIcon::appUpdates()
|
|
{
|
|
return m_appUpdates;
|
|
}
|
|
#endif
|
|
|
|
void TrayIcon::initMenu()
|
|
{
|
|
m_menu = new QMenu();
|
|
|
|
auto* captureAction = new QAction(tr("&Take Screenshot"), this);
|
|
connect(captureAction, &QAction::triggered, this, [this]() {
|
|
#if defined(Q_OS_MACOS)
|
|
auto currentMacOsVersion = QOperatingSystemVersion::current();
|
|
if (currentMacOsVersion >= currentMacOsVersion.MacOSBigSur) {
|
|
startGuiCapture();
|
|
} else {
|
|
// It seems it is not relevant for MacOS BigSur (Wait 400 ms to hide
|
|
// the QMenu)
|
|
QTimer::singleShot(400, this, [this]() { startGuiCapture(); });
|
|
}
|
|
#else
|
|
// Wait 400 ms to hide the QMenu
|
|
QTimer::singleShot(400, this, [this]() {
|
|
startGuiCapture();
|
|
});
|
|
#endif
|
|
});
|
|
auto* launcherAction = new QAction(tr("&Open Launcher"), this);
|
|
connect(launcherAction,
|
|
&QAction::triggered,
|
|
Flameshot::instance(),
|
|
&Flameshot::launcher);
|
|
auto* configAction = new QAction(tr("&Configuration"), this);
|
|
connect(configAction,
|
|
&QAction::triggered,
|
|
Flameshot::instance(),
|
|
&Flameshot::config);
|
|
auto* infoAction = new QAction(tr("&About"), this);
|
|
connect(
|
|
infoAction, &QAction::triggered, Flameshot::instance(), &Flameshot::info);
|
|
|
|
#if !defined(DISABLE_UPDATE_CHECKER)
|
|
m_appUpdates = new QAction(tr("Check for updates"), this);
|
|
connect(m_appUpdates,
|
|
&QAction::triggered,
|
|
FlameshotDaemon::instance(),
|
|
&FlameshotDaemon::checkForUpdates);
|
|
|
|
connect(FlameshotDaemon::instance(),
|
|
&FlameshotDaemon::newVersionAvailable,
|
|
this,
|
|
[this](const QVersionNumber& version) {
|
|
QString newVersion =
|
|
tr("New version %1 is available").arg(version.toString());
|
|
m_appUpdates->setText(newVersion);
|
|
});
|
|
#endif
|
|
|
|
QAction* quitAction = new QAction(tr("&Quit"), this);
|
|
connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit);
|
|
|
|
// recent screenshots
|
|
QAction* recentAction = new QAction(tr("&Latest Uploads"), this);
|
|
connect(recentAction,
|
|
&QAction::triggered,
|
|
Flameshot::instance(),
|
|
&Flameshot::history);
|
|
|
|
m_menu->addAction(captureAction);
|
|
m_menu->addAction(launcherAction);
|
|
m_menu->addSeparator();
|
|
m_menu->addAction(recentAction);
|
|
m_menu->addSeparator();
|
|
m_menu->addAction(configAction);
|
|
m_menu->addSeparator();
|
|
#if !defined(DISABLE_UPDATE_CHECKER)
|
|
m_menu->addAction(m_appUpdates);
|
|
#endif
|
|
m_menu->addAction(infoAction);
|
|
m_menu->addSeparator();
|
|
m_menu->addAction(quitAction);
|
|
}
|
|
|
|
#if !defined(DISABLE_UPDATE_CHECKER)
|
|
void TrayIcon::enableCheckUpdatesAction(bool enable)
|
|
{
|
|
if (m_appUpdates != nullptr) {
|
|
m_appUpdates->setVisible(enable);
|
|
m_appUpdates->setEnabled(enable);
|
|
}
|
|
if (enable) {
|
|
FlameshotDaemon::instance()->getLatestAvailableVersion();
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void TrayIcon::startGuiCapture()
|
|
{
|
|
auto* widget = Flameshot::instance()->gui();
|
|
#if !defined(DISABLE_UPDATE_CHECKER)
|
|
FlameshotDaemon::instance()->showUpdateNotificationIfAvailable(widget);
|
|
#endif
|
|
}
|