feat: aggiungi splash screen costruttivista per KDE Plasma
This commit is contained in:
@@ -0,0 +1,17 @@
|
|||||||
|
# Costruttivista — schermata di avvio Plasma 6
|
||||||
|
|
||||||
|
Tema splash autonomo per KDE Plasma 6. L'immagine e tutti i componenti necessari sono inclusi nel pacchetto; non usa rete, video o dipendenze esterne.
|
||||||
|
|
||||||
|
## Installazione
|
||||||
|
|
||||||
|
Dalla directory che contiene il progetto:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kpackagetool6 -t Plasma/LookAndFeel -i ./org.enne2.costruttivista.splash
|
||||||
|
```
|
||||||
|
|
||||||
|
In alternativa si può passare allo stesso comando l'archivio `dist/org.enne2.costruttivista.splash.tar.gz` incluso nel repository.
|
||||||
|
|
||||||
|
## Attivazione
|
||||||
|
|
||||||
|
Aprire **Impostazioni di sistema → Colori e temi → Schermata di avvio**, selezionare **Costruttivista** e applicare. Il pacchetto non viene installato né attivato automaticamente.
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
@@ -0,0 +1,246 @@
|
|||||||
|
import QtQuick
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: root
|
||||||
|
color: "#101012"
|
||||||
|
property int stage: 0
|
||||||
|
readonly property int visibleStage: Math.max(0, Math.min(5, stage))
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: scene
|
||||||
|
anchors.fill: parent
|
||||||
|
opacity: 0
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: background
|
||||||
|
anchors.fill: parent
|
||||||
|
source: "images/sfondo_costruttivista_fhd.png"
|
||||||
|
fillMode: Image.PreserveAspectCrop
|
||||||
|
asynchronous: true
|
||||||
|
cache: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "#12000000"
|
||||||
|
opacity: overlayFade.value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accenti geometrici dimensionati rispetto allo schermo.
|
||||||
|
Item {
|
||||||
|
id: accents
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: redBar
|
||||||
|
x: parent.width * 0.07
|
||||||
|
y: parent.height * 0.15
|
||||||
|
width: Math.max(5, parent.width * 0.008)
|
||||||
|
height: parent.height * 0.27
|
||||||
|
color: "#d83a28"
|
||||||
|
opacity: 0.9
|
||||||
|
transform: Translate { id: redShift; y: -root.height * 0.10 }
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: creamLine
|
||||||
|
x: parent.width * 0.07
|
||||||
|
y: parent.height * 0.44
|
||||||
|
width: parent.width * 0.20
|
||||||
|
height: Math.max(2, parent.height * 0.004)
|
||||||
|
color: "#f0dfba"
|
||||||
|
opacity: 0.85
|
||||||
|
transform: Translate { id: lineShift; x: -root.width * 0.12 }
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: darkBar
|
||||||
|
x: parent.width * 0.82
|
||||||
|
y: parent.height * 0.60
|
||||||
|
width: Math.max(4, parent.width * 0.005)
|
||||||
|
height: parent.height * 0.20
|
||||||
|
color: "#181719"
|
||||||
|
opacity: 0.75
|
||||||
|
transform: Translate { id: darkShift; y: root.height * 0.09 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: progressCue
|
||||||
|
width: Math.min(root.width * 0.76, 720)
|
||||||
|
height: Math.max(150, Math.min(root.height * 0.25, 230))
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.bottomMargin: Math.max(28, root.height * 0.085)
|
||||||
|
color: "#d9151517"
|
||||||
|
border.color: "#66f0dfba"
|
||||||
|
border.width: Math.max(1, root.height * 0.002)
|
||||||
|
|
||||||
|
// Un grande marchio geometrico continua a ruotare anche quando lo
|
||||||
|
// stadio comunicato da Plasma non cambia.
|
||||||
|
Item {
|
||||||
|
id: loaderMark
|
||||||
|
width: Math.max(82, Math.min(progressCue.height * 0.62, 132))
|
||||||
|
height: width
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: Math.max(22, progressCue.width * 0.045)
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.margins: loaderMark.width * 0.09
|
||||||
|
radius: width / 2
|
||||||
|
color: "transparent"
|
||||||
|
border.color: "#f0dfba"
|
||||||
|
border.width: Math.max(5, loaderMark.width * 0.075)
|
||||||
|
opacity: 0.92
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: rotor
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
width: parent.width * 0.48
|
||||||
|
height: Math.max(12, parent.height * 0.16)
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
color: "#d83a28"
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
width: Math.max(11, parent.width * 0.14)
|
||||||
|
height: parent.height * 0.42
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.top: parent.top
|
||||||
|
color: "#f0dfba"
|
||||||
|
}
|
||||||
|
|
||||||
|
RotationAnimator on rotation {
|
||||||
|
from: 0
|
||||||
|
to: 360
|
||||||
|
duration: 1200
|
||||||
|
loops: Animation.Infinite
|
||||||
|
running: scene.opacity > 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
width: parent.width * 0.25
|
||||||
|
height: width
|
||||||
|
anchors.centerIn: parent
|
||||||
|
color: "#171719"
|
||||||
|
border.color: "#d83a28"
|
||||||
|
border.width: Math.max(3, width * 0.15)
|
||||||
|
rotation: 45
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: loadingInfo
|
||||||
|
anchors.left: loaderMark.right
|
||||||
|
anchors.leftMargin: Math.max(22, progressCue.width * 0.045)
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.rightMargin: Math.max(22, progressCue.width * 0.045)
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
height: Math.max(92, parent.height * 0.58)
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: statusLabel
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
text: root.visibleStage === 5 ? "SESSIONE PRONTA" : "AVVIO DELLA SESSIONE"
|
||||||
|
color: "#f3e2bd"
|
||||||
|
font.pixelSize: Math.max(17, Math.min(root.width * 0.022, 30))
|
||||||
|
font.bold: true
|
||||||
|
font.letterSpacing: Math.max(1, font.pixelSize * 0.08)
|
||||||
|
elide: Text.ElideRight
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: statusLabel.bottom
|
||||||
|
anchors.topMargin: 5
|
||||||
|
text: "CARICAMENTO / FASE " + root.visibleStage + " DI 5"
|
||||||
|
color: "#d83a28"
|
||||||
|
font.pixelSize: Math.max(11, Math.min(root.width * 0.012, 16))
|
||||||
|
font.bold: true
|
||||||
|
font.letterSpacing: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
Row {
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
height: Math.max(18, Math.min(root.height * 0.026, 28))
|
||||||
|
spacing: Math.max(5, root.width * 0.005)
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: 5
|
||||||
|
Rectangle {
|
||||||
|
required property int index
|
||||||
|
width: (loadingInfo.width - 4 * parent.spacing) / 5
|
||||||
|
height: parent.height
|
||||||
|
color: index < root.visibleStage ? "#d83a28" : "#4df0dfba"
|
||||||
|
border.color: "#b3f0dfba"
|
||||||
|
border.width: 1
|
||||||
|
|
||||||
|
Behavior on color { ColorAnimation { duration: 260 } }
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "#f0dfba"
|
||||||
|
opacity: 0
|
||||||
|
SequentialAnimation on opacity {
|
||||||
|
loops: Animation.Infinite
|
||||||
|
PauseAnimation { duration: index * 120 }
|
||||||
|
NumberAnimation { from: 0; to: 0.38; duration: 180 }
|
||||||
|
NumberAnimation { from: 0.38; to: 0; duration: 360 }
|
||||||
|
PauseAnimation { duration: (4 - index) * 120 + 280 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
width: Math.max(10, progressCue.width * 0.025)
|
||||||
|
height: progressCue.height
|
||||||
|
color: "#d83a28"
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QtObject { id: overlayFade; property real value: 0.0 }
|
||||||
|
|
||||||
|
ParallelAnimation {
|
||||||
|
id: intro
|
||||||
|
NumberAnimation { target: scene; property: "opacity"; from: 0; to: 1; duration: 700; easing.type: Easing.OutCubic }
|
||||||
|
NumberAnimation { target: overlayFade; property: "value"; from: 0; to: 1; duration: 900 }
|
||||||
|
NumberAnimation { target: redShift; property: "y"; to: 0; duration: 850; easing.type: Easing.OutCubic }
|
||||||
|
NumberAnimation { target: lineShift; property: "x"; to: 0; duration: 950; easing.type: Easing.OutCubic }
|
||||||
|
NumberAnimation { target: darkShift; property: "y"; to: 0; duration: 1050; easing.type: Easing.OutCubic }
|
||||||
|
}
|
||||||
|
|
||||||
|
NumberAnimation {
|
||||||
|
id: outro
|
||||||
|
target: scene
|
||||||
|
property: "opacity"
|
||||||
|
to: 0
|
||||||
|
duration: 450
|
||||||
|
easing.type: Easing.InOutQuad
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: intro.start()
|
||||||
|
onStageChanged: {
|
||||||
|
if (stage === 5) {
|
||||||
|
outro.start()
|
||||||
|
} else if (scene.opacity === 0 && !intro.running) {
|
||||||
|
intro.start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 2.2 MiB |
BIN
Binary file not shown.
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"KPackageStructure": "Plasma/LookAndFeel",
|
||||||
|
"KPlugin": {
|
||||||
|
"Authors": [
|
||||||
|
{
|
||||||
|
"Name": "enne2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Category": "Aspetto",
|
||||||
|
"Description": "Schermata di avvio costruttivista per KDE Plasma 6",
|
||||||
|
"Description[it]": "Schermata di avvio costruttivista per KDE Plasma 6",
|
||||||
|
"Id": "org.enne2.costruttivista.splash",
|
||||||
|
"License": "Proprietary",
|
||||||
|
"Name": "Costruttivista",
|
||||||
|
"Name[it]": "Costruttivista",
|
||||||
|
"Version": "1.0.0",
|
||||||
|
"Website": ""
|
||||||
|
},
|
||||||
|
"X-Plasma-APIVersion": "2"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user