summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAapo Rotonen <aapo.rotonen@qt.io>2024-02-05 14:25:07 +0200
committerAapo Rotonen <aapo.rotonen@qt.io>2024-03-22 07:41:55 +0000
commit4ff817db04b6e9ce7691b2c1ed54568441d32519 (patch)
treecf61a0ef1e7cf55b6e9bc05ebbc607ecb2af7ef6
parent28042f4e7cb7ade04e032499e77d4fa49c679fa8 (diff)
Add QSR version to startupscreenHEADdev
Add own version of QSR screen to startupscreen. It has functionality that will start the qsrdemo in the target device. Task-number: QSR-2290 Change-Id: I9d931553cfe99598c97d6b17c2d6a09d17ad457d Reviewed-by: Samuli Piippo <samuli.piippo@qt.io> Reviewed-by: Jussi Witick <jussi.witick@qt.io>
-rw-r--r--startupscreen/CMakeLists.txt24
-rw-r--r--startupscreen/QSR_MainView.qml249
-rw-r--r--startupscreen/assets/Application_Logo.pngbin0 -> 4470 bytes
-rw-r--r--startupscreen/assets/QSR_Logo.pngbin0 -> 4470 bytes
-rw-r--r--startupscreen/main.cpp9
-rw-r--r--startupscreen/qml.qrc2
-rw-r--r--startupscreen/settingsmanager.cpp24
-rw-r--r--startupscreen/settingsmanager.h1
8 files changed, 307 insertions, 2 deletions
diff --git a/startupscreen/CMakeLists.txt b/startupscreen/CMakeLists.txt
index 21d1fed..23e008d 100644
--- a/startupscreen/CMakeLists.txt
+++ b/startupscreen/CMakeLists.txt
@@ -11,6 +11,13 @@ set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
+# From build settings -> cmake -> variables -> set "QSR_BUILD = ON" to enable QSR Screen
+option(QSR_BUILD "Build with QSR" OFF)
+
+if(QSR_BUILD)
+ add_definitions(-DQSR)
+endif()
+
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Quick QuickControls2 REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Quick QuickControls2 REQUIRED)
@@ -21,6 +28,23 @@ add_executable(startupscreen
qml.qrc
)
+if(QSR_BUILD)
+ set_source_files_properties("QSR_MainView.qml"
+ PROPERTIES QT_RESOURCE_ALIAS "MainView.qml"
+ )
+ # Use QSR_MainView in QSR builds
+ set(QML_FILES "QSR_MainView.qml")
+else()
+ # For non-QSR builds, use the original MainView.qml
+ set(QML_FILES "MainView.qml")
+endif()
+
+# Add resources to the project
+qt_add_resources(startupscreen "mainview"
+ PREFIX "/"
+ FILES ${QML_FILES}
+)
+
target_compile_definitions(startupscreen
PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
target_link_libraries(startupscreen
diff --git a/startupscreen/QSR_MainView.qml b/startupscreen/QSR_MainView.qml
new file mode 100644
index 0000000..6cdf71f
--- /dev/null
+++ b/startupscreen/QSR_MainView.qml
@@ -0,0 +1,249 @@
+/****************************************************************************
+**
+** Copyright (C) 2024 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of Qt for Device Creation.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick
+import QtQuick.Controls
+import StartupScreen
+import backend 1.0
+
+Item {
+ id: root
+
+ property int textNormal: panel.height / 9
+ property int textLarge: panel.height / 7
+
+ Item {
+ id: panel
+ anchors.top: root.top
+ anchors.topMargin: height / 10
+ anchors.left: root.left
+ anchors.leftMargin: panel.width *.1
+ height: width / 2
+ width: root.width * 0.6
+
+ Text {
+ id: headerText_1
+ color: "#2cde85"
+ text: qsTr("Get Started with Qt Safe Renderer ")
+ anchors.top: panel.top
+ anchors.left: panel.left
+ font.pixelSize: textNormal * 1.2
+ font.family: "Titillium Web"
+ }
+
+ Text {
+ id: bodyText
+ color: "#ffffff"
+ text: qsTr("How to install demo application\nfrom Qt Creator?")
+ font.pixelSize: textNormal
+ font.family: "Titillium Web"
+ anchors.left: panel.left
+ anchors.top: headerText_1.bottom
+ anchors.topMargin: textNormal
+ wrapMode: Text.WordWrap
+ }
+
+ Text {
+ id: buttonLabel
+ color: "#2cde85"
+ text: qsTr("Click here to learn more!")
+ font.underline: true
+ anchors.left: panel.left
+ anchors.top: bodyText.bottom
+ anchors.topMargin: textLarge
+ font.pixelSize: textLarge
+ font.family: "Titillium Web"
+
+ MouseArea {
+ anchors.fill: parent
+ anchors.margins: -height * .5
+ onPressed: guide.visible = true
+ }
+ }
+ }
+
+ Item {
+ id: demoButtonAlignment
+ anchors.right: root.right
+ anchors.left: panel.right
+ anchors.top: panel.top
+ anchors.bottom: panel.bottom
+ }
+
+ Rectangle {
+ width: parent.width * 0.2
+ height: parent.height * 0.2
+ radius: height * 0.075
+ anchors.horizontalCenter: demoButtonAlignment.horizontalCenter
+ anchors.verticalCenter: panel.verticalCenter
+ color: "#2cde85"
+
+ MouseArea {
+ id: mouseArea
+ anchors.fill: parent
+ onPressed: parent.color = "#235866"
+ var target = "qsrdemo.target";
+ onReleased: {
+ parent.color = "#2cde85"
+ SettingsManager.runDemoMode(target)
+ }
+ }
+
+ Text {
+ text: "Start Demo"
+ font.pixelSize: height * 2
+ font.family: "Titillium Web"
+ anchors.centerIn: parent
+ color: "white"
+ }
+ }
+
+
+ // Button row
+ Row {
+ id: buttonRow
+ anchors.top: panel.bottom
+ anchors.horizontalCenter: panel.BottomLeft
+ spacing: buttonSize / 4
+ padding: buttonSize / 4
+ property var buttonSize: panel.height / 2
+
+ UsbButton {
+ id: usbButton
+ height: parent.buttonSize
+ width: height
+ available: SettingsManager.hasQdb
+ connected: ipAddress.text.indexOf("usb0") !== -1
+ onPressed: {
+ usbModeDialog.open()
+ }
+ }
+ WifiButton {
+ id: wifiButton
+ height: parent.buttonSize
+ width: height
+ visible: true
+ onPressed: {
+ loader.source = "qrc:/NetworkSettings/NetworkSettingsPage.qml"
+ }
+ }
+ }
+
+ // label and IP address
+ Text {
+ id: ipLabel
+ color: "grey"
+ text: qsTr("Networks:")
+ anchors.bottom: ipAddress.top
+ anchors.horizontalCenter: ipAddress.horizontalCenter
+ font.pixelSize: textNormal
+ font.family: "Titillium Web"
+ visible: ipAddress.text !== ""
+ }
+ Text {
+ id: ipAddress
+ color: "grey"
+ text: SettingsManager.networks
+ anchors.bottom: root.bottom
+ anchors.right: root.right
+ anchors.rightMargin: 5
+ font.pixelSize: textNormal
+ font.bold: true
+ font.family: "Titillium Web"
+
+ Timer {
+ interval: 3000
+ onTriggered: ipAddress.text = SettingsManager.networks
+ running: true
+ repeat: true
+ }
+ }
+
+ Loader {
+ id: loader
+ anchors.fill: parent
+ }
+
+ UsbModeDialog {
+ id: usbModeDialog
+ }
+
+ GuideView {
+ id: guide
+ visible: false
+ }
+
+ // base state = landscape
+ states: [
+ State {
+ name: "portrait"
+
+ PropertyChanges {
+ target: panel
+ width: root.width * 0.9
+ }
+ AnchorChanges {
+ target: panel
+ anchors.top: clock.bottom
+ }
+ AnchorChanges {
+ target: clock
+ anchors.top: root.top
+ anchors.horizontalCenter: root.horizontalCenter
+ anchors.verticalCenter: undefined
+ }
+ AnchorChanges {
+ target: buttonRow
+ anchors.horizontalCenter: undefined
+ anchors.left: root.left
+ }
+ }
+ ]
+}
diff --git a/startupscreen/assets/Application_Logo.png b/startupscreen/assets/Application_Logo.png
new file mode 100644
index 0000000..7f4f0a9
--- /dev/null
+++ b/startupscreen/assets/Application_Logo.png
Binary files differ
diff --git a/startupscreen/assets/QSR_Logo.png b/startupscreen/assets/QSR_Logo.png
new file mode 100644
index 0000000..7f4f0a9
--- /dev/null
+++ b/startupscreen/assets/QSR_Logo.png
Binary files differ
diff --git a/startupscreen/main.cpp b/startupscreen/main.cpp
index 9d8e371..77d3e02 100644
--- a/startupscreen/main.cpp
+++ b/startupscreen/main.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2020 The Qt Company Ltd.
+** Copyright (C) 2024 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of Qt for Device Creation.
@@ -63,11 +63,17 @@ int main(int argc, char *argv[])
app.setApplicationVersion(QLatin1String(qVersion()));
SettingsManager settingsManager;
+
qmlRegisterSingletonInstance("StartupScreen", 1, 0, "SettingsManager", &settingsManager);
QtButtonImageProvider imageProvider;
QQmlApplicationEngine engine;
+#ifdef QSR
+ if (app.windowIcon().isNull()) {
+ app.setWindowIcon(QIcon(":/assets/QSR_Logo.png"));
+ }
+#endif
engine.addImageProvider("QtButton", &imageProvider);
engine.addImportPath("qrc:/imports");
const QUrl url(QStringLiteral("qrc:/StartupScreen.qml"));
@@ -76,6 +82,7 @@ int main(int argc, char *argv[])
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
+
engine.load(url);
return app.exec();
diff --git a/startupscreen/qml.qrc b/startupscreen/qml.qrc
index 2b4023d..0b59285 100644
--- a/startupscreen/qml.qrc
+++ b/startupscreen/qml.qrc
@@ -2,7 +2,6 @@
<qresource prefix="/">
<file>AnalogClock.qml</file>
<file>GuideView.qml</file>
- <file>MainView.qml</file>
<file>RebootDialog.qml</file>
<file>SplashView.ui.qml</file>
<file>StartupScreen.qml</file>
@@ -38,5 +37,6 @@
<file>NetworkSettings/ViewSettings.qml</file>
<file>NetworkSettings/QtButton.qml</file>
<file>NetworkSettings/NetworkDelegate.qml</file>
+ <file>assets/QSR_Logo.png</file>
</qresource>
</RCC>
diff --git a/startupscreen/settingsmanager.cpp b/startupscreen/settingsmanager.cpp
index e732734..ddd964b 100644
--- a/startupscreen/settingsmanager.cpp
+++ b/startupscreen/settingsmanager.cpp
@@ -55,6 +55,7 @@
#include <QFile>
#include <QTemporaryFile>
#include <QNetworkInterface>
+#include <QProcess>
#include <sys/reboot.h>
#include <unistd.h>
@@ -161,3 +162,26 @@ QByteArray SettingsManager::guideText()
return QByteArrayLiteral("Guide not found");
}
}
+
+void SettingsManager::runDemoMode(const QString& target)
+{
+ QProcess process;
+ QString program = "systemctl";
+ QStringList arguments;
+
+ arguments << "start" << target;
+
+ process.start(program, arguments);
+ process.waitForFinished(-1);
+
+ if (process.exitStatus() == QProcess::NormalExit && process.exitCode() == 0) {
+ qInfo() << "Successfully started target: " << target;
+ } else {
+ qWarning() << "Command execution failed with exit code: " << process.exitCode() << " for target: " << target;
+ qWarning() << "Error message: " << process.errorString();
+ }
+}
+
+
+
+
diff --git a/startupscreen/settingsmanager.h b/startupscreen/settingsmanager.h
index fe254d7..6f524cf 100644
--- a/startupscreen/settingsmanager.h
+++ b/startupscreen/settingsmanager.h
@@ -70,6 +70,7 @@ public:
void setUsbMode(const QString &usbMode);
bool hasQdb();
Q_INVOKABLE void reboot();
+ Q_INVOKABLE void runDemoMode(const QString& target);
QString networks();
QByteArray guideText();