feat: About 窗口版本号改为项目统一版本,仓库地址增加一键复制按钮
This commit is contained in:
@@ -17,6 +17,14 @@ Window {
|
||||
// 默认值与 networkview.qml 中 root.accentRed 一致,确保独立可用
|
||||
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
|
||||
height: 260
|
||||
visible: false
|
||||
@@ -163,7 +171,7 @@ Window {
|
||||
}
|
||||
|
||||
Text {
|
||||
text: "1.0"
|
||||
text: version
|
||||
font.pixelSize: 12
|
||||
color: "#333333"
|
||||
Layout.fillWidth: true
|
||||
@@ -233,6 +241,76 @@ Window {
|
||||
Layout.fillWidth: true
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -675,10 +675,11 @@ AppletItem {
|
||||
}
|
||||
|
||||
// 关于窗口:抽取为独立组件 package/components/AboutWindow.qml
|
||||
// 依赖通过属性传入:accentColor = root.accentRed
|
||||
// 依赖通过属性传入:accentColor = root.accentRed,version 取自 C++ 后端 applet.version
|
||||
AboutWindow {
|
||||
id: aboutWindow
|
||||
accentColor: root.accentRed
|
||||
version: root.applet ? root.applet.version : "1.0"
|
||||
}
|
||||
|
||||
// 设置窗口:独立顶层窗口,在桌面中间弹出
|
||||
|
||||
@@ -116,6 +116,15 @@ QString NetworkMonitorApplet::ipv6Address() const
|
||||
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()
|
||||
{
|
||||
readNetworkStats();
|
||||
|
||||
@@ -42,6 +42,8 @@ class NetworkMonitorApplet : public DApplet
|
||||
Q_PROPERTY(QString ipAddress READ ipAddress NOTIFY ipAddressChanged)
|
||||
// 活动接口的 IPv6 全球地址(已过滤 link-local 和 loopback),供 QML 显示
|
||||
Q_PROPERTY(QString ipv6Address READ ipv6Address NOTIFY ipv6AddressChanged)
|
||||
// 插件版本号,从 dde-shell 元数据读取,版本唯一源为 CMakeLists.txt project(VERSION)
|
||||
Q_PROPERTY(QString version READ version CONSTANT)
|
||||
|
||||
public:
|
||||
explicit NetworkMonitorApplet(QObject *parent = nullptr);
|
||||
@@ -60,6 +62,8 @@ public:
|
||||
QString activeInterface() const;
|
||||
QString ipAddress() const;
|
||||
QString ipv6Address() const;
|
||||
// 返回插件版本号,从 dde-shell 插件元数据(metadata.json)读取
|
||||
QString version() const;
|
||||
|
||||
Q_INVOKABLE void refresh();
|
||||
Q_INVOKABLE void setActiveInterface(const QString &interface);
|
||||
|
||||
Reference in New Issue
Block a user