// 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 . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 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(); } } } } } }