Modernize approach for building qmlfrontend qmlrenderer tip
authorunC0Rr
Tue, 04 Feb 2025 17:31:55 +0100
branchqmlrenderer
changeset 16116 8da5a118120b
parent 16115 ee8b894272d0
Modernize approach for building qmlfrontend
qmlfrontend/CMakeLists.txt
qmlfrontend/Page1.qml
qmlfrontend/Page1Form.ui.qml
qmlfrontend/engine_instance.h
qmlfrontend/engine_interface.h
qmlfrontend/game_view.h
qmlfrontend/hwengine.h
qmlfrontend/main.cpp
qmlfrontend/net_session.h
qmlfrontend/preview_acceptor.cpp
qmlfrontend/preview_acceptor.h
--- 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
+)
--- 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();
--- 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
--- 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);
--- 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,
--- 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 <QPointer>
 #include <QQuickFramebufferObject>
 #include <QScopedPointer>
+#include <QtQmlIntegration>
 
 #include "engine_instance.h"
 
 class GameView : public QQuickFramebufferObject {
   Q_OBJECT
 
+  QML_ELEMENT
+
   Q_PROPERTY(EngineInstance* engineInstance READ engineInstance WRITE
                  setEngineInstance NOTIFY engineInstanceChanged)
 
--- 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 <QList>
 #include <QObject>
+#include <QtQmlIntegration>
 
 #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
--- 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 <QLibrary>
 #include <QQmlApplicationEngine>
 
-#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<Engine::SimpleEventType>();
-  qRegisterMetaType<Engine::LongEventType>();
-  qRegisterMetaType<Engine::LongEventState>();
-  qRegisterMetaType<Engine::PositionedEventType>();
+  /*
+    qRegisterMetaType<Engine::SimpleEventType>();
+    qRegisterMetaType<Engine::LongEventType>();
+    qRegisterMetaType<Engine::LongEventState>();
+    qRegisterMetaType<Engine::PositionedEventType>();
 
-  qmlRegisterSingletonType<PreviewAcceptor>(
-      "Hedgewars.Engine", 1, 0, "PreviewAcceptor",
-      previewacceptor_singletontype_provider);
-  qmlRegisterType<HWEngine>("Hedgewars.Engine", 1, 0, "HWEngine");
-  qmlRegisterType<GameView>("Hedgewars.Engine", 1, 0, "GameView");
-  qmlRegisterType<NetSession>("Hedgewars.Engine", 1, 0, "NetSession");
-  qmlRegisterUncreatableType<EngineInstance>(
-      "Hedgewars.Engine", 1, 0, "EngineInstance",
-      QStringLiteral("Create by HWEngine run methods"));
+    qmlRegisterSingletonType<PreviewAcceptor>(
+        "Hedgewars.Engine", 1, 0, "PreviewAcceptor",
+        previewacceptor_singletontype_provider);
+    qmlRegisterType<HWEngine>("Hedgewars.Engine", 1, 0, "HWEngine");
+    qmlRegisterType<GameView>("Hedgewars.Engine", 1, 0, "GameView");
+    qmlRegisterType<NetSession>("Hedgewars.Engine", 1, 0, "NetSession");
+    qmlRegisterUncreatableType<EngineInstance>(
+        "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();
 }
--- 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 <QSslSocket>
 #include <QStringList>
 #include <QUrl>
+#include <QtQmlIntegration>
 
 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 &parameters);
--- 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) {
--- 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 <QObject>
+#include <QtQmlIntegration>
 
 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: