This repository has been archived on 2026-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
2025-12-05 13:40:20 +01:00

515 lines
20 KiB
QML

// SPDX-License-Identifier: GPL-3.0-or-later
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Copyright (C) 2013 - 2024, nymea GmbH
* Copyright (C) 2024 - 2025, chargebyte austria GmbH
*
* This file is part of nymea-app.
*
* nymea-app is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* nymea-app is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with nymea-app. If not, see <https://www.gnu.org/licenses/>.
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Nymea
Item {
id: root
implicitHeight: aboutColumn.implicitHeight
property alias title: titleLabel.text
property url githubLink
property bool showOpensourceLicenses: true
default property alias content: contentGrid.data
ColumnLayout {
id: aboutColumn
anchors { left: parent.left; right: parent.right; top: parent.top }
RowLayout {
Layout.fillWidth: true
Layout.margins: app.margins
spacing: app.margins
Image {
id: logo
Layout.preferredHeight: Style.iconSize * 2
Layout.preferredWidth: height
fillMode: Image.PreserveAspectFit
source: "qrc:/styles/%1/logo.svg".arg(styleController.currentStyle)
MouseArea {
anchors.fill: parent
property int clickCounter: 0
onClicked: {
clickCounter++;
if (clickCounter >= 10) {
settings.showHiddenOptions = !settings.showHiddenOptions
var dialog = Qt.createComponent(Qt.resolvedUrl("../components/NymeaDialog.qml"));
var text = settings.showHiddenOptions
? qsTr("Developer options are now enabled. If you have found this by accident, it is most likely not of any use for you. It will just enable some nerdy developer gibberish in the app. Tap the icon another 10 times to disable it again.")
: qsTr("Developer options are now disabled.")
var popup = dialog.createObject(app, {headerIcon: "qrc:/icons/dialog-warning-symbolic.svg", title: qsTr("Howdy cowboy!"), text: text})
popup.open();
clickCounter = 0;
}
}
}
}
Label {
id: titleLabel
font.pixelSize: app.largeFont
}
}
ThinDivider {}
GridLayout {
id: contentGrid
Layout.fillWidth: true
columns: Math.max(1, root.width / 300)
}
ThinDivider {}
Label {
Layout.fillWidth: true
Layout.topMargin: app.margins
Layout.leftMargin: app.margins
Layout.rightMargin: app.margins
wrapMode: Text.WordWrap
font.bold: true
text: "Copyright (C) %1 chargebyte austria GmbH".arg(new Date().getFullYear())
}
Label {
Layout.fillWidth: true
Layout.leftMargin: app.margins
Layout.rightMargin: app.margins
wrapMode: Text.WordWrap
text: qsTr("nymea is a registered trademark of chargebyte austria GmbH.")
}
Label {
Layout.fillWidth: true
Layout.leftMargin: app.margins
Layout.rightMargin: app.margins
wrapMode: Text.WordWrap
font.pixelSize: app.smallFont
text: qsTr("Licensed under the terms of the GNU General Public License, version 3. Please visit the GitHub page for source code and build instructions.")
}
ColumnLayout {
Layout.fillWidth: true
Repeater {
visible: Configuration.additionalImrintLinks !== null && Configuration.additionalImrintLinks.count > 0
model: Configuration.additionalImrintLinks
delegate: NymeaSwipeDelegate {
Layout.fillWidth: true
iconName: "qrc:/icons/stock_website.svg"
text: model.text
subText: model.subText
prominentSubText: false
wrapTexts: false
onClicked: { Qt.openUrlExternally(model.url) }
}
}
NymeaSwipeDelegate {
Layout.fillWidth: true
iconName: "qrc:/icons/stock_website.svg"
text: qsTr("chargebyte GmbH")
subText: "https://chargebyte.com"
prominentSubText: false
wrapTexts: false
onClicked: { Qt.openUrlExternally("https://chargebyte.com") }
}
NymeaSwipeDelegate {
Layout.fillWidth: true
iconName: "qrc:/icons/stock_website.svg"
text: qsTr("Visit the nymea project website")
subText: "https://nymea.io"
prominentSubText: false
wrapTexts: false
onClicked: { Qt.openUrlExternally("https://nymea.io") }
}
NymeaSwipeDelegate {
Layout.fillWidth: true
iconName: "qrc:/icons/stock_website.svg"
text: qsTr("Visit GitHub page")
subText: root.githubLink
prominentSubText: false
wrapTexts: false
onClicked: { Qt.openUrlExternally(root.githubLink) }
}
NymeaSwipeDelegate {
Layout.fillWidth: true
text: qsTr("View privacy policy")
iconName: "qrc:/icons/stock_website.svg"
subText: Configuration.privacyPolicyUrl
prominentSubText: false
wrapTexts: false
onClicked: Qt.openUrlExternally(Configuration.privacyPolicyUrl)
}
NymeaSwipeDelegate {
Layout.fillWidth: true
text: qsTr("Software license")
iconName: "qrc:/icons/stock_website.svg"
subText: "The nymea sofware license"
prominentSubText: false
wrapTexts: false
onClicked: { Qt.openUrlExternally("https://www.gnu.org/licenses/gpl-3.0-standalone.html") }
}
NymeaSwipeDelegate {
Layout.fillWidth: true
text: qsTr("Open Source Licenses")
iconName: "qrc:/icons/logs.svg"
subText: "List of all open source components used in this app."
prominentSubText: false
wrapTexts: false
visible: root.showOpensourceLicenses
onClicked: {
pageStack.push(licensesPageComponent)
}
}
}
}
Component {
id: licensesPageComponent
Page {
id: licensesPage
header: NymeaHeader {
text: qsTr("Additional software licenses")
onBackPressed: pageStack.pop()
}
Flickable {
anchors.fill: parent
contentHeight: licensesColumnLayout.implicitHeight + app.margins
clip: true
ColumnLayout {
id: licensesColumnLayout
anchors { left: parent.left; top: parent.top; right: parent.right }
LicenseInformationItem {
Layout.fillWidth: true
component: "QtCore"
description: qsTr("Qt core module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt/qtbase"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtGui"
description: qsTr("Qt gui module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt/qtbase"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtNetwork"
description: qsTr("Qt network module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt/qtbase"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtQML"
description: qsTr("Qt QML module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt/qtdeclarative"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtQuick"
description: qsTr("Qt Quick module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt/qtdeclarative"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtQuickControls"
description: qsTr("Qt Quick Controls module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt/qtdeclarative"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtQuickDialogs"
description: qsTr("Qt Quick Dialogs module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt/qtdeclarative"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtQuickLayouts"
description: qsTr("Qt Quick Layouts module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt/qtdeclarative"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "Qt5CoreComapitbility"
description: qsTr("Qt 5 compatibility module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "Qt Image Formats"
description: qsTr("Qt image formats module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtSvg"
description: qsTr("Qt SVG module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt/qtsvg"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtCharts"
description: qsTr("Qt charts module")
license: "GPLv3"
version: qtBuildVersion
url: "https://github.com/qt"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtWebsockets"
description: qsTr("Qt websockets module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt/qtwebsockets"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtBluetooth"
description: qsTr("Qt bluetooth module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt/qtconnectivity"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtNfc"
description: qsTr("Qt NFC module")
license: "LGPLv3"
version: qtBuildVersion
url: "https://github.com/qt/qtconnectivity"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "nymea-remoteproxy"
description: qsTr("Client library for remote connections")
license: "LGPLv3"
version: "1.14.0"
url: "https://github.com/nymea/nymea-remoteproxy"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "QtZeroConf"
description: qsTr("QtZeroConf library by Jonathan Bagg")
license: "LGPLv3"
version: ""
url: "https://github.com/jbagg/QtZeroConf"
platforms: "android,ios,linux,osx"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "FirebaseSDK";
description: qsTr("Firebase iOS SDK")
license: "Apache 2.0"
version: "18.1.0"
url: "https://github.com/firebase/firebase-ios-sdk"
platforms: "ios"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "FirebaseSDK";
description: qsTr("Firebase Android SDK")
license: "Apache 2.0"
version: "18.1.0"
url: "https://github.com/firebase/firebase-android-sdk"
platforms: "android"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "OpenSSL"
description: qsTr("OpenSSL libraries by Eric Young")
license: "OpenSSL"
version: sslLibraryVersion
platforms: "android,windows,linux"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "Suru icons"
description: qsTr("Suru icons by Ubuntu")
license: "CC-BY-SA-3.0"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "Ubuntu font"
description: qsTr("Ubuntu font by Ubuntu")
license: "CC-BY-SA-3.0"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "Oswald font"
description: qsTr("Oswald font by The Oswald Project")
license: "OFL"
platforms: "*"
}
LicenseInformationItem {
Layout.fillWidth: true
component: "Material Icons"
description: qsTr("Google fonts and material icons")
license: "Apache 2.0"
url: "https://fonts.google.com/icons"
platforms: "*"
}
// Repeater {
// model: root.additionalLicenses
// delegate: NymeaSwipeDelegate {
// Layout.fillWidth: true
// text: model.component
// subText: model.description
// prominentSubText: false
// visible: model.platforms === "*" || model.platforms.indexOf(Qt.platform.os) >= 0
// onClicked: {
// pageStack.push(licenseTextComponent, {license: model.license})
// }
// }
// }
}
}
}
}
Component {
id: licenseTextComponent
Page {
id: licenseTextPage
header: NymeaHeader {
text: parent.license
onBackPressed: pageStack.pop()
}
property string license
Flickable {
anchors.fill: parent
contentHeight: licenseText.implicitHeight
clip: true
ScrollBar.vertical: ScrollBar {}
TextArea {
id: licenseText
wrapMode: Text.WordWrap
font.pixelSize: app.smallFont
anchors { left: parent.left; right: parent.right; margins: app.margins }
readOnly: true
Component.onCompleted: {
var xhr = new XMLHttpRequest;
xhr.open("GET", "../../LICENSE." + licenseTextPage.license);
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.DONE) {
text = xhr.responseText
}
};
xhr.send();
}
}
}
}
}
}