1
Fork 0
mirror of https://github.com/redstrate/Astra.git synced 2025-04-23 21:07:45 +00:00
astra/launcher/ui/Pages/NewsPage.qml
2023-09-16 17:32:38 -04:00

172 lines
No EOL
5.4 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.formcard 1.0 as FormCard
import Qt5Compat.GraphicalEffects 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
hoverEnabled: true
onClicked: applicationWindow().openUrl(LauncherCore.headline.banners[page.currentBannerIndex].link)
onEntered: applicationWindow().hoverLinkIndicator.text = LauncherCore.headline.banners[page.currentBannerIndex].link
onExited: applicationWindow().hoverLinkIndicator.text = ""
}
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
}
}
}
}
FormCard.FormHeader {
title: i18n("News")
Layout.fillWidth: true
maximumWidth: layout.maximumWidth
}
FormCard.FormCard {
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
maximumWidth: layout.maximumWidth
visible: LauncherCore.headline !== null
Repeater {
model: LauncherCore.headline !== null ? LauncherCore.headline.news : undefined
FormCard.FormButtonDelegate {
text: modelData.title
description: Qt.formatDate(modelData.date)
onClicked: applicationWindow().openUrl(modelData.url)
onHoveredChanged: {
if (hovered) {
applicationWindow().hoverLinkIndicator.text = modelData.url;
} else {
applicationWindow().hoverLinkIndicator.text = "";
}
}
}
}
FormCard.FormTextDelegate {
description: i18n("No news.")
visible: LauncherCore.headline !== null ? LauncherCore.headline.failedToLoad : false
}
}
FormCard.FormHeader {
title: i18n("Topics")
Layout.fillWidth: true
maximumWidth: layout.maximumWidth
}
FormCard.FormCard {
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
maximumWidth: layout.maximumWidth
visible: LauncherCore.headline !== null
Repeater {
model: LauncherCore.headline !== null ? LauncherCore.headline.topics : undefined
FormCard.FormButtonDelegate {
text: modelData.title
description: Qt.formatDate(modelData.date)
hoverEnabled: true
onClicked: applicationWindow().openUrl(modelData.url)
onHoveredChanged: {
if (hovered) {
applicationWindow().hoverLinkIndicator.text = modelData.url;
} else {
applicationWindow().hoverLinkIndicator.text = "";
}
}
}
}
FormCard.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
}
}