178 lines
3.3 KiB
QML
178 lines
3.3 KiB
QML
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
import QtQuick
|
|
import Qt5Compat.GraphicalEffects
|
|
import "skin-bank.js" as SkinBank
|
|
|
|
Item {
|
|
property alias text: labelText.text
|
|
property alias textColor: labelText.color
|
|
property alias textFont: labelText.font
|
|
property string iconSource
|
|
property alias backgroundColor: rect.color
|
|
property alias border: rect.border
|
|
property bool autoHideText: true
|
|
|
|
signal clicked
|
|
|
|
id: button
|
|
width: 124
|
|
height: 124
|
|
antialiasing: true
|
|
|
|
RectangularGlow {
|
|
anchors.fill: rect
|
|
glowRadius: 1
|
|
spread: 1.0
|
|
visible: mouse.containsMouse || parent.focus
|
|
antialiasing: true
|
|
}
|
|
|
|
Rectangle {
|
|
id: rect
|
|
anchors.fill: parent
|
|
color: "#78D478"
|
|
antialiasing: true
|
|
border.width: 1
|
|
border.color: "#8CDA8C"
|
|
}
|
|
|
|
transform: [
|
|
Rotation {
|
|
id: rotationTransform
|
|
|
|
angle: 0
|
|
|
|
axis.x: 0
|
|
axis.y: 0
|
|
axis.z: 0
|
|
|
|
origin.x: button.width / 2.0
|
|
origin.y: button.height / 2.0
|
|
|
|
Behavior on angle {
|
|
NumberAnimation { duration: 100 }
|
|
}
|
|
},
|
|
|
|
Scale {
|
|
id: scaleTransform
|
|
|
|
xScale: 1
|
|
yScale: 1
|
|
|
|
origin.x: button.width / 2.0
|
|
origin.y: button.height / 2.0
|
|
|
|
Behavior on xScale {
|
|
NumberAnimation { duration: 100 }
|
|
}
|
|
|
|
Behavior on yScale {
|
|
NumberAnimation { duration: 100 }
|
|
}
|
|
}
|
|
|
|
]
|
|
|
|
Image {
|
|
id: icon
|
|
anchors.centerIn: parent
|
|
source: SkinBank.TILE_ICON_DIR + iconSource
|
|
scale: 0.8
|
|
}
|
|
|
|
Text {
|
|
id: labelText
|
|
|
|
anchors.bottom: parent.bottom
|
|
anchors.bottomMargin: 3
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: 3
|
|
|
|
visible: !autoHideText || mouse.containsMouse
|
|
|
|
color: "white"
|
|
font.pixelSize: 16
|
|
font.family: "WenQuanYi Micro Hei"
|
|
|
|
text: "Button"
|
|
}
|
|
|
|
MouseArea {
|
|
id: mouse
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
|
|
property bool down: false
|
|
|
|
onPressed: {
|
|
down = true;
|
|
|
|
rotationTransform.axis.x = 0;
|
|
rotationTransform.axis.y = 0;
|
|
rotationTransform.origin.x = button.width / 2.0
|
|
rotationTransform.origin.y = button.height / 2.0
|
|
|
|
if (mouseX > parent.width - 30)
|
|
{
|
|
rotationTransform.origin.x = 0;
|
|
rotationTransform.axis.y = 1;
|
|
rotationTransform.angle = 15;
|
|
return;
|
|
}
|
|
|
|
if (mouseX < 30) {
|
|
rotationTransform.origin.x = button.width;
|
|
rotationTransform.axis.y = 1;
|
|
rotationTransform.angle = -15;
|
|
return;
|
|
}
|
|
|
|
if (mouseY < 30) {
|
|
rotationTransform.origin.y = button.height;
|
|
rotationTransform.axis.x = 1;
|
|
rotationTransform.angle = 15;
|
|
return;
|
|
}
|
|
|
|
if (mouseY > parent.height - 30) {
|
|
rotationTransform.origin.y = 0;
|
|
rotationTransform.axis.x = 1;
|
|
rotationTransform.angle = -15;
|
|
return;
|
|
}
|
|
|
|
scaleTransform.xScale = 0.95;
|
|
scaleTransform.yScale = 0.95;
|
|
}
|
|
|
|
onCanceled: {
|
|
reset();
|
|
down = false;
|
|
}
|
|
|
|
onReleased: {
|
|
reset();
|
|
if (down) {
|
|
button.clicked();
|
|
}
|
|
}
|
|
|
|
onExited: {
|
|
reset();
|
|
down = false;
|
|
}
|
|
|
|
function reset() {
|
|
scaleTransform.xScale = 1;
|
|
scaleTransform.yScale = 1;
|
|
rotationTransform.angle = 0;
|
|
}
|
|
}
|
|
|
|
Keys.onReturnPressed: {
|
|
button.clicked();
|
|
}
|
|
}
|