| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- import QtQuick 2.15
- import QtQuick.Controls 2.15
- import QtQuick.Layouts 1.15
- // Creative cache progress overlay
- Rectangle {
- id: overlay
- anchors.fill: parent
- color: "#F0F4F8"
- z: 1000
- visible: backend && backend.cacheInProgress
- property var backend
- // Animated background gradient
- Rectangle {
- anchors.fill: parent
- gradient: Gradient {
- GradientStop { position: 0.0; color: "#E0E7FF" }
- GradientStop { position: 1.0; color: "#F0F4F8" }
- }
- // Animated floating particles
- Repeater {
- model: 15
- Rectangle {
- width: Math.random() * 8 + 4
- height: width
- radius: width / 2
- color: Qt.rgba(0.3, 0.5, 0.8, 0.3)
- x: Math.random() * overlay.width
- y: Math.random() * overlay.height
- SequentialAnimation on y {
- loops: Animation.Infinite
- running: overlay.visible
- NumberAnimation {
- from: Math.random() * overlay.height
- to: -20
- duration: Math.random() * 10000 + 8000
- easing.type: Easing.InOutQuad
- }
- NumberAnimation {
- from: -20
- to: overlay.height + 20
- duration: 0
- }
- }
- SequentialAnimation on opacity {
- loops: Animation.Infinite
- running: overlay.visible
- NumberAnimation { to: 0.6; duration: Math.random() * 2000 + 1000 }
- NumberAnimation { to: 0.1; duration: Math.random() * 2000 + 1000 }
- }
- }
- }
- }
- ColumnLayout {
- anchors.centerIn: parent
- spacing: 30
- width: Math.min(500, parent.width - 80)
- // Animated icon
- Item {
- Layout.alignment: Qt.AlignHCenter
- width: 120
- height: 120
- // Rotating circles
- Repeater {
- model: 3
- Rectangle {
- width: 80 - (index * 20)
- height: width
- radius: width / 2
- anchors.centerIn: parent
- color: "transparent"
- border.width: 3
- border.color: Qt.rgba(0.3, 0.5, 0.8, 0.4 - index * 0.1)
- RotationAnimation on rotation {
- from: index % 2 === 0 ? 0 : 360
- to: index % 2 === 0 ? 360 : 0
- duration: 3000 + (index * 1000)
- loops: Animation.Infinite
- running: overlay.visible
- }
- }
- }
- // Center icon
- Text {
- anchors.centerIn: parent
- text: "🎨"
- font.pixelSize: 48
- SequentialAnimation on scale {
- loops: Animation.Infinite
- running: overlay.visible
- NumberAnimation { to: 1.2; duration: 1000; easing.type: Easing.InOutQuad }
- NumberAnimation { to: 1.0; duration: 1000; easing.type: Easing.InOutQuad }
- }
- }
- }
- // Creative title with rotating messages
- Column {
- Layout.alignment: Qt.AlignHCenter
- spacing: 12
- Text {
- anchors.horizontalCenter: parent.horizontalCenter
- text: "Setting Up Pattern Previews"
- font.pixelSize: 24
- font.bold: true
- color: "#1E293B"
- horizontalAlignment: Text.AlignHCenter
- }
- Text {
- anchors.horizontalCenter: parent.horizontalCenter
- text: "Generating preview images for your patterns..."
- font.pixelSize: 16
- color: "#64748B"
- horizontalAlignment: Text.AlignHCenter
- }
- }
- // Progress bar
- Column {
- Layout.alignment: Qt.AlignHCenter
- Layout.fillWidth: true
- spacing: 8
- // Progress bar container
- Rectangle {
- width: parent.width
- height: 8
- radius: 4
- color: "#CBD5E1"
- Rectangle {
- width: parent.width * (backend ? backend.cacheProgress.percentage / 100 : 0)
- height: parent.height
- radius: parent.radius
- color: "#3B82F6"
- Behavior on width {
- NumberAnimation { duration: 300; easing.type: Easing.OutQuad }
- }
- // Shimmer effect
- Rectangle {
- anchors.fill: parent
- radius: parent.radius
- gradient: Gradient {
- orientation: Gradient.Horizontal
- GradientStop { position: 0.0; color: "transparent" }
- GradientStop { position: 0.5; color: Qt.rgba(1, 1, 1, 0.3) }
- GradientStop { position: 1.0; color: "transparent" }
- }
- SequentialAnimation on x {
- loops: Animation.Infinite
- running: overlay.visible
- NumberAnimation {
- from: -parent.width
- to: parent.width
- duration: 1500
- }
- }
- }
- }
- }
- // Progress text
- Row {
- anchors.horizontalCenter: parent.horizontalCenter
- spacing: 8
- Text {
- text: backend ? Math.round(backend.cacheProgress.percentage) + "%" : "0%"
- font.pixelSize: 14
- font.bold: true
- color: "#3B82F6"
- }
- Text {
- text: "•"
- font.pixelSize: 14
- color: "#94A3B8"
- }
- Text {
- text: backend ? (backend.cacheProgress.current + " of " + backend.cacheProgress.total + " patterns") : "..."
- font.pixelSize: 14
- color: "#64748B"
- }
- }
- }
- // Patience message
- Rectangle {
- Layout.alignment: Qt.AlignHCenter
- Layout.preferredWidth: Math.min(400, parent.width)
- Layout.preferredHeight: 80
- color: Qt.rgba(59, 130, 246, 0.1)
- radius: 12
- border.width: 1
- border.color: Qt.rgba(59, 130, 246, 0.2)
- ColumnLayout {
- anchors.fill: parent
- anchors.margins: 16
- spacing: 8
- Row {
- Layout.alignment: Qt.AlignHCenter
- spacing: 8
- Text {
- text: "☕"
- font.pixelSize: 20
- }
- Text {
- text: "Grab a coffee while we work our magic"
- font.pixelSize: 14
- color: "#475569"
- }
- }
- Text {
- Layout.alignment: Qt.AlignHCenter
- text: "This only happens when new patterns are discovered"
- font.pixelSize: 12
- color: "#94A3B8"
- font.italic: true
- }
- }
- }
- // Subtle loading dots
- Row {
- Layout.alignment: Qt.AlignHCenter
- spacing: 8
- Repeater {
- model: 3
- Rectangle {
- width: 8
- height: 8
- radius: 4
- color: "#3B82F6"
- SequentialAnimation on opacity {
- loops: Animation.Infinite
- running: overlay.visible
- PauseAnimation { duration: index * 200 }
- NumberAnimation { to: 0.3; duration: 600 }
- NumberAnimation { to: 1.0; duration: 600 }
- }
- }
- }
- }
- }
- // Fade in/out animation
- Behavior on visible {
- PropertyAnimation {
- property: "opacity"
- duration: 300
- }
- }
- }
|