--- 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 ¶meters);
--- 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: