docs: 添加涉密文件自检工具实施计划
This commit is contained in:
@@ -0,0 +1,176 @@
|
||||
// =======================================
|
||||
// =============== 结果文本 ===============
|
||||
// =======================================
|
||||
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
import QtQuick.Layouts 1.15
|
||||
import "../"
|
||||
|
||||
Item {
|
||||
id: resultRoot
|
||||
|
||||
property string status_: "" // 状态, text / noText / error
|
||||
property alias textLeft: textLeft_.text
|
||||
property string textRight: ""
|
||||
property alias textMain: textMain_.text
|
||||
property alias activeFocus_: textMain_.activeFocus // 输入框焦点
|
||||
property int index_
|
||||
// 选取文字
|
||||
property int selectL: -1
|
||||
property int selectR: -1
|
||||
property int selectUpdate: 0 // 只要有变化,就刷新选中
|
||||
// 外部函数
|
||||
property var copy: undefined // 复制选中
|
||||
property var copyAll: undefined // 复制全部
|
||||
property var selectSingle: undefined // 选中单个文本框
|
||||
property var selectAll: undefined // 所有文本框全选
|
||||
property var selectDel: undefined // 删除单个
|
||||
property var selectAllDel: undefined // 清空
|
||||
|
||||
// 传入一个相对于item的坐标,返回该坐标位于this组件的什么位置。
|
||||
// undefined:不在组件中 | -1:顶部信息栏 | 0~N:所在字符的下标
|
||||
function where(item, mx, my) {
|
||||
const localPoint = this.mapFromItem(item, mx, my)
|
||||
if(!this.contains(localPoint)) {
|
||||
return undefined
|
||||
}
|
||||
if(resultTop.contains(localPoint)) {
|
||||
return -1
|
||||
}
|
||||
else {
|
||||
const textPoint = textMain_.mapFromItem(item, mx, my)
|
||||
const textPos = textMain_.positionAt(textPoint.x, textPoint.y)
|
||||
return textPos
|
||||
}
|
||||
}
|
||||
// 将光标移到指定位置并激活焦点。
|
||||
function focus(pos=-1) {
|
||||
if(pos >= 0 && textMain_.cursorPosition !== pos) {
|
||||
textMain_.cursorPosition = pos
|
||||
}
|
||||
if(!textMain_.activeFocus) {
|
||||
textMain_.forceActiveFocus() // 获取焦点
|
||||
}
|
||||
}
|
||||
function toUpdateSelect() {
|
||||
if(selectL<0 || selectR<0)
|
||||
textMain_.deselect()
|
||||
else
|
||||
textMain_.select(selectL, selectR)
|
||||
}
|
||||
onSelectUpdateChanged: toUpdateSelect()
|
||||
TableView.onReused: toUpdateSelect()
|
||||
Component.onCompleted: toUpdateSelect()
|
||||
|
||||
|
||||
// 高度适应子组件
|
||||
implicitHeight: resultTop.height+resultBottom.height+size_.smallSpacing
|
||||
height: resultTop.height+resultBottom.height+size_.smallSpacing
|
||||
property var onTextHeightChanged // 当文字输入导致高度改变时,调用的函数
|
||||
|
||||
onHeightChanged: { // 高度改变时,通知父级
|
||||
// 必须文本框获得焦点时才触发
|
||||
if(textMain_.activeFocus && (typeof onTextHeightChanged === "function"))
|
||||
onTextHeightChanged()
|
||||
}
|
||||
|
||||
// 顶部信息
|
||||
Item {
|
||||
id: resultTop
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: size_.smallSpacing
|
||||
anchors.rightMargin: size_.smallSpacing
|
||||
height: size_.smallLine + size_.spacing*2
|
||||
|
||||
// 图片名称
|
||||
Text_ {
|
||||
id: textLeft_
|
||||
anchors.left: parent.left
|
||||
anchors.right: textRight_.left
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.rightMargin: size_.spacing
|
||||
anchors.bottomMargin: size_.smallSpacing
|
||||
color: theme.subTextColor
|
||||
font.pixelSize: size_.smallText
|
||||
font.family: theme.dataFontFamily
|
||||
clip: true
|
||||
elide: Text.ElideLeft
|
||||
}
|
||||
// 日期时间
|
||||
Text_ {
|
||||
id: textRight_
|
||||
anchors.right: btnRight.left
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: size_.smallSpacing
|
||||
color: theme.subTextColor
|
||||
font.pixelSize: size_.smallText
|
||||
text: textRight + " | "
|
||||
}
|
||||
// 复制按钮
|
||||
Text_ {
|
||||
id: btnRight
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: size_.smallSpacing
|
||||
color: theme.specialTextColor
|
||||
font.pixelSize: size_.smallText
|
||||
text: qsTr("复制")
|
||||
}
|
||||
}
|
||||
|
||||
// 下方主要文字内容
|
||||
Rectangle {
|
||||
id: resultBottom
|
||||
color: theme.bgColor
|
||||
anchors.top: resultTop.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
// anchors.topMargin: size_.smallSpacing
|
||||
radius: size_.baseRadius
|
||||
height: textMain_.height
|
||||
|
||||
TextEdit_ {
|
||||
id: textMain_
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: size_.smallSpacing
|
||||
anchors.rightMargin: size_.smallSpacing
|
||||
readOnly: false // 可编辑
|
||||
persistentSelection: true // 丢失焦点时,保留选区
|
||||
color: status_==="error"? theme.noColor:theme.textColor
|
||||
|
||||
// 按键事件。响应并拦截:单双击 Ctrl+C ,双击 Ctrl+A
|
||||
property int keyDoubleTime: 300 // 双击毫秒
|
||||
property int lastUpTime: -1 // 上次按键抬起的时间戳。需要截取后8位以免int放不下
|
||||
property int lastKey: -1 // 上次按键的键值
|
||||
property var listeningKeys: [Qt.Key_A, Qt.Key_C, Qt.Key_D]
|
||||
Keys.onPressed: {
|
||||
if (event.modifiers & Qt.ControlModifier) {
|
||||
if (listeningKeys.includes(event.key)) {
|
||||
event.accepted = true // 拦截按键
|
||||
const t = Date.now() & 0xFFFFFFFF
|
||||
// 双击
|
||||
if(t - lastUpTime <= keyDoubleTime && lastKey==event.key) {
|
||||
event.key===Qt.Key_A && resultRoot.selectAll && resultRoot.selectAll()
|
||||
event.key===Qt.Key_C && resultRoot.copyAll && resultRoot.copyAll()
|
||||
event.key===Qt.Key_D && resultRoot.selectAllDel && resultRoot.selectAllDel()
|
||||
}
|
||||
else { // 单击
|
||||
event.key===Qt.Key_A && resultRoot.selectSingle && resultRoot.selectSingle()
|
||||
event.key===Qt.Key_C && resultRoot.copy && resultRoot.copy()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Keys.onReleased: {
|
||||
if (listeningKeys.includes(event.key)) {
|
||||
lastUpTime = Date.now() & 0xFFFFFFFF
|
||||
lastKey = event.key
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user