calamares: yarrr har, steal kaos qml

This commit is contained in:
2026-06-23 17:34:08 +02:00
parent edccdcdfba
commit ee616f7a75
13 changed files with 549 additions and 228 deletions
@@ -0,0 +1,8 @@
import QtQuick 2.15
Item {
property string title
property string body
property string footer
property url image
}
@@ -2,7 +2,7 @@
pkgname=calamares-branding-antergos-next
pkgver=1.0
pkgrel=9
pkgrel=10
pkgdesc="Calamares branding for Antergos NeXT with offline/online installer support"
arch=('any')
url="https://github.com/Antergos-NeXT"
@@ -12,6 +12,15 @@ optdepends=('zenity: fallback for graphical mode chooser dialog')
source=("branding.desc"
"stylesheet.qss"
"show.qml"
"Dia.qml"
"Slider.qml"
"calamares-sidebar.qml"
"calamares-navigation.qml"
"background.jpg"
"pan-up-symbolic.svg"
"pan-end-symbolic.svg"
"pan-start-symbolic.svg"
"draw-rectangle.svg"
"unpackfs.conf"
"dracut.conf"
"antergos-logo.png"
@@ -34,6 +43,15 @@ sha256sums=('SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP')
package() {
@@ -43,6 +61,15 @@ package() {
cp "branding.desc" "${pkgdir}${_brand}/"
cp "stylesheet.qss" "${pkgdir}${_brand}/"
cp "show.qml" "${pkgdir}${_brand}/"
cp "Dia.qml" "${pkgdir}${_brand}/"
cp "Slider.qml" "${pkgdir}${_brand}/"
cp "calamares-sidebar.qml" "${pkgdir}${_brand}/"
cp "calamares-navigation.qml" "${pkgdir}${_brand}/"
cp "background.jpg" "${pkgdir}${_brand}/"
cp "pan-up-symbolic.svg" "${pkgdir}${_brand}/"
cp "pan-end-symbolic.svg" "${pkgdir}${_brand}/"
cp "pan-start-symbolic.svg" "${pkgdir}${_brand}/"
cp "draw-rectangle.svg" "${pkgdir}${_brand}/"
cp "antergos-logo.png" "${pkgdir}${_brand}/"
cp "antergos-icon.png" "${pkgdir}${_brand}/"
@@ -0,0 +1,173 @@
import QtQuick 2.15
Item {
property list<Dia> slides
property list<Dia> img
property int currentSlideIndex: 0
property int _currentSlideIndex: 0
property int slidesSize: slides.length
property bool firstIteration: true
function reset() {
currentSlideIndex = 0;
firstIteration = true;
}
onCurrentSlideIndexChanged: {
if (currentSlideIndex >= slidesSize) {
firstIteration = false;
currentSlideIndex = 0;
}
transitionAnimation.start();
}
Column {
anchors.fill: parent
spacing: 10
Text {
id: titleText
font {
family: "Raleway"
capitalization: Font.AllUppercase
weight: Font.DemiBold
pointSize: 16
}
color: "white"
text: slides[_currentSlideIndex].title
}
Text {
id: bodyText
font {
family: "Raleway"
pointSize: 12
weight: Font.DemiBold
}
width: 400
color: "white"
text: slides[_currentSlideIndex].body
wrapMode: Text.Wrap
}
Text {
id: footerText
font {
family: "Raleway"
weight: Font.Light
pointSize: 12
}
width: 400
color: "white"
text: slides[_currentSlideIndex].footer ?? ""
wrapMode: Text.Wrap
}
Image {
id: icon
source: slides[_currentSlideIndex].image
width: 250
height: 250
}
}
SequentialAnimation {
id: transitionAnimation
property int duration: 700
ParallelAnimation {
OpacityAnimator {
target: titleText
from: 1.0
to: 0.0
duration: transitionAnimation.duration
}
OpacityAnimator {
target: bodyText
from: 1.0
to: 0.0
duration: transitionAnimation.duration
}
OpacityAnimator {
target: footerText
from: 1.0
to: 0.0
duration: transitionAnimation.duration
}
OpacityAnimator {
target: icon
from: 1.0
to: 0.0
duration: 2000
}
XAnimator {
target: titleText
from: 0
to: -30
duration: transitionAnimation.duration
}
XAnimator {
target: bodyText
from: 0
to: -25
duration: transitionAnimation.duration
}
XAnimator {
target: footerText
from: 0
to: -25
duration: transitionAnimation.duration
}
}
ScriptAction {
script: _currentSlideIndex = currentSlideIndex
}
ParallelAnimation {
OpacityAnimator {
target: titleText
from: 0.0
to: 1.0
duration: transitionAnimation.duration
}
OpacityAnimator {
target: bodyText
from: 0.0
to: 1.0
duration: transitionAnimation.duration
}
OpacityAnimator {
target: footerText
from: 0.0
to: 1.0
duration: transitionAnimation.duration
}
OpacityAnimator {
target: icon
from: 0.0
to: 1.0
duration: 2000
}
XAnimator {
target: titleText
from: 30
to: 0
duration: transitionAnimation.duration
}
XAnimator {
target: bodyText
from: 25
to: 0
duration: transitionAnimation.duration
}
XAnimator {
target: footerText
from: 25
to: 0
duration: transitionAnimation.duration
}
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@@ -5,11 +5,11 @@ welcomeStyleCalamares: false
welcomeExpandingLogo: true
windowExpanding: normal
windowSize: 860px,540px
windowSize: 920px,630px
windowPlacement: center
sidebar: widget
navigation: widget
sidebar: qml,bottom
navigation: qml,right
strings:
productName: "Antergos NeXT"
@@ -38,4 +38,3 @@ style:
slideshow: "show.qml"
slideshowAPI: 2
...
@@ -0,0 +1,166 @@
import io.calamares.ui 1.0
import io.calamares.core 1.0
import QtQuick 2.3
import QtQuick.Controls 2.10
import QtQuick.Layouts 1.3
Rectangle {
id: navigationBar;
color: Branding.styleString( Branding.SidebarBackground );
height: parent.height;
width: 64;
ColumnLayout {
id: buttonBar
anchors.fill: parent;
spacing: 1
Image {
Layout.topMargin: 1;
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
id: logo;
width: 62;
height: width;
source: "file:/" + Branding.imagePath(Branding.ProductLogo);
sourceSize.width: width;
sourceSize.height: height;
}
Rectangle {
id: debugArea
Layout.fillWidth: true;
height: 35
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.topMargin: 40
color: Branding.styleString( mouseAreaDebug.containsMouse ? Branding.SidebarBackgroundCurrent : Branding.SidebarBackground);
visible: debug.enabled
MouseArea {
id: mouseAreaDebug
anchors.fill: parent;
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
Text {
anchors.centerIn: parent
text: qsTr("Debug")
color: Branding.styleString( mouseAreaDebug.containsMouse ? Branding.SidebarTextCurrent : Branding.SidebarBackground );
font.pointSize : 8
}
onClicked: debug.toggle()
}
}
Item {
Layout.fillHeight: true;
}
Rectangle {
id: backArea
Layout.fillWidth: true;
Layout.preferredHeight: parent.height / 7;
color: mouseBack.containsMouse ? "#2C3E50" : "#1E2935";
enabled: ViewManager.backEnabled;
visible: ViewManager.backAndNextVisible;
MouseArea {
id: mouseBack
anchors.fill: parent;
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
Text {
anchors.centerIn: parent
text: qsTr("Back")
color: Branding.styleString( !backArea.enabled ? Branding.SidebarBackground : (mouseBack.containsMouse ? Branding.SidebarTextCurrent : Branding.SidebarText ));
font.pointSize : 8
}
Image {
source: "pan-start-symbolic.svg"
anchors.centerIn: parent
anchors.verticalCenterOffset : 18
fillMode: Image.PreserveAspectFit
height: 32
opacity: backArea.enabled ? 1 : 0.2
}
onClicked: { ViewManager.back(); }
}
}
Rectangle {
id: nextArea
Layout.preferredHeight: parent.height / 7;
Layout.fillWidth: true
color: mouseNext.containsMouse ? "#2C3E50" : "#1E2935";
enabled: ViewManager.nextEnabled;
visible: ViewManager.backAndNextVisible;
MouseArea {
id: mouseNext
anchors.fill: parent;
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
Text {
anchors.centerIn: parent
text: qsTr("Next")
color: Branding.styleString( !nextArea.enabled ? Branding.SidebarBackground : (mouseNext.containsMouse ? Branding.SidebarTextCurrent : Branding.SidebarText ));
font.pointSize : 8
}
Image {
source: "pan-end-symbolic.svg"
anchors.centerIn: parent
anchors.verticalCenterOffset : 18
fillMode: Image.PreserveAspectFit
height: 32
opacity: nextArea.enabled ? 1 : 0.2
}
onClicked: { ViewManager.next(); }
}
}
Rectangle {
id: cancelArea
height: parent.height / 7;
Layout.fillWidth: true;
Layout.bottomMargin: 48;
color: mouseCancel.containsMouse ? "#2C3E50" : "#1E2935";
enabled: ViewManager.quitEnabled;
visible: ViewManager.quitVisible && ( ViewManager.currentStepIndex < ViewManager.rowCount()-1);
ToolTip {
width: 59
visible: mouseCancel.containsMouse
timeout: 5000
delay: 1000
text: ViewManager.quitTooltip;
}
MouseArea {
id: mouseCancel
anchors.fill: parent;
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
Text {
anchors.centerIn: parent
text: qsTr("Cancel")
color: Branding.styleString( !cancelArea.enabled ? Branding.SidebarBackground : (mouseCancel.containsMouse ? Branding.SidebarTextCurrent : Branding.SidebarText ));
font.pointSize : 8
}
Image {
source: "draw-rectangle.svg"
anchors.centerIn: parent
anchors.verticalCenterOffset : 18
fillMode: Image.PreserveAspectFit
height: 9
opacity: cancelArea.enabled ? 1 : 0.2
}
onClicked: { ViewManager.quit(); }
}
}
}
}
@@ -0,0 +1,62 @@
import io.calamares.ui 1.0
import io.calamares.core 1.0
import QtQuick 2.3
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.15
Rectangle {
id: sideBar;
color: Branding.styleString( Branding.SidebarBackground );
height: 48;
width: parent.width
RowLayout {
anchors.fill: parent;
spacing: 0;
Item {
Layout.fillHeight: true;
}
Repeater {
model: ViewManager
Rectangle {
Layout.leftMargin: 0;
Layout.fillWidth: true;
Layout.alignment: Qt.AlignTop;
height: 42;
radius: 0;
color: Branding.styleString( index == ViewManager.currentStepIndex ? Branding.SidebarBackgroundCurrent : Branding.SidebarBackground );
Text {
anchors.verticalCenter: parent.verticalCenter;
anchors.horizontalCenter: parent.horizontalCenter
x: parent.x + 12;
color: Branding.styleString( index == ViewManager.currentStepIndex ? Branding.SidebarTextCurrent : Branding.SidebarText );
text: qsTr(display);
font.pointSize : index == ViewManager.currentStepIndex ? 10 : 9
}
Rectangle {
height: 2
width: 800
anchors.bottom: parent.bottom;
border.color: Branding.styleString(ViewManager.currentStepIndex === index ? Branding.SidebarTextCurrent : (ViewManager.currentStepIndex >= index ? Branding.SidebarTextCurrent : Branding.SidebarBackgroundCurrent))
border.width: 3
Image {
source: "pan-up-symbolic.svg"
id: image
anchors.verticalCenter: parent.verticalCenter;
anchors.verticalCenterOffset : -3
x: parent.x + 35;
fillMode: Image.PreserveAspectFit
height: 32
visible: index == ViewManager.currentStepIndex ? true : false
}
}
}
}
}
}
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
<path d="m2 4h18v14h-18z" fill="#4A9EFF" transform="translate(0,2)"/>
</svg>

After

Width:  |  Height:  |  Size: 139 B

@@ -0,0 +1,4 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="16" version="1.1" width="16" xmlns="http://www.w3.org/2000/svg">
<path d="m 6,3 5,5 -5,5 z" fill="#4A9EFF"/>
</svg>

After

Width:  |  Height:  |  Size: 185 B

@@ -0,0 +1,4 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="16" version="1.1" width="16" xmlns="http://www.w3.org/2000/svg">
<path d="m 10,3 -5,5 5,5 z" fill="#4A9EFF"/>
</svg>

After

Width:  |  Height:  |  Size: 186 B

@@ -0,0 +1,4 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="16" version="1.1" width="16" xmlns="http://www.w3.org/2000/svg">
<path d="m 8,2 -5,5 10,0 z" fill="#4A9EFF"/>
</svg>

After

Width:  |  Height:  |  Size: 186 B

@@ -1,230 +1,118 @@
/* Antergos NeXT Calamares slideshow */
import QtQuick 2.0;
import calamares.slideshow 1.0;
import QtQuick 2.15;
Presentation
{
id: presentation
Item {
id: root
function onActivate(){
console.log("Slideshow) activated");
timer.restart();
slider.reset();
img.reset();
}
function onLeave(){
console.log("Slideshow) deactivated");
}
width: 940
height: 600
Timer {
interval: 8000
running: presentation.activatedInCalamares
id: timer
interval: 10000
running: true
repeat: true
onTriggered: presentation.goToNextSlide()
onTriggered: slider.currentSlideIndex++,img.currentSlideIndex++
}
Slide {
MouseArea {
anchors.fill: parent
onClicked: {
timer.restart();
slider.currentSlideIndex++;
img.currentSlideIndex++;
}
}
Item {
anchors.fill: parent
Image {
id: logo
source: "antergos-logo.png"
width: 320
height: 92
fillMode: Image.PreserveAspectFit
id: background
anchors {
centerIn: parent
verticalCenterOffset: -40
fill: parent
margins: -10
bottomMargin: 0
}
source: "background.jpg"
sourceSize.width: width
sourceSize.height: height
}
Text {
anchors {
top: logo.bottom
topMargin: 20
horizontalCenter: parent.horizontalCenter
}
text: "Welcome to Antergos NeXT"
font.pixelSize: 22
font.bold: true
color: "#4A9EFF"
}
Text {
anchors {
top: parent.verticalCenter
topMargin: 40
horizontalCenter: parent.horizontalCenter
}
text: "A modern Arch Linux experience"
font.pixelSize: 14
color: "#7F8C8D"
}
}
Slide {
anchors.fill: parent
Slider {
id: slider
height: 50
Rectangle {
anchors.fill: parent
color: "#F0F4F8"
Text {
anchors {
top: parent.top
topMargin: 30
horizontalCenter: parent.horizontalCenter
}
text: "Built on EndeavourOS"
font.pixelSize: 20
font.bold: true
color: "#2C3E50"
}
Column {
anchors {
centerIn: parent
verticalCenterOffset: 10
}
spacing: 12
Text { text: "• EndeavourOS base — stable, rolling" ; font.pixelSize: 13 ; color: "#34495E" }
Text { text: "• dracut initramfs — fast, reliable" ; font.pixelSize: 13 ; color: "#34495E" }
Text { text: "• systemd — modern init system" ; font.pixelSize: 13 ; color: "#34495E" }
Text { text: "• Latest Linux kernel and drivers" ; font.pixelSize: 13 ; color: "#34495E" }
Text { text: "• Arch User Repository (AUR) access" ; font.pixelSize: 13 ; color: "#34495E" }
slides: [
Dia {
title: qsTr("Welcome to Antergos NeXT")
body: qsTr("A modern Arch Linux experience built on EndeavourOS")
footer: qsTr("Choose your preferred desktop environment during setup")
},
Dia {
title: qsTr("Desktop Environments")
body: qsTr("Select from KDE Plasma, GNOME, Xfce, Budgie, Cinnamon, MATE, LXQt, or i3/Sway")
footer: qsTr("Each desktop is fully configured and ready to use")
},
Dia {
title: qsTr("Antergos Tools")
body: qsTr("Welcome app for system configuration, Calamares installer with offline and online modes, and HAL package manager")
footer: qsTr("Full access to Arch Linux repositories and the AUR")
},
Dia {
title: qsTr("Open Source")
body: qsTr("Antergos NeXT is free and open source software built by the community")
footer: qsTr("Contribute on GitHub — Antergos-NeXT")
},
Dia {
title: qsTr("Almost Done")
body: qsTr("Your system is being configured with your selected options")
footer: qsTr("Reboot and enjoy Antergos NeXT")
}
]
anchors {
centerIn: parent
horizontalCenterOffset: 50
verticalCenterOffset: 10
}
}
Slider {
id: img
height: 50
Slide {
anchors.fill: parent
Text {
anchors {
top: parent.top
topMargin: 30
horizontalCenter: parent.horizontalCenter
slides: [
Dia {
image: "antergos-logo.png"
},
Dia {
image: "antergos-logo.png"
},
Dia {
image: "antergos-logo.png"
},
Dia {
image: "antergos-logo.png"
},
Dia {
image: "antergos-logo.png"
}
text: "Desktop Environments"
font.pixelSize: 20
font.bold: true
color: "#2C3E50"
}
Column {
anchors {
centerIn: parent
verticalCenterOffset: 10
}
spacing: 12
Text { text: "• KDE Plasma — full-featured, customizable" ; font.pixelSize: 13 ; color: "#34495E" }
Text { text: "• GNOME — modern, streamlined" ; font.pixelSize: 13 ; color: "#34495E" }
Text { text: "• Xfce — lightweight, classic" ; font.pixelSize: 13 ; color: "#34495E" }
Text { text: "• Budgie — elegant, simple" ; font.pixelSize: 13 ; color: "#34495E" }
Text { text: "• i3/ Sway — tiling window managers" ; font.pixelSize: 13 ; color: "#34495E" }
]
anchors {
centerIn: parent
horizontalCenterOffset: -400
verticalCenterOffset: -100
}
}
Slide {
anchors.fill: parent
Rectangle {
anchors.fill: parent
color: "#F0F4F8"
Text {
anchors {
top: parent.top
topMargin: 30
horizontalCenter: parent.horizontalCenter
}
text: "Antergos Tools"
font.pixelSize: 20
font.bold: true
color: "#2C3E50"
}
Column {
anchors {
centerIn: parent
verticalCenterOffset: 10
}
spacing: 12
Text { text: "• Welcome app — system info & quick config" ; font.pixelSize: 13 ; color: "#34495E" }
Text { text: "• Calamares installer — easy setup" ; font.pixelSize: 13 ; color: "#34495E" }
Text { text: "• Calamares — easy setup with offline & online modes" ; font.pixelSize: 13 ; color: "#34495E" }
Text { text: "• Pacman + AUR helper — full package access" ; font.pixelSize: 13 ; color: "#34495E" }
Text { text: "• Online documentation and community" ; font.pixelSize: 13 ; color: "#34495E" }
}
}
}
Slide {
anchors.fill: parent
Text {
anchors {
top: parent.top
topMargin: 60
horizontalCenter: parent.horizontalCenter
}
text: "Finishing Installation..."
font.pixelSize: 22
font.bold: true
color: "#4A9EFF"
}
Image {
source: "antergos-icon.png"
width: 96
height: 96
fillMode: Image.PreserveAspectFit
anchors {
centerIn: parent
verticalCenterOffset: 10
}
}
Text {
anchors {
bottom: parent.bottom
bottomMargin: 40
horizontalCenter: parent.horizontalCenter
}
text: "Almost there — your system is being configured"
font.pixelSize: 13
color: "#7F8C8D"
}
}
Slide {
anchors.fill: parent
Rectangle {
anchors.fill: parent
color: "#20252B"
Text {
anchors {
centerIn: parent
verticalCenterOffset: -30
}
text: "Thank You!"
font.pixelSize: 28
font.bold: true
color: "#4A9EFF"
}
Text {
anchors {
top: parent.verticalCenter
topMargin: 10
horizontalCenter: parent.horizontalCenter
}
text: "Antergos NeXT is ready.<br/>Reboot and enjoy!"
font.pixelSize: 14
color: "#C8D6E5"
horizontalAlignment: Text.Center
}
}
}
function onActivate() {
presentation.currentSlide = 0
}
function onLeave() {}
}
@@ -35,23 +35,6 @@ QPushButton:disabled {
background-color: #BDC3C7;
color: #95A5A6;
}
QPushButton#sidebarButton {
background-color: transparent;
color: #C8D6E5;
text-align: left;
padding: 10px 14px;
border: none;
border-radius: 0;
font-size: 10pt;
}
QPushButton#sidebarButton:hover {
background-color: #2C3E50;
}
QPushButton#sidebarButton:checked {
background-color: #4A9EFF;
color: white;
font-weight: bold;
}
QComboBox {
padding: 5px 10px;
border: 1px solid #D5D8DC;