02e76749 by 柴进

feat(input): 输入框右键菜单(剪切/复制/粘贴/全选)

QML 默认 TextField / TextArea 不带右键菜单(只能 Ctrl+V/C/X),跟旧 QWidget
版的体验差。补:

ThemedTextField (复用组件,覆盖登录用户名 + 款式词库添加输入):
  TapHandler acceptedButtons:RightButton 弹 Menu,4 项:
    剪切 / 复制 / 粘贴 / 全选
  密码框 (echoMode === TextInput.Password) 时 剪切 / 复制 disabled,
  防泄漏;粘贴 / 全选 仍可用(密码管理器粘贴常用)

ImageGenTab.qml promptArea (TextArea):
  同样的 Menu + TapHandler,因为 promptArea 不通过 ThemedTextField 走

注:HistoryTab 详情 prompt 只读区已有 ":clipboard: 复制" 按钮覆盖复制需求;
StyleDesignerTab 的 Prompt 预览同样只读,旁边有字数显示,先不改。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent be3c1b5e
......@@ -600,12 +600,46 @@ Item {
font.pointSize: App.Theme.fontBase
color: App.Theme.textPrimary
wrapMode: TextArea.Wrap
selectionColor: App.Theme.accent
selectedTextColor: App.Theme.textOnAccent
background: Rectangle {
color: App.Theme.bgSubtle
radius: App.Theme.radiusMd
border.width: 1
border.color: App.Theme.borderDefault
}
// 右键编辑菜单
Menu {
id: promptEditMenu
MenuItem {
text: "剪切"
enabled: promptArea.selectedText.length > 0
onTriggered: promptArea.cut()
}
MenuItem {
text: "复制"
enabled: promptArea.selectedText.length > 0
onTriggered: promptArea.copy()
}
MenuItem {
text: "粘贴"
enabled: promptArea.canPaste
onTriggered: promptArea.paste()
}
MenuSeparator {}
MenuItem {
text: "全选"
enabled: promptArea.length > 0
onTriggered: promptArea.selectAll()
}
}
TapHandler {
acceptedButtons: Qt.RightButton
gesturePolicy: TapHandler.WithinBounds
onTapped: promptEditMenu.popup()
}
}
}
}
......
......@@ -26,4 +26,40 @@ TextField {
ColorAnimation { duration: 100 }
}
}
// 右键弹编辑菜单(剪切 / 复制 / 粘贴 / 全选)
// 密码框 (echoMode === TextInput.Password) 时禁用 复制 / 剪切 防泄漏
Menu {
id: editMenu
MenuItem {
text: "剪切"
enabled: control.selectedText.length > 0
&& control.echoMode !== TextInput.Password
onTriggered: control.cut()
}
MenuItem {
text: "复制"
enabled: control.selectedText.length > 0
&& control.echoMode !== TextInput.Password
onTriggered: control.copy()
}
MenuItem {
text: "粘贴"
enabled: control.canPaste
onTriggered: control.paste()
}
MenuSeparator {}
MenuItem {
text: "全选"
enabled: control.length > 0
onTriggered: control.selectAll()
}
}
TapHandler {
acceptedButtons: Qt.RightButton
gesturePolicy: TapHandler.WithinBounds
onTapped: editMenu.popup()
}
}
......