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;
}