# HG changeset patch # User unC0Rr # Date 1544186108 -3600 # Node ID 90bd2c33170340066f09e8afef472777a612ad7f # Parent ef2fc02103628569e32c5ec0ea9db944eaed58aa Add possibility to instantiate HWEngine objects from QML, reorganize work with preview diff -r ef2fc0210362 -r 90bd2c331703 qmlfrontend/CMakeLists.txt --- a/qmlfrontend/CMakeLists.txt Fri Dec 07 13:04:00 2018 +0100 +++ b/qmlfrontend/CMakeLists.txt Fri Dec 07 13:35:08 2018 +0100 @@ -15,6 +15,8 @@ "team.cpp" "team.h" "engine_instance.cpp" "engine_instance.h" "preview_image_provider.cpp" "preview_image_provider.h" - "engine_interface.h") + "engine_interface.h" + "preview_acceptor.cpp" "preview_acceptor.h" + ) target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Quick) diff -r ef2fc0210362 -r 90bd2c331703 qmlfrontend/Page1.qml --- a/qmlfrontend/Page1.qml Fri Dec 07 13:04:00 2018 +0100 +++ b/qmlfrontend/Page1.qml Fri Dec 07 13:35:08 2018 +0100 @@ -2,24 +2,30 @@ import Hedgewars.Engine 1.0 Page1Form { + property var hwEngine + + Component { + id: hwEngineComponent + + HWEngine { + previewAcceptor: PreviewAcceptor + onPreviewImageChanged: previewImage.source = "image://preview/image" + onPreviewIsRendering: previewImage.source = "qrc:/res/iconTime.png" + } + } + + Component.onCompleted: { + hwEngine = hwEngineComponent.createObject() + } + tickButton.onClicked: { gameView.tick(100) } gameButton.onClicked: { - var engineInstance = HWEngine.runQuickGame() + var engineInstance = hwEngine.runQuickGame() gameView.engineInstance = engineInstance } button1.onClicked: { - HWEngine.getPreview() - } - - Connections { - target: HWEngine - onPreviewImageChanged: { - previewImage.source = "image://preview/image" - } - onPreviewIsRendering: { - previewImage.source = "qrc:/res/iconTime.png" - } + hwEngine.getPreview() } } diff -r ef2fc0210362 -r 90bd2c331703 qmlfrontend/hwengine.cpp --- a/qmlfrontend/hwengine.cpp Fri Dec 07 13:04:00 2018 +0100 +++ b/qmlfrontend/hwengine.cpp Fri Dec 07 13:35:08 2018 +0100 @@ -1,4 +1,7 @@ +#include "hwengine.h" + #include +#include #include #include #include @@ -6,37 +9,12 @@ #include "engine_instance.h" #include "engine_interface.h" #include "game_view.h" -#include "preview_image_provider.h" - -#include "hwengine.h" +#include "preview_acceptor.h" -HWEngine::HWEngine(QQmlEngine* engine, QObject* parent) - : QObject(parent), - m_engine(engine), - m_previewProvider(new PreviewImageProvider()) { - m_engine->addImageProvider(QLatin1String("preview"), m_previewProvider); -} +HWEngine::HWEngine(QObject* parent) : QObject(parent) {} HWEngine::~HWEngine() {} -static QObject* hwengine_singletontype_provider(QQmlEngine* engine, - QJSEngine* scriptEngine) { - Q_UNUSED(scriptEngine) - - HWEngine* hwengine = new HWEngine(engine); - return hwengine; -} - -void HWEngine::exposeToQML() { - qDebug("HWEngine::exposeToQML"); - qmlRegisterSingletonType("Hedgewars.Engine", 1, 0, "HWEngine", - hwengine_singletontype_provider); - qmlRegisterType("Hedgewars.Engine", 1, 0, "GameView"); - qmlRegisterUncreatableType("Hedgewars.Engine", 1, 0, - "EngineInstance", - "Create by HWEngine run methods"); -} - void HWEngine::getPreview() { emit previewIsRendering(); @@ -58,7 +36,7 @@ previewImage.setColorTable(colorTable); previewImage.detach(); - m_previewProvider->setImage(previewImage); + if (m_previewAcceptor) m_previewAcceptor->setImage(previewImage); emit previewImageChanged(); // m_runQueue->queue(m_gameConfig); @@ -80,3 +58,12 @@ } int HWEngine::previewHedgehogsCount() const { return m_previewHedgehogsCount; } + +PreviewAcceptor* HWEngine::previewAcceptor() const { return m_previewAcceptor; } + +void HWEngine::setPreviewAcceptor(PreviewAcceptor* previewAcceptor) { + if (m_previewAcceptor == previewAcceptor) return; + + m_previewAcceptor = previewAcceptor; + emit previewAcceptorChanged(m_previewAcceptor); +} diff -r ef2fc0210362 -r 90bd2c331703 qmlfrontend/hwengine.h --- a/qmlfrontend/hwengine.h Fri Dec 07 13:04:00 2018 +0100 +++ b/qmlfrontend/hwengine.h Fri Dec 07 13:35:08 2018 +0100 @@ -8,25 +8,29 @@ #include "game_config.h" class QQmlEngine; -class PreviewImageProvider; class EngineInstance; +class PreviewAcceptor; class HWEngine : public QObject { Q_OBJECT Q_PROPERTY(int previewHedgehogsCount READ previewHedgehogsCount NOTIFY previewHedgehogsCountChanged) + Q_PROPERTY(PreviewAcceptor* previewAcceptor READ previewAcceptor WRITE + setPreviewAcceptor NOTIFY previewAcceptorChanged) public: - explicit HWEngine(QQmlEngine* engine, QObject* parent = nullptr); + explicit HWEngine(QObject* parent = nullptr); ~HWEngine(); - static void exposeToQML(); - Q_INVOKABLE void getPreview(); Q_INVOKABLE EngineInstance* runQuickGame(); int previewHedgehogsCount() const; + PreviewAcceptor* previewAcceptor() const; + + public slots: + void setPreviewAcceptor(PreviewAcceptor* previewAcceptor); signals: void previewIsRendering(); @@ -34,12 +38,13 @@ void previewHogCountChanged(int count); void gameFinished(); void previewHedgehogsCountChanged(int previewHedgehogsCount); + void previewAcceptorChanged(PreviewAcceptor* previewAcceptor); private: QQmlEngine* m_engine; - PreviewImageProvider* m_previewProvider; GameConfig m_gameConfig; int m_previewHedgehogsCount; + PreviewAcceptor* m_previewAcceptor; }; #endif // HWENGINE_H diff -r ef2fc0210362 -r 90bd2c331703 qmlfrontend/main.cpp --- a/qmlfrontend/main.cpp Fri Dec 07 13:04:00 2018 +0100 +++ b/qmlfrontend/main.cpp Fri Dec 07 13:35:08 2018 +0100 @@ -4,7 +4,9 @@ #include #include "engine_interface.h" +#include "game_view.h" #include "hwengine.h" +#include "preview_acceptor.h" namespace Engine { hedgewars_engine_protocol_version_t* hedgewars_engine_protocol_version; @@ -18,6 +20,14 @@ advance_simulation_t* advance_simulation; }; // namespace Engine +static QObject* previewacceptor_singletontype_provider( + QQmlEngine* engine, QJSEngine* scriptEngine) { + Q_UNUSED(scriptEngine) + + PreviewAcceptor* acceptor = new PreviewAcceptor(engine); + return acceptor; +} + void loadEngineLibrary() { #ifdef Q_OS_WIN QLibrary hwlib("./libhedgewars_engine.dll"); @@ -64,7 +74,14 @@ QQmlApplicationEngine engine; - HWEngine::exposeToQML(); + qmlRegisterSingletonType( + "Hedgewars.Engine", 1, 0, "PreviewAcceptor", + previewacceptor_singletontype_provider); + qmlRegisterType("Hedgewars.Engine", 1, 0, "HWEngine"); + qmlRegisterType("Hedgewars.Engine", 1, 0, "GameView"); + qmlRegisterUncreatableType("Hedgewars.Engine", 1, 0, + "EngineInstance", + "Create by HWEngine run methods"); engine.load(QUrl(QLatin1String("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; diff -r ef2fc0210362 -r 90bd2c331703 qmlfrontend/preview_acceptor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/preview_acceptor.cpp Fri Dec 07 13:35:08 2018 +0100 @@ -0,0 +1,15 @@ +#include "preview_acceptor.h" + +#include +#include + +#include "preview_image_provider.h" + +PreviewAcceptor::PreviewAcceptor(QQmlEngine *engine, QObject *parent) + : QObject(parent), m_previewProvider(new PreviewImageProvider()) { + engine->addImageProvider(QLatin1String("preview"), m_previewProvider); +} + +void PreviewAcceptor::setImage(const QImage &preview) { + m_previewProvider->setImage(preview); +} diff -r ef2fc0210362 -r 90bd2c331703 qmlfrontend/preview_acceptor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/preview_acceptor.h Fri Dec 07 13:35:08 2018 +0100 @@ -0,0 +1,21 @@ +#ifndef PREVIEW_ACCEPTOR_H +#define PREVIEW_ACCEPTOR_H + +#include + +class QQmlEngine; +class PreviewImageProvider; + +class PreviewAcceptor : public QObject { + Q_OBJECT + public: + explicit PreviewAcceptor(QQmlEngine *engine, QObject *parent = nullptr); + + public slots: + void setImage(const QImage &preview); + + private: + PreviewImageProvider *m_previewProvider; +}; + +#endif // PREVIEW_ACCEPTOR_H