2026-05-30 10:53:44 +03:00
|
|
|
#include "linuxtrayiconbackend.h"
|
|
|
|
|
|
|
|
|
|
#include "ui/utils/trayIconCommon.h"
|
|
|
|
|
|
|
|
|
|
#include <QObject>
|
|
|
|
|
|
|
|
|
|
namespace
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
constexpr int kLinuxTrayIconSizes[] = { 16, 22, 24, 32, 48, 64, 128 };
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
LinuxTrayIconBackend::LinuxTrayIconBackend(QObject *parent) : m_trayIcon(parent)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void LinuxTrayIconBackend::setMenu(QMenu *menu)
|
|
|
|
|
{
|
|
|
|
|
m_trayIcon.setContextMenu(menu);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void LinuxTrayIconBackend::setToolTip(const QString &tooltip)
|
|
|
|
|
{
|
|
|
|
|
m_trayIcon.setToolTip(tooltip);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void LinuxTrayIconBackend::show()
|
|
|
|
|
{
|
|
|
|
|
m_trayIcon.show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void LinuxTrayIconBackend::applyVisual(const TrayIconVisual &visual)
|
|
|
|
|
{
|
2026-06-05 12:12:12 +03:00
|
|
|
if (m_hasLastVisual && visual.connectionState == m_lastState && visual.darkTheme == m_lastDarkTheme) {
|
|
|
|
|
return;
|
2026-05-30 12:55:27 +03:00
|
|
|
}
|
2026-06-05 12:12:12 +03:00
|
|
|
|
|
|
|
|
m_lastState = visual.connectionState;
|
|
|
|
|
m_lastDarkTheme = visual.darkTheme;
|
|
|
|
|
m_hasLastVisual = true;
|
|
|
|
|
|
|
|
|
|
const QIcon icon = buildTrayIcon(visual.connectionState, visual.darkTheme);
|
2026-05-30 12:55:27 +03:00
|
|
|
m_trayIcon.setIcon(icon);
|
2026-05-30 10:53:44 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void LinuxTrayIconBackend::showMessage(const QString &title, const QString &message, const TrayIconVisual &visual,
|
|
|
|
|
int timerMsec)
|
|
|
|
|
{
|
|
|
|
|
m_trayIcon.showMessage(title, message,
|
2026-06-05 09:00:14 +03:00
|
|
|
buildTrayIcon(Vpn::ConnectionState::Connected, visual.darkTheme),
|
2026-05-30 10:53:44 +03:00
|
|
|
timerMsec);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void LinuxTrayIconBackend::rebuildMenu()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void LinuxTrayIconBackend::setActivatedHandler(std::function<void(QSystemTrayIcon::ActivationReason)> handler)
|
|
|
|
|
{
|
|
|
|
|
if (!handler) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QObject::connect(&m_trayIcon, &QSystemTrayIcon::activated, m_trayIcon.parent(),
|
|
|
|
|
[handler](QSystemTrayIcon::ActivationReason reason) { handler(reason); });
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-05 09:00:14 +03:00
|
|
|
QIcon LinuxTrayIconBackend::buildTrayIcon(Vpn::ConnectionState state, bool darkTheme) const
|
2026-05-30 10:53:44 +03:00
|
|
|
{
|
|
|
|
|
QIcon icon;
|
|
|
|
|
for (int size : kLinuxTrayIconSizes) {
|
2026-06-05 09:00:14 +03:00
|
|
|
icon.addPixmap(TrayIconCommon::buildPixmap(size, state, darkTheme));
|
2026-05-30 10:53:44 +03:00
|
|
|
}
|
|
|
|
|
return icon;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<TrayIconBackend> createTrayIconBackend(QObject *parent)
|
|
|
|
|
{
|
|
|
|
|
return std::make_unique<LinuxTrayIconBackend>(parent);
|
|
|
|
|
}
|