From d1b222486bfebb08a81530966eeab11e31386c74 Mon Sep 17 00:00:00 2001 From: Jokul Date: Sat, 8 Aug 2026 20:08:59 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=8F=90=E5=8F=96=20interfaceIcon/?= =?UTF-8?q?interfaceDescription=20=E5=88=B0=20NetCommon=20=E5=85=B1?= =?UTF-8?q?=E4=BA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 SettingsWindow 的接口图标和描述函数迁移到 NetCommon.qml, 消除与 NetworkPopup 的重复定义;新增 formatSpeedValue/formatSpeedUnit 为弹窗速度数值与单位拆分显示做准备 --- package/components/NetCommon.qml | 45 +++++++++++++++++++++++++++ package/components/SettingsWindow.qml | 40 +++++------------------- 2 files changed, 52 insertions(+), 33 deletions(-) diff --git a/package/components/NetCommon.qml b/package/components/NetCommon.qml index c8d9ed3..e9d5edf 100644 --- a/package/components/NetCommon.qml +++ b/package/components/NetCommon.qml @@ -79,4 +79,49 @@ QtObject { return (bytes / (1024 * 1024 * 1024)).toFixed(2) + " GB" } } + + // 根据接口名返回类型图标(Unicode 符号),用于网络接口列表和弹窗接口信息区 + // 设计原因:项目未引入图标库,用 Text 渲染 Unicode 符号(与 ↓↑ 一致); + // 所选符号均为 DejaVu/Noto 等常见字体覆盖的单色字形,避免彩色 emoji 破坏浅色主题观感 + function interfaceIcon(name) { + if (name === "lo") return "↻" // 本地回环:循环箭头 + if (name === "Meta") return "▢" // 虚拟接口:空心方块 + if (/^enp|^eth/.test(name)) return "⇄" // 有线网络:双向链路 + if (/^wlp|^wlan/.test(name)) return "∿" // 无线网络:信号波形 + if (/^docker|^veth/.test(name)) return "▣" // 容器网络:盒中盒 + if (/^br/.test(name)) return "⋈" // 桥接:连接 + if (/^tun|^tap/.test(name)) return "⚿" // VPN:钥匙 + if (/^virbr/.test(name)) return "⋈" // 虚拟桥接:同桥接 + return "◉" // 其他:通用网络节点 + } + + // 根据接口名返回类型描述,用于设置窗口网络接口列表和弹窗 tooltip + // 设计原因:用户面对多个网口时难以仅凭 enp3s0/wlp3s0 等命名判断用途, + // 加一行类型说明(有线/无线/VPN 等)降低认知负担 + function interfaceDescription(name) { + if (name === "lo") return qsTr("Loopback") + if (name === "Meta") return qsTr("Virtual Interface") + if (/^enp|^eth/.test(name)) return qsTr("Wired Network") + if (/^wlp|^wlan/.test(name)) return qsTr("Wireless Network") + if (/^docker|^veth/.test(name)) return qsTr("Container Network") + if (/^br/.test(name)) return qsTr("Bridge") + if (/^tun|^tap/.test(name)) return qsTr("VPN") + if (/^virbr/.test(name)) return qsTr("Virtual Bridge") + return qsTr("Other") + } + + // 拆分速度字符串为数值部分:formatSpeed 返回 "4.11 KB/s",本函数返回 "4.11" + // 设计原因:弹窗速度区需将数值(大号粗体)与单位(小号)拆分显示以增强层次感 + function formatSpeedValue(bytesPerSec) { + var str = formatSpeed(bytesPerSec) + var idx = str.indexOf(' ') + return idx < 0 ? str : str.substring(0, idx) + } + + // 拆分速度字符串为单位部分:formatSpeed 返回 "4.11 KB/s",本函数返回 "KB/s" + function formatSpeedUnit(bytesPerSec) { + var str = formatSpeed(bytesPerSec) + var idx = str.indexOf(' ') + return idx < 0 ? "" : str.substring(idx + 1) + } } diff --git a/package/components/SettingsWindow.qml b/package/components/SettingsWindow.qml index cc0eece..fb561af 100644 --- a/package/components/SettingsWindow.qml +++ b/package/components/SettingsWindow.qml @@ -13,10 +13,15 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 import QtQuick.Window 2.15 +import "." Window { id: root + // 公共函数:interfaceIcon/interfaceDescription 已从本文件迁移至 NetCommon.qml, + // 与 NetworkPopup 共享同一份实现,消除跨组件重复定义 + NetCommon { id: common } + // 对外依赖:C++ 后端对象,用于获取/设置接口、字体颜色等 property var applet: null @@ -66,37 +71,6 @@ Window { // 窗口透明:让圆角外的区域不显示,由内部 Rectangle 提供可见背景 color: "transparent" - // 根据接口名返回类型描述,用于设置窗口网络接口列表 - // 设计原因:用户面对多个网口时难以仅凭 enp3s0/wlp3s0 等命名判断用途, - // 加一行类型说明(有线/无线/VPN 等)降低认知负担 - function interfaceDescription(name) { - if (name === "lo") return qsTr("Loopback") - if (name === "Meta") return qsTr("Virtual Interface") - if (/^enp|^eth/.test(name)) return qsTr("Wired Network") - if (/^wlp|^wlan/.test(name)) return qsTr("Wireless Network") - if (/^docker|^veth/.test(name)) return qsTr("Container Network") - if (/^br/.test(name)) return qsTr("Bridge") - if (/^tun|^tap/.test(name)) return qsTr("VPN") - if (/^virbr/.test(name)) return qsTr("Virtual Bridge") - return qsTr("Other") - } - - // 根据接口名返回类型图标(Unicode 符号),用于网络接口列表每行左侧 - // 设计原因:项目未引入图标库,用 Text 渲染 Unicode 符号(与 networkview.qml 的 ↓↑ 一致); - // 所选符号均为 DejaVu/Noto 等常见字体覆盖的单色字形,避免彩色 emoji 破坏浅色主题观感, - // 匹配规则与 interfaceDescription 保持一致 - function interfaceIcon(name) { - if (name === "lo") return "↻" // 本地回环:循环箭头 - if (name === "Meta") return "▢" // 虚拟接口:空心方块 - if (/^enp|^eth/.test(name)) return "⇄" // 有线网络:双向链路 - if (/^wlp|^wlan/.test(name)) return "∿" // 无线网络:信号波形 - if (/^docker|^veth/.test(name)) return "▣" // 容器网络:盒中盒 - if (/^br/.test(name)) return "⋈" // 桥接:连接(蝴蝶结形) - if (/^tun|^tap/.test(name)) return "⚿" // VPN:钥匙 - if (/^virbr/.test(name)) return "⋈" // 虚拟桥接:同桥接 - return "◉" // 其他:通用网络节点 - } - // 显示时居中到当前屏幕(任务栏所在屏幕) onVisibleChanged: { if (visible) { @@ -291,7 +265,7 @@ Window { Layout.alignment: Qt.AlignVCenter Layout.preferredWidth: 20 horizontalAlignment: Text.AlignHCenter - text: interfaceIcon(modelData) + text: common.interfaceIcon(modelData) font.pixelSize: 14 color: ifaceRow.isActive ? ifaceRow.activeColor : root.iconGray } @@ -333,7 +307,7 @@ Window { // 接口类型描述:右对齐显示,与接口名分居两侧 Text { Layout.alignment: Qt.AlignVCenter - text: interfaceDescription(modelData) + text: common.interfaceDescription(modelData) font.pixelSize: 12 color: root.textTertiary }