C
Touch: Safe Touch
// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial // This file is part of the Qt Safe Renderer module #include <QtSafeRenderer/qsafelayoutresourcereader.h> #include <QtSafeRenderer/statemanager.h> #include <QtSafeEventHandlerAdaptation/eventhandler.h> #include <QtSafeRenderer/qsafechecksum.h> #include <QtSafeGraphicsAdaptation/safewindow.h> #if defined(HOST_BUILD) #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQmlContext> #include <QIcon> #endif #if defined(USE_OUTPUTVERIFIER) #include <outputverifier.h> #endif class CustomEventFilter : public SafeRenderer::QSafeEventFilter { public: CustomEventFilter(SafeRenderer::EventHandler* eventHandler) : m_eventHandlerPtr(eventHandler) {} void handleTouch(const quint32 itemId, const bool isPressed) override { SafeRenderer::QSafeEventChangeState stateChange; stateChange.setItemId(itemId); if (isPressed) { stateChange.setStateId(SafeRenderer::qsafe_hash_string("pressed")); } else { stateChange.setStateId(SafeRenderer::qsafe_hash_string("default")); } m_eventHandlerPtr->processEvent(stateChange); } private: SafeRenderer::EventHandler *m_eventHandlerPtr = nullptr; }; int main(int argc, char **argv) { #ifdef HOST_BUILD // In host build when using QtGUI, we need to initialize QApplication before SafeWindow. QGuiApplication app(argc, argv); #ifdef __linux__ app.setWindowIcon(QIcon(":/Application_Logo.png")); #endif #endif static SafeRenderer::QSafeLayoutResourceReader layout; layout.readLayout("/layoutData/main/main.srl"); #ifdef USE_OUTPUTVERIFIER static SafeRenderer::OutputVerifier outputVerifier; SafeRenderer::SafeWindow telltaleWindow(layout.size(), SafeRenderer::QSafePoint(0, 0), outputVerifier); #else SafeRenderer::SafeWindow telltaleWindow(layout.size(), SafeRenderer::QSafePoint(0, 0)); #endif SafeRenderer::StateManager stateManager(telltaleWindow, layout); telltaleWindow.requestUpdate(); // Request is required because eventHandler is not running yet. #ifdef USE_OUTPUTVERIFIER SafeRenderer::EventHandler msgHandler(stateManager, telltaleWindow, outputVerifier); #else SafeRenderer::EventHandler msgHandler(stateManager, telltaleWindow); #endif #ifdef HOST_BUILD // Mixing the Qt and Qt Safe Renderer here is done to demonstrate the integration of both frameworks. // This setup allows developers to test, visualize, and verify that the Safe Renderer output is valid and correct alongside the standard Qt UI components. // Note: This approach is intended for demonstration purposes only and should not be used in production environments. QQmlApplicationEngine engine; const QUrl url(QStringLiteral("qrc:/main.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, qApp, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) qDebug() << "Failed to start the main.qml"; }, Qt::QueuedConnection); engine.addImportPath(":/imports"); engine.load(url); #endif CustomEventFilter eventFilter(&msgHandler); msgHandler.installSafeEventFilter(&eventFilter); msgHandler.handleEvents(); return 0; }