feat: About 窗口版本号改为项目统一版本,仓库地址增加一键复制按钮

This commit is contained in:
2026-07-19 19:13:13 +08:00
parent 6b2721c821
commit fcb43fe34f
4 changed files with 110 additions and 2 deletions
+95 -1
View File
@@ -17,6 +17,14 @@ Window {
// 默认值与 networkview.qml 中 root.accentRed 一致,确保独立可用 // 默认值与 networkview.qml 中 root.accentRed 一致,确保独立可用
property color accentColor: Qt.rgba(220 / 255, 38 / 255, 38 / 255, 1) property color accentColor: Qt.rgba(220 / 255, 38 / 255, 38 / 255, 1)
// 插件版本号,由父组件从 C++ 后端 applet.version 传入
// 默认值保证组件独立可用(如 qmlscene 预览时未传入)
property string version: "1.0"
// 复制成功状态标记:true 时复制图标变绿并显示"已复制"提示,
// 2 秒后由 copyResetTimer 复位
property bool copied: false
width: 320 width: 320
height: 260 height: 260
visible: false visible: false
@@ -163,7 +171,7 @@ Window {
} }
Text { Text {
text: "1.0" text: version
font.pixelSize: 12 font.pixelSize: 12
color: "#333333" color: "#333333"
Layout.fillWidth: true Layout.fillWidth: true
@@ -233,6 +241,76 @@ Window {
Layout.fillWidth: true Layout.fillWidth: true
wrapMode: Text.WrapAnywhere wrapMode: Text.WrapAnywhere
} }
// 复制按钮:点击复制仓库地址到剪贴板,成功后图标变绿并显示"已复制"提示 2 秒
Item {
Layout.preferredWidth: 24
Layout.preferredHeight: 24
Layout.alignment: Qt.AlignTop
// "已复制"提示:白底绿字小标签,显示在按钮左侧,
// 覆盖于 URL 文字上方,避免与值文本混排
Rectangle {
anchors.right: parent.left
anchors.rightMargin: 4
anchors.verticalCenter: parent.verticalCenter
visible: copied
width: copiedHintText.implicitWidth + 10
height: 18
radius: 4
color: "#FFFFFF"
border.width: 1
border.color: "#22A34A"
Text {
id: copiedHintText
anchors.centerIn: parent
text: qsTr("已复制")
font.pixelSize: 10
color: "#22A34A"
}
}
MouseArea {
id: copyRepoMouse
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
clipboardHelper.text = "git.jokul.space/Jokul/JNetApplet"
clipboardHelper.selectAll()
clipboardHelper.copy()
copied = true
copyResetTimer.restart()
}
}
// 复制图标:两个重叠的小圆角矩形
// 前层矩形白底压住后层边框重叠区,形成"堆叠纸张"的视觉效果
// 后层矩形(向右下偏移 2px
Rectangle {
x: 8
y: 8
width: 10
height: 10
radius: 2
color: "#FFFFFF"
border.width: 1
border.color: copyRepoMouse.containsMouse ? "#333333" : "#999999"
}
// 前层矩形(左上),复制成功时边框短暂变绿
Rectangle {
x: 6
y: 6
width: 10
height: 10
radius: 2
color: "#FFFFFF"
border.width: 1
border.color: copied ? "#22A34A" : (copyRepoMouse.containsMouse ? "#333333" : "#999999")
}
}
} }
} }
@@ -247,4 +325,20 @@ Window {
} }
} }
} }
// 隐藏的 TextEdit 用于复制仓库地址到剪贴板
// QML 没有直接剪贴板 API,用 TextEdit.selectAll()+copy() 实现
//(与 networkview.qml 中 clipboardHelper 同模式)
TextEdit {
id: clipboardHelper
visible: false
text: ""
}
// 复制状态还原定时器:2 秒后将 copied 复位,图标与"已复制"提示恢复原状
Timer {
id: copyResetTimer
interval: 2000
onTriggered: root.copied = false
}
} }
+2 -1
View File
@@ -675,10 +675,11 @@ AppletItem {
} }
// 关于窗口:抽取为独立组件 package/components/AboutWindow.qml // 关于窗口:抽取为独立组件 package/components/AboutWindow.qml
// 依赖通过属性传入:accentColor = root.accentRed // 依赖通过属性传入:accentColor = root.accentRedversion 取自 C++ 后端 applet.version
AboutWindow { AboutWindow {
id: aboutWindow id: aboutWindow
accentColor: root.accentRed accentColor: root.accentRed
version: root.applet ? root.applet.version : "1.0"
} }
// 设置窗口:独立顶层窗口,在桌面中间弹出 // 设置窗口:独立顶层窗口,在桌面中间弹出
+9
View File
@@ -116,6 +116,15 @@ QString NetworkMonitorApplet::ipv6Address() const
return m_ipv6Address; return m_ipv6Address;
} }
// 返回插件版本号,从 dde-shell 插件元数据(metadata.json)读取
// 版本唯一源为 CMakeLists.txt 的 project(VERSION),经 configure_file 写入 metadata.json
// dde-shell 加载时存入 DPluginMetaData,此处通过继承自 DApplet 的 pluginMetaData() 读取
QString NetworkMonitorApplet::version() const
{
// metadata.json 结构:{ "Plugin": { "Version": "x.y.z", ... } }
return pluginMetaData().value("Plugin").toMap().value("Version").toString();
}
void NetworkMonitorApplet::refresh() void NetworkMonitorApplet::refresh()
{ {
readNetworkStats(); readNetworkStats();
+4
View File
@@ -42,6 +42,8 @@ class NetworkMonitorApplet : public DApplet
Q_PROPERTY(QString ipAddress READ ipAddress NOTIFY ipAddressChanged) Q_PROPERTY(QString ipAddress READ ipAddress NOTIFY ipAddressChanged)
// 活动接口的 IPv6 全球地址(已过滤 link-local 和 loopback),供 QML 显示 // 活动接口的 IPv6 全球地址(已过滤 link-local 和 loopback),供 QML 显示
Q_PROPERTY(QString ipv6Address READ ipv6Address NOTIFY ipv6AddressChanged) Q_PROPERTY(QString ipv6Address READ ipv6Address NOTIFY ipv6AddressChanged)
// 插件版本号,从 dde-shell 元数据读取,版本唯一源为 CMakeLists.txt project(VERSION)
Q_PROPERTY(QString version READ version CONSTANT)
public: public:
explicit NetworkMonitorApplet(QObject *parent = nullptr); explicit NetworkMonitorApplet(QObject *parent = nullptr);
@@ -60,6 +62,8 @@ public:
QString activeInterface() const; QString activeInterface() const;
QString ipAddress() const; QString ipAddress() const;
QString ipv6Address() const; QString ipv6Address() const;
// 返回插件版本号,从 dde-shell 插件元数据(metadata.json)读取
QString version() const;
Q_INVOKABLE void refresh(); Q_INVOKABLE void refresh();
Q_INVOKABLE void setActiveInterface(const QString &interface); Q_INVOKABLE void setActiveInterface(const QString &interface);