1
Fork 0
mirror of https://github.com/redstrate/Astra.git synced 2025-04-22 20:47:45 +00:00
astra/launcher/ui/Pages/NewsPage.qml
Joshua Goins 18d416011a Make news page loading more obvious, and show if there's no news
If there's no news available (e.g. the server is down, or no internet
connection) make it look a little bit nicer.
2023-08-18 21:48:46 -04:00

158 lines
No EOL
4.7 KiB
QML

// SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
// SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick 2.15
import QtQuick.Window 2.15
import org.kde.kirigami 2.20 as Kirigami
import QtQuick.Controls 2.15 as Controls
import QtQuick.Layouts 1.15
import org.kde.kirigamiaddons.labs.mobileform 0.1 as MobileForm
import QtGraphicalEffects 1.0
import zone.xiv.astra 1.0
Controls.Control {
id: page
Component.onCompleted: LauncherCore.refreshNews()
property int currentBannerIndex: 0
property int numBannerImages: 0
Connections {
target: LauncherCore
function onNewsChanged() {
page.currentBannerIndex = 0
page.numBannerImages = LauncherCore.headline.banners.length
}
}
Timer {
interval: 10000
running: true
repeat: true
onTriggered: {
if (page.currentBannerIndex + 1 === page.numBannerImages) {
page.currentBannerIndex = 0
} else {
page.currentBannerIndex++
}
}
}
contentItem: ColumnLayout {
id: layout
readonly property real maximumWidth: Kirigami.Units.gridUnit * 50
Image {
id: bannerImage
readonly property real aspectRatio: sourceSize.height / sourceSize.width
Layout.maximumWidth: layout.maximumWidth
Layout.fillWidth: true
Layout.preferredHeight: aspectRatio * width
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
source: LauncherCore.headline !== null ? LauncherCore.headline.banners[page.currentBannerIndex].bannerImage : ""
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: applicationWindow().openUrl(LauncherCore.headline.banners[page.currentBannerIndex].link)
}
layer.enabled: true
layer.effect: OpacityMask {
maskSource: Item {
width: bannerImage.width
height: bannerImage.height
Rectangle {
anchors.centerIn: parent
width: bannerImage.width
height: bannerImage.height
radius: Kirigami.Units.smallSpacing
}
}
}
}
MobileForm.FormCard {
Layout.topMargin: Kirigami.Units.largeSpacing
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
maximumWidth: layout.maximumWidth
visible: LauncherCore.headline !== null
contentItem: ColumnLayout {
spacing: 0
MobileForm.FormCardHeader {
title: i18n("News")
}
Repeater {
model: LauncherCore.headline !== null ? LauncherCore.headline.news : undefined
MobileForm.FormButtonDelegate {
text: modelData.title
description: Qt.formatDate(modelData.date)
onClicked: applicationWindow().openUrl(modelData.url)
}
}
MobileForm.FormTextDelegate {
description: i18n("No news.")
visible: LauncherCore.headline !== null ? LauncherCore.headline.failedToLoad : false
}
}
}
MobileForm.FormCard {
Layout.topMargin: Kirigami.Units.largeSpacing
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
maximumWidth: layout.maximumWidth
visible: LauncherCore.headline !== null
contentItem: ColumnLayout {
spacing: 0
MobileForm.FormCardHeader {
title: i18n("Topics")
}
Repeater {
model: LauncherCore.headline !== null ? LauncherCore.headline.topics : undefined
MobileForm.FormButtonDelegate {
text: modelData.title
description: Qt.formatDate(modelData.date)
onClicked: applicationWindow().openUrl(modelData.url)
}
}
MobileForm.FormTextDelegate {
description: i18n("No topics.")
visible: LauncherCore.headline !== null ? LauncherCore.headline.failedToLoad : false
}
}
}
Item {
Layout.fillHeight: true
}
}
Kirigami.LoadingPlaceholder {
anchors.centerIn: parent
visible: LauncherCore.headline === null
}
}