# HG changeset patch # User unC0Rr # Date 1716209910 -7200 # Node ID 4933920eba89775091402c32f46be0dae727dd53 # Parent 0e90bdfc26420e02eb1a4297ecd8d99bf945efac Implement key bindings diff -r 0e90bdfc2642 -r 4933920eba89 qmlfrontend/Page1.qml --- a/qmlfrontend/Page1.qml Sun May 19 15:55:26 2024 +0200 +++ b/qmlfrontend/Page1.qml Mon May 20 14:58:30 2024 +0200 @@ -2,18 +2,70 @@ import Hedgewars.Engine 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 - property HWEngine hwEngine - property NetSession netSession + 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(); + } Component { id: hwEngineComponent HWEngine { + dataPath: "../share/hedgewars/Data" engineLibrary: "../rust/lib-hedgewars-engine/target/debug/libhedgewars_engine.so" - dataPath: "../share/hedgewars/Data" previewAcceptor: PreviewAcceptor + onPreviewImageChanged: previewImage.source = "image://preview/image" onPreviewIsRendering: previewImage.source = "qrc:/res/iconTime.png" } @@ -28,58 +80,41 @@ } } - Component.onCompleted: { - hwEngine = hwEngineComponent.createObject() + tickButton { + onClicked: { + tickButton.visible = false; + gameView.tick(100); + } } - tickButton { - onClicked: { - tickButton.visible = false - gameView.tick(100) - } - } gameButton { visible: !gameView.engineInstance + onClicked: { - const engineInstance = hwEngine.runQuickGame() - gameView.engineInstance = engineInstance + const engineInstance = hwEngine.runQuickGame(); + gameView.engineInstance = engineInstance; } } + button1 { visible: !gameView.engineInstance + onClicked: { - hwEngine.getPreview() + hwEngine.getPreview(); } } + preview { visible: !gameView.engineInstance } - netButton.onClicked: { - netSession = netSessionComponent.createObject() - netSession.open() - } - - Keys.onPressed: { - if (event.key === Qt.Key_Enter) - gameView.engineInstance.longEvent(Engine.Attack, Engine.Set) - } - - Keys.onReleased: { - if (event.key === Qt.Key_Enter) - gameView.engineInstance.longEvent(Engine.Attack, Engine.Unset) - } - gameMouseArea { + onPositionChanged: event => { + gameView.engineInstance.moveCamera(Qt.point(event.x - gameMouseArea.lastPoint.x, event.y - gameMouseArea.lastPoint.y)); + gameMouseArea.lastPoint = Qt.point(event.x, event.y); + } onPressed: event => { - gameMouseArea.lastPoint = Qt.point(event.x, event.y) - } - onPositionChanged: event => { - gameView.engineInstance.moveCamera( - Qt.point(event.x - gameMouseArea.lastPoint.x, - event.y - gameMouseArea.lastPoint.y)) - - gameMouseArea.lastPoint = Qt.point(event.x, event.y) - } + gameMouseArea.lastPoint = Qt.point(event.x, event.y); + } } } diff -r 0e90bdfc2642 -r 4933920eba89 qmlfrontend/engine_instance.cpp --- a/qmlfrontend/engine_instance.cpp Sun May 19 15:55:26 2024 +0200 +++ b/qmlfrontend/engine_instance.cpp Mon May 20 14:58:30 2024 +0200 @@ -88,17 +88,21 @@ } void EngineInstance::simpleEvent(Engine::SimpleEventType event_type) { - simple_event(m_instance.get(), event_type); + simple_event(m_instance.get(), + static_cast<hwengine::SimpleEventType>(event_type)); } void EngineInstance::longEvent(Engine::LongEventType event_type, Engine::LongEventState state) { - long_event(m_instance.get(), event_type, state); + long_event(m_instance.get(), static_cast<hwengine::LongEventType>(event_type), + static_cast<hwengine::LongEventState>(state)); } void EngineInstance::positionedEvent(Engine::PositionedEventType event_type, qint32 x, qint32 y) { - positioned_event(m_instance.get(), event_type, x, y); + positioned_event(m_instance.get(), + static_cast<hwengine::PositionedEventType>(event_type), x, + y); } void EngineInstance::renderFrame() { render_frame(m_instance.get()); } diff -r 0e90bdfc2642 -r 4933920eba89 qmlfrontend/engine_instance.h --- a/qmlfrontend/engine_instance.h Sun May 19 15:55:26 2024 +0200 +++ b/qmlfrontend/engine_instance.h Mon May 20 14:58:30 2024 +0200 @@ -15,7 +15,7 @@ public: explicit EngineInstance(const QString& libraryPath,const QString& dataPath, QObject* parent = nullptr); - ~EngineInstance(); + ~EngineInstance() override; Q_PROPERTY(bool isValid READ isValid NOTIFY isValidChanged) diff -r 0e90bdfc2642 -r 4933920eba89 qmlfrontend/engine_interface.h --- a/qmlfrontend/engine_interface.h Sun May 19 15:55:26 2024 +0200 +++ b/qmlfrontend/engine_interface.h Mon May 20 14:58:30 2024 +0200 @@ -42,25 +42,51 @@ using long_event_t = decltype(hwengine::long_event); using positioned_event_t = decltype(hwengine::positioned_event); +} // extern "C" + +Q_NAMESPACE + +/* using SimpleEventType = hwengine::SimpleEventType; using LongEventType = hwengine::LongEventType; using LongEventState = hwengine::LongEventState; using PositionedEventType = hwengine::PositionedEventType; +*/ -} // extern "C" +// NOTE: have to copy these to be able to register then in Qt meta object system +enum class LongEventState { + Set, + Unset, +}; -Q_NAMESPACE +enum class LongEventType { + ArrowUp, + ArrowDown, + ArrowLeft, + ArrowRight, + Precision, + Attack, +}; + +enum class PositionedEventType { + CursorMove, + CursorClick, +}; + +enum class SimpleEventType { + SwitchHedgehog, + Timer, + LongJump, + HighJump, + Accept, + Deny, +}; Q_ENUM_NS(SimpleEventType) Q_ENUM_NS(LongEventType) Q_ENUM_NS(LongEventState) Q_ENUM_NS(PositionedEventType) -}; // namespace - -Q_DECLARE_METATYPE(Engine::SimpleEventType) -Q_DECLARE_METATYPE(Engine::LongEventType) -Q_DECLARE_METATYPE(Engine::LongEventState) -Q_DECLARE_METATYPE(Engine::PositionedEventType) +}; // namespace Engine #endif // ENGINE_H diff -r 0e90bdfc2642 -r 4933920eba89 rust/lib-hedgewars-engine/src/lib.rs --- a/rust/lib-hedgewars-engine/src/lib.rs Sun May 19 15:55:26 2024 +0200 +++ b/rust/lib-hedgewars-engine/src/lib.rs Mon May 20 14:58:30 2024 +0200 @@ -62,7 +62,9 @@ } #[no_mangle] -pub extern "C" fn simple_event(engine_state: &mut EngineInstance, event_type: SimpleEventType) {} +pub extern "C" fn simple_event(engine_state: &mut EngineInstance, event_type: SimpleEventType) { + println!("{:?}", event_type); +} #[no_mangle] pub extern "C" fn long_event(