up su Gitea
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Effects
|
||||
import qs.Commons
|
||||
import qs.Widgets
|
||||
|
||||
Rectangle {
|
||||
id: phoneRoot
|
||||
|
||||
property string backgroundImage: "" // Path to background image
|
||||
|
||||
height: parent ? parent.height : 235
|
||||
width: (height / 235) * 115
|
||||
|
||||
readonly property real scaleFactor: Math.min(width / 115, height / 235)
|
||||
radius: 20 * scaleFactor
|
||||
|
||||
color: "#1c1c1e"
|
||||
|
||||
signal clicked;
|
||||
|
||||
MultiEffect {
|
||||
source: phoneRect
|
||||
anchors.fill: phoneRect
|
||||
shadowEnabled: true
|
||||
shadowBlur: phoneRect.scale > 0.97 ? 0.8 : 0.3
|
||||
shadowVerticalOffset: phoneRect.scale > 0.97 ? 8 : 2
|
||||
shadowColor: "#80000000"
|
||||
|
||||
Behavior on shadowBlur { NumberAnimation { duration: 100 } }
|
||||
Behavior on shadowVerticalOffset { NumberAnimation { duration: 100 } }
|
||||
}
|
||||
|
||||
RectangularShadow {
|
||||
anchors.fill: phoneRect
|
||||
radius: phoneRoot.radius
|
||||
blur: 15
|
||||
spread: 1
|
||||
}
|
||||
|
||||
// Bezel/frame
|
||||
Rectangle {
|
||||
id: phoneRect
|
||||
|
||||
Behavior on scale {
|
||||
NumberAnimation { duration: 100; easing.type: Easing.OutCubic }
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
|
||||
onEntered: phoneRect.scale = 1.02
|
||||
onExited: phoneRect.scale = 1.0
|
||||
onPressed: phoneRect.scale = 0.99
|
||||
onReleased: phoneRect.scale = containsMouse ? 1.02 : 1.0
|
||||
onClicked: phoneRoot.clicked();
|
||||
}
|
||||
|
||||
anchors {
|
||||
fill: parent
|
||||
margins: 2 * phoneRoot.scaleFactor
|
||||
}
|
||||
radius: 18 * phoneRoot.scaleFactor
|
||||
color: "black"
|
||||
|
||||
// Screen
|
||||
Rectangle {
|
||||
id: screen
|
||||
anchors {
|
||||
fill: parent
|
||||
margins: 1 * phoneRoot.scaleFactor
|
||||
}
|
||||
radius: 17 * phoneRoot.scaleFactor
|
||||
color: "black"
|
||||
clip: true
|
||||
|
||||
// Background wallpaper
|
||||
Image {
|
||||
anchors.fill: parent
|
||||
source: phoneRoot.backgroundImage
|
||||
fillMode: Image.PreserveAspectCrop
|
||||
visible: phoneRoot.backgroundImage !== ""
|
||||
|
||||
// Fallback gradient if no image
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
visible: phoneRoot.backgroundImage === ""
|
||||
gradient: Gradient {
|
||||
GradientStop { position: 0.0; color: "#2c3e50" }
|
||||
GradientStop { position: 1.0; color: "#34495e" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Dynamic Island
|
||||
Rectangle {
|
||||
id: dynamicIsland
|
||||
anchors {
|
||||
top: parent.top
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
topMargin: 6 * phoneRoot.scaleFactor
|
||||
}
|
||||
width: 48 * phoneRoot.scaleFactor
|
||||
height: 10 * phoneRoot.scaleFactor
|
||||
radius: 5 * phoneRoot.scaleFactor
|
||||
color: "black"
|
||||
}
|
||||
|
||||
// Home indicator (bottom gesture bar)
|
||||
Rectangle {
|
||||
anchors {
|
||||
bottom: parent.bottom
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
bottomMargin: 6 * phoneRoot.scaleFactor
|
||||
}
|
||||
width: 40 * phoneRoot.scaleFactor
|
||||
height: 4 * phoneRoot.scaleFactor
|
||||
radius: 2 * phoneRoot.scaleFactor
|
||||
color: "white"
|
||||
opacity: 0.4
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user