feat: set custom icon

feat: tray icon status point
This commit is contained in:
arm64v8a
2022-09-09 08:00:00 +08:00
parent b0157cee4a
commit 31079f20fd
9 changed files with 198 additions and 65 deletions

View File

@@ -127,6 +127,7 @@ set(PROJECT_SOURCES
sys/AutoRun.cpp sys/AutoRun.cpp
ui/ThemeManager.cpp ui/ThemeManager.cpp
ui/TrayIcon.cpp
ui/mainwindow_grpc.cpp ui/mainwindow_grpc.cpp
ui/mainwindow.cpp ui/mainwindow.cpp

View File

@@ -159,6 +159,26 @@
<source>Include Pre-release when checking update</source> <source>Include Pre-release when checking update</source>
<translation> Pre-release</translation> <translation> Pre-release</translation>
</message> </message>
<message>
<source>Set custom icon</source>
<translation></translation>
</message>
<message>
<source>Please select a PNG file.</source>
<translation> PNG </translation>
</message>
<message>
<source>Reset</source>
<translation></translation>
</message>
<message>
<source>Please select a valid square image.</source>
<translation></translation>
</message>
<message>
<source>Cancel</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>DialogEditGroup</name> <name>DialogEditGroup</name>

39
ui/TrayIcon.cpp Normal file
View File

@@ -0,0 +1,39 @@
#include "TrayIcon.hpp"
#include <QPainter>
QIcon TrayIcon::GetIcon(TrayIcon::TrayIconStatus status) {
auto icon = QIcon::fromTheme("nekoray");
auto pixmap = QPixmap("../nekoray.png");
if (!pixmap.isNull()) icon = QIcon(pixmap);
pixmap = QPixmap("./nekoray.png");
if (!pixmap.isNull()) icon = QIcon(pixmap);
if (status == TrayIconStatus::NONE) return icon;
pixmap = icon.pixmap(icon.availableSizes().first());
auto p = QPainter(&pixmap);
auto side = pixmap.width();
auto radius = side * 0.4;
auto d = side * 0.3;
auto margin = side * 0.1;
if (status == TrayIconStatus::RUNNING) {
p.setBrush(QBrush(Qt::darkGreen));
} else if (status == TrayIconStatus::SYSTEM_PROXY) {
p.setBrush(QBrush(Qt::blue));
} else if (status == TrayIconStatus::VPN) {
p.setBrush(QBrush(Qt::red));
}
p.drawRoundedRect(
QRect(side - d - margin,
side - d - margin,
d,
d),
radius,
radius);
p.end();
return pixmap;
}

16
ui/TrayIcon.hpp Normal file
View File

@@ -0,0 +1,16 @@
#pragma once
#include <QIcon>
namespace TrayIcon {
enum TrayIconStatus {
NONE,
RUNNING,
SYSTEM_PROXY,
VPN,
};
QIcon GetIcon(TrayIconStatus status);
}

View File

@@ -9,6 +9,7 @@
#include <QStyleFactory> #include <QStyleFactory>
#include <QFileDialog> #include <QFileDialog>
#include <QInputDialog> #include <QInputDialog>
#include <QMessageBox>
class ExtraCoreWidget : public QWidget { class ExtraCoreWidget : public QWidget {
public: public:
@@ -223,3 +224,26 @@ void DialogBasicSettings::accept() {
dialog_message(Dialog_DialogBasicSettings, "UpdateDataStore"); dialog_message(Dialog_DialogBasicSettings, "UpdateDataStore");
QDialog::accept(); QDialog::accept();
} }
void DialogBasicSettings::on_set_custom_icon_clicked() {
auto title = ui->set_custom_icon->text();
auto c = QMessageBox::question(this, title, tr("Please select a PNG file."),
tr("Select"), tr("Reset"), tr("Cancel"), 2, 2);
if (c == 0) {
auto fn = QFileDialog::getOpenFileName(this, QObject::tr("Select"), QDir::currentPath(),
"*.png", nullptr, QFileDialog::Option::ReadOnly);
if (!fn.isEmpty()) {
QImage img(fn);
if (img.isNull() || img.height() != img.width()) {
MessageBoxWarning(title, tr("Please select a valid square image."));
return;
}
QFile::copy(fn, "./nekoray.png");
}
} else if (c == 1) {
QFile::remove("./nekoray.png");
} else {
return;
}
dialog_message(Dialog_DialogBasicSettings, "UpdateIcon");
}

View File

@@ -28,6 +28,11 @@ private:
QString custom_inbound; QString custom_inbound;
bool needRestart = false; bool needRestart = false;
} CACHE; } CACHE;
private slots:
void on_set_custom_icon_clicked();
}; };
#endif // DIALOG_BASIC_SETTINGS_H #endif // DIALOG_BASIC_SETTINGS_H

View File

@@ -264,6 +264,49 @@
<string>Style</string> <string>Style</string>
</attribute> </attribute>
<layout class="QGridLayout" name="gridLayout_5"> <layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_8">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Theme</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="theme">
<item>
<property name="text">
<string>System</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">flatgray</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">lightblue</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">blacksoft</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QGroupBox" name="groupBox2"> <widget class="QGroupBox" name="groupBox2">
<layout class="QHBoxLayout" name="horizontalLayout_7"> <layout class="QHBoxLayout" name="horizontalLayout_7">
@@ -302,6 +345,33 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="3" column="0">
<widget class="QGroupBox" name="horizontalGroupBox2">
<layout class="QHBoxLayout" name="horizontalLayout_20">
<item>
<widget class="QCheckBox" name="start_minimal">
<property name="text">
<string>Minimize to tray icon on startup</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="set_custom_icon">
<property name="text">
<string>Set custom icon</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0"> <item row="2" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_12"> <layout class="QHBoxLayout" name="horizontalLayout_12">
<item> <item>
@@ -358,62 +428,6 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_8">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Theme</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="theme">
<item>
<property name="text">
<string>System</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">flatgray</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">lightblue</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">blacksoft</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="0">
<widget class="QGroupBox" name="horizontalGroupBox2">
<layout class="QHBoxLayout" name="horizontalLayout_20">
<item>
<widget class="QCheckBox" name="start_minimal">
<property name="text">
<string>Minimize to tray icon on startup</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="tab_3"> <widget class="QWidget" name="tab_3">

View File

@@ -9,6 +9,7 @@
#include "sys/AutoRun.hpp" #include "sys/AutoRun.hpp"
#include "ui/ThemeManager.hpp" #include "ui/ThemeManager.hpp"
#include "ui/TrayIcon.hpp"
#include "ui/edit/dialog_edit_profile.h" #include "ui/edit/dialog_edit_profile.h"
#include "ui/dialog_basic_settings.h" #include "ui/dialog_basic_settings.h"
#include "ui/dialog_manage_groups.h" #include "ui/dialog_manage_groups.h"
@@ -228,15 +229,7 @@ MainWindow::MainWindow(QWidget *parent)
this->refresh_groups(); this->refresh_groups();
// Setup Tray // Setup Tray
auto icon = QIcon::fromTheme("nekoray");
auto pixmap = QPixmap("../nekoray.png");
if (!pixmap.isNull()) icon = QIcon(pixmap);
pixmap = QPixmap("./nekoray.png");
if (!pixmap.isNull()) icon = QIcon(pixmap);
setWindowIcon(icon);
tray = new QSystemTrayIcon(this);//初始化托盘对象tray tray = new QSystemTrayIcon(this);//初始化托盘对象tray
tray->setIcon(icon);//设定托盘图标引号内是自定义的png图片路径
tray->setContextMenu(ui->menu_program);//创建托盘菜单 tray->setContextMenu(ui->menu_program);//创建托盘菜单
tray->show();//让托盘图标显示在系统托盘上 tray->show();//让托盘图标显示在系统托盘上
connect(tray, &QSystemTrayIcon::activated, this, connect(tray, &QSystemTrayIcon::activated, this,
@@ -483,6 +476,10 @@ void MainWindow::show_group(int gid) {
// callback // callback
void MainWindow::dialog_message_impl(const QString &sender, const QString &info) { void MainWindow::dialog_message_impl(const QString &sender, const QString &info) {
if (info.contains("UpdateIcon")) {
icon_status = -1;
refresh_status();
}
if (info.contains("UpdateDataStore")) { if (info.contains("UpdateDataStore")) {
auto changed = NekoRay::dataStore->Save(); auto changed = NekoRay::dataStore->Save();
if (info.contains("RouteChanged")) changed = true; if (info.contains("RouteChanged")) changed = true;
@@ -679,8 +676,24 @@ void MainWindow::refresh_status(const QString &traffic_update) {
return tt.join(isTray ? "\n" : " "); return tt.join(isTray ? "\n" : " ");
}; };
auto icon_status_new = TrayIcon::NONE;
if (title_spmode == NekoRay::SystemProxyMode::SYSTEM_PROXY) {
icon_status_new = TrayIcon::SYSTEM_PROXY;
} else if (title_spmode == NekoRay::SystemProxyMode::VPN) {
icon_status_new = TrayIcon::VPN;
} else if (!running.isNull()) {
icon_status_new = TrayIcon::RUNNING;
}
setWindowTitle(make_title(false)); setWindowTitle(make_title(false));
if (tray != nullptr) tray->setToolTip(make_title(true)); if (icon_status_new != icon_status) setWindowIcon(TrayIcon::GetIcon(TrayIcon::NONE));
if (tray != nullptr) {
tray->setToolTip(make_title(true));
if (icon_status_new != icon_status) tray->setIcon(TrayIcon::GetIcon(icon_status_new));
}
icon_status = icon_status_new;
} }
// table显示 // table显示

View File

@@ -131,6 +131,7 @@ private:
QString title_base; QString title_base;
QString title_error; QString title_error;
int title_spmode = NekoRay::SystemProxyMode::DISABLE; int title_spmode = NekoRay::SystemProxyMode::DISABLE;
int icon_status = -1;
QSharedPointer<NekoRay::ProxyEntity> running; QSharedPointer<NekoRay::ProxyEntity> running;
QString traffic_update_cache; QString traffic_update_cache;
QTime last_test_time; QTime last_test_time;