# HG changeset patch # User unC0Rr # Date 1738686715 -3600 # Node ID 8da5a118120bab0ee09884b1a471e8bec20175d2 # Parent ee8b894272d0ff367b475d7cfb07b7ab2d8686e1 Modernize approach for building qmlfrontend diff -r ee8b894272d0 -r 8da5a118120b qmlfrontend/CMakeLists.txt --- a/qmlfrontend/CMakeLists.txt Tue Feb 04 15:53:16 2025 +0100 +++ b/qmlfrontend/CMakeLists.txt Tue Feb 04 17:31:55 2025 +0100 @@ -11,7 +11,16 @@ find_package(Qt6 COMPONENTS Core Quick REQUIRED) -add_executable(${PROJECT_NAME} "main.cpp" "qml.qrc" +qt6_add_executable(${PROJECT_NAME} + "main.cpp" + "qml.qrc" +) + +qt6_add_qml_module(${PROJECT_NAME} + VERSION 1.0 + URI "Hedgewars" + + SOURCES "hwengine.cpp" "hwengine.h" "game_config.cpp" "game_config.h" "game_view.cpp" "game_view.h" @@ -23,6 +32,11 @@ "net_session.cpp" "net_session.h" "players_model.cpp" "players_model.h" "rooms_model.cpp" "rooms_model.h" - ) +) -target_link_libraries(${PROJECT_NAME} Qt6::Core Qt6::Network Qt6::Quick) +target_link_libraries(${PROJECT_NAME} + PRIVATE + Qt6::Core + Qt6::Network + Qt6::Quick +) diff -r ee8b894272d0 -r 8da5a118120b qmlfrontend/Page1.qml --- a/qmlfrontend/Page1.qml Tue Feb 04 15:53:16 2025 +0100 +++ b/qmlfrontend/Page1.qml Tue Feb 04 17:31:55 2025 +0100 @@ -1,25 +1,8 @@ import QtQuick -import Hedgewars.Engine 1.0 +import Hedgewars 1.0 Page1Form { property HWEngine hwEngine - property var keyBindings: ({ - "long": { - [Qt.Key_Space]: Engine.Attack, - [Qt.Key_Up]: Engine.ArrowUp, - [Qt.Key_Right]: Engine.ArrowRight, - [Qt.Key_Down]: Engine.ArrowDown, - [Qt.Key_Left]: Engine.ArrowLeft, - [Qt.Key_Shift]: Engine.Precision - }, - "simple": { - [Qt.Key_Tab]: Engine.SwitchHedgehog, - [Qt.Key_Enter]: Engine.LongJump, - [Qt.Key_Backspace]: Engine.HighJump, - [Qt.Key_Y]: Engine.Accept, - [Qt.Key_N]: Engine.Deny - } - }) property NetSession netSession focus: true @@ -27,32 +10,7 @@ Component.onCompleted: { hwEngine = hwEngineComponent.createObject(); } - Keys.onPressed: event => { - if (event.isAutoRepeat) { - return; - } - let action = keyBindings["simple"][event.key]; - if (action !== undefined) { - gameView.engineInstance.simpleEvent(action); - event.accepted = true; - return; - } - action = keyBindings["long"][event.key]; - if (action !== undefined) { - gameView.engineInstance.longEvent(action, Engine.Set); - event.accepted = true; - } - } - Keys.onReleased: event => { - if (event.isAutoRepeat) { - return; - } - const action = keyBindings["long"][event.key]; - if (action !== undefined) { - gameView.engineInstance.longEvent(action, Engine.Unset); - event.accepted = true; - } - } + netButton.onClicked: { netSession = netSessionComponent.createObject(); netSession.open(); diff -r ee8b894272d0 -r 8da5a118120b qmlfrontend/Page1Form.ui.qml --- a/qmlfrontend/Page1Form.ui.qml Tue Feb 04 15:53:16 2025 +0100 +++ b/qmlfrontend/Page1Form.ui.qml Tue Feb 04 17:31:55 2025 +0100 @@ -2,7 +2,7 @@ import QtQuick.Controls import QtQuick.Layouts -import Hedgewars.Engine 1.0 +import Hedgewars 1.0 Item { id: element diff -r ee8b894272d0 -r 8da5a118120b qmlfrontend/engine_instance.h --- a/qmlfrontend/engine_instance.h Tue Feb 04 15:53:16 2025 +0100 +++ b/qmlfrontend/engine_instance.h Tue Feb 04 17:31:55 2025 +0100 @@ -26,10 +26,10 @@ bool isValid() const; - signals: + Q_SIGNALS: void isValidChanged(bool isValid); - public slots: + public Q_SLOTS: void advance(quint32 ticks); void moveCamera(const QPoint& delta); void simpleEvent(Engine::SimpleEventType event_type); diff -r ee8b894272d0 -r 8da5a118120b qmlfrontend/engine_interface.h --- a/qmlfrontend/engine_interface.h Tue Feb 04 15:53:16 2025 +0100 +++ b/qmlfrontend/engine_interface.h Tue Feb 04 17:31:55 2025 +0100 @@ -53,7 +53,7 @@ using PositionedEventType = hwengine::PositionedEventType; */ -// NOTE: have to copy these to be able to register then in Qt meta object system +// NOTE: have to copy these to be able to register them in Qt meta object system enum class LongEventState { Set, Unset, diff -r ee8b894272d0 -r 8da5a118120b qmlfrontend/game_view.h --- a/qmlfrontend/game_view.h Tue Feb 04 15:53:16 2025 +0100 +++ b/qmlfrontend/game_view.h Tue Feb 04 17:31:55 2025 +0100 @@ -4,12 +4,15 @@ #include #include #include +#include #include "engine_instance.h" class GameView : public QQuickFramebufferObject { Q_OBJECT + QML_ELEMENT + Q_PROPERTY(EngineInstance* engineInstance READ engineInstance WRITE setEngineInstance NOTIFY engineInstanceChanged) diff -r ee8b894272d0 -r 8da5a118120b qmlfrontend/hwengine.h --- a/qmlfrontend/hwengine.h Tue Feb 04 15:53:16 2025 +0100 +++ b/qmlfrontend/hwengine.h Tue Feb 04 17:31:55 2025 +0100 @@ -3,6 +3,7 @@ #include #include +#include #include "game_config.h" #include "preview_acceptor.h" @@ -13,6 +14,8 @@ class HWEngine : public QObject { Q_OBJECT + QML_ELEMENT + Q_PROPERTY(int previewHedgehogsCount READ previewHedgehogsCount NOTIFY previewHedgehogsCountChanged) Q_PROPERTY(PreviewAcceptor* previewAcceptor READ previewAcceptor WRITE diff -r ee8b894272d0 -r 8da5a118120b qmlfrontend/main.cpp --- a/qmlfrontend/main.cpp Tue Feb 04 15:53:16 2025 +0100 +++ b/qmlfrontend/main.cpp Tue Feb 04 17:31:55 2025 +0100 @@ -3,46 +3,34 @@ #include #include -#include "engine_interface.h" -#include "game_view.h" -#include "hwengine.h" -#include "net_session.h" -#include "preview_acceptor.h" - -static QObject* previewacceptor_singletontype_provider( - QQmlEngine* engine, QJSEngine* scriptEngine) { - Q_UNUSED(scriptEngine) - - PreviewAcceptor* acceptor = new PreviewAcceptor(engine); - return acceptor; -} - int main(int argc, char* argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; - - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); + /* + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); - qmlRegisterSingletonType( - "Hedgewars.Engine", 1, 0, "PreviewAcceptor", - previewacceptor_singletontype_provider); - qmlRegisterType("Hedgewars.Engine", 1, 0, "HWEngine"); - qmlRegisterType("Hedgewars.Engine", 1, 0, "GameView"); - qmlRegisterType("Hedgewars.Engine", 1, 0, "NetSession"); - qmlRegisterUncreatableType( - "Hedgewars.Engine", 1, 0, "EngineInstance", - QStringLiteral("Create by HWEngine run methods")); + qmlRegisterSingletonType( + "Hedgewars.Engine", 1, 0, "PreviewAcceptor", + previewacceptor_singletontype_provider); + qmlRegisterType("Hedgewars.Engine", 1, 0, "HWEngine"); + qmlRegisterType("Hedgewars.Engine", 1, 0, "GameView"); + qmlRegisterType("Hedgewars.Engine", 1, 0, "NetSession"); + qmlRegisterUncreatableType( + "Hedgewars.Engine", 1, 0, "EngineInstance", + QStringLiteral("Create by HWEngine run methods")); - qmlRegisterUncreatableMetaObject(Engine::staticMetaObject, "Hedgewars.Engine", - 1, 0, "Engine", - QStringLiteral("Namespace: only enums")); - + qmlRegisterUncreatableMetaObject(Engine::staticMetaObject, + "Hedgewars.Engine", 1, 0, "Engine", QStringLiteral("Namespace: only + enums")); + */ engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); - if (engine.rootObjects().isEmpty()) return -1; + if (engine.rootObjects().isEmpty()) { + return -1; + } return app.exec(); } diff -r ee8b894272d0 -r 8da5a118120b qmlfrontend/net_session.h --- a/qmlfrontend/net_session.h Tue Feb 04 15:53:16 2025 +0100 +++ b/qmlfrontend/net_session.h Tue Feb 04 17:31:55 2025 +0100 @@ -5,12 +5,15 @@ #include #include #include +#include class PlayersListModel; class RoomsListModel; class NetSession : public QObject { Q_OBJECT + QML_ELEMENT + const int cMinServerVersion = 3; const int cProtocolVersion = 60; @@ -25,7 +28,7 @@ public: enum SessionState { NotConnected, Login, Authentication, Lobby, Room, Game }; - Q_ENUMS(SessionState) + Q_ENUM(SessionState) explicit NetSession(QObject *parent = nullptr); ~NetSession() override; @@ -38,7 +41,7 @@ QString room() const; QString passwordHash() const; - public slots: + public Q_SLOTS: void open(); void close(); @@ -46,7 +49,7 @@ void setNickname(const QString &nickname); void setPasswordHash(const QString &passwordHash); - signals: + Q_SIGNALS: void urlChanged(const QUrl url); void stateChanged(QAbstractSocket::SocketState state); void nicknameChanged(const QString &nickname); @@ -57,7 +60,7 @@ void passwordHashChanged(const QString &passwordHash); void passwordAsked(); - private slots: + private Q_SLOTS: void onReadyRead(); void parseNetMessage(const QStringList &message); void handleConnected(const QStringList ¶meters); diff -r ee8b894272d0 -r 8da5a118120b qmlfrontend/preview_acceptor.cpp --- a/qmlfrontend/preview_acceptor.cpp Tue Feb 04 15:53:16 2025 +0100 +++ b/qmlfrontend/preview_acceptor.cpp Tue Feb 04 17:31:55 2025 +0100 @@ -5,9 +5,16 @@ #include "preview_image_provider.h" -PreviewAcceptor::PreviewAcceptor(QQmlEngine *engine, QObject *parent) +PreviewAcceptor* PreviewAcceptor::create(QQmlEngine* engine, + QJSEngine* jsEngine) { + Q_UNUSED(jsEngine) + + return new PreviewAcceptor(engine, engine); +} + +PreviewAcceptor::PreviewAcceptor(QQmlEngine* engine, QObject* parent) : QObject(parent), m_previewProvider(new PreviewImageProvider()) { - engine->addImageProvider(QLatin1String("preview"), m_previewProvider); + engine->addImageProvider(QStringLiteral("preview"), m_previewProvider); } void PreviewAcceptor::setImage(const QImage &preview) { diff -r ee8b894272d0 -r 8da5a118120b qmlfrontend/preview_acceptor.h --- a/qmlfrontend/preview_acceptor.h Tue Feb 04 15:53:16 2025 +0100 +++ b/qmlfrontend/preview_acceptor.h Tue Feb 04 17:31:55 2025 +0100 @@ -2,16 +2,23 @@ #define PREVIEW_ACCEPTOR_H #include +#include class QQmlEngine; class PreviewImageProvider; +class QJSEngine; class PreviewAcceptor : public QObject { Q_OBJECT + + QML_ELEMENT + QML_SINGLETON + public: + static PreviewAcceptor *create(QQmlEngine *engine, QJSEngine *jsEngine); explicit PreviewAcceptor(QQmlEngine *engine, QObject *parent = nullptr); - public slots: + public Q_SLOTS: void setImage(const QImage &preview); private: