Files
work-secretfile-selfcheck/UmiOCR-data/qt_res/qml/TabBar_/TabButton_.qml

171 lines
5.2 KiB
QML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ==================================================
// =============== 水平标签栏的标签按钮 ===============
// ==================================================
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtGraphicalEffects 1.15 // 阴影
import "../Widgets"
Button {
id: btn
// 设定值
property string title: "Unknown TabBtn" // 显示的标题
property int index: -1 // 在标签栏中的序号
// 默认值
height: size_.hTabBarHeight
checkable: false // 手动控制
z: checked? 10 : 0 // 选中模式下弹到顶层
// 信号
signal dragStart(int index) // 开始拖拽的信号
signal dragFinish(int index) // 结束拖拽的信号
signal dragMoving(int index, int x) // 拖拽移动的信号
// 按钮前景
contentItem: Item {
anchors.fill: parent
RowLayout {
anchors.fill: parent
// TODO: 图标
Item {
width: size_.line*0.2 // 先占位
height: btn.height // 适应整个按钮的高度
}
// 标题
Text_ {
text: title // 外部传入的title
elide: Text.ElideRight // 隐藏超出宽度
Layout.fillWidth: true // 填充宽度
height: btn.height // 适应整个按钮的高度
color: (btn.hovered || btn.checked)?theme.textColor:theme.subTextColor
font.bold: btn.checked
}
// 关闭按钮
IconButton {
// 未锁定,且主按钮悬停或选中时才显示
visible: !qmlapp.tab.barIsLock && (btn.hovered || btn.checked)
Layout.alignment: Qt.AlignRight
Layout.rightMargin: size_.hTabBarHeight * 0.2
property real size: size_.hTabBarHeight * 0.7
implicitWidth: size
implicitHeight: size
bgColor_: "#00000000"
icon_: "no"
onClicked: {
qmlapp.tab.closeTabPage(index)
}
}
}
}
// 按钮背景
background: Rectangle {
anchors.fill: parent
color: parent.checked ? theme.bgColor : (
parent.hovered ? theme.coverColor1 : "#00000000"
)
// 侧边小条
Rectangle{
visible: !parent.parent.checked
height: size_.line
width: 1
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
color: theme.coverColor4
}
// 边缘阴影
layer.enabled: parent.checked
layer.effect: DropShadow {
transparentBorder: true
color: theme.coverColor3
samples: size_.hTabBarHeight
}
// 点击和拖拽处理
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.MiddleButton
// 拖拽
drag.target: qmlapp.tab.barIsLock ? undefined : parent.parent // 动态启用、禁用拖拽
drag.axis: Drag.XAxis // 只能沿X轴
drag.threshold: 50 // 起始阈值
property bool dragActive: drag.active // 动态记录拖拽状态
property int dragX: parent.parent.x // 动态记录拖拽时整体的位置
onPressed: { // 左键按下,切换焦点
if(mouse.button === Qt.LeftButton) {
qmlapp.tab.showTabPage(index)
}
}
onClicked: { // 中键点击,删除标签
if(mouse.button === Qt.MiddleButton && !qmlapp.tab.barIsLock) {
qmlapp.tab.closeTabPage(index)
}
}
onDragActiveChanged: {
if(drag.active) { // 拖拽开始
parent.opacity = 0.6
parent.parent.y += parent.parent.height / 2
dragStart(index)
} else { // 拖拽结束
parent.opacity = 1
parent.parent.y -= parent.parent.height / 2
dragFinish(index)
}
}
onDragXChanged: {
if(drag.active) {
dragMoving(index, dragX)
}
}
}
}
// 选中时的放大动画
property bool enabledAni: false // true是允许动画
property bool runAni: false
Timer { // 计时器,保证初始化的一段时间内不允许动画
running: true
interval: 300
onTriggered: enabledAni=true
}
onCheckedChanged: {
if(enabledAni) runAni = checked
}
SequentialAnimation{ // 串行动画
running: qmlapp.enabledEffect && runAni
// 动画1放大
NumberAnimation{
target: btn
property: "scale"
to: 1.2
duration: 80
easing.type: Easing.OutCubic
}
// 动画2缩小
NumberAnimation{
target: btn
property: "scale"
to: 1
duration: 150
easing.type: Easing.InCubic
}
}
}