|
1 | 1 | // SPDX-License-Identifier: LGPL-3.0-or-later
|
2 | 2 |
|
| 3 | +#include <QQuickWindow> |
3 | 4 | #include <scratchcpp/iengine.h>
|
| 5 | +#include <scratchcpp/keyevent.h> |
4 | 6 |
|
5 | 7 | #include "projectscene.h"
|
| 8 | +#include "keyeventhandler.h" |
6 | 9 |
|
7 |
| -namespace scratchcppgui |
8 |
| -{ |
| 10 | +using namespace scratchcppgui; |
| 11 | +using namespace libscratchcpp; |
| 12 | + |
| 13 | +static const std::unordered_map<Qt::Key, KeyEvent::Type> SPECIAL_KEY_MAP = { |
| 14 | + { Qt::Key_Space, KeyEvent::Type::Space }, { Qt::Key_Left, KeyEvent::Type::Left }, { Qt::Key_Up, KeyEvent::Type::Up }, { Qt::Key_Right, KeyEvent::Type::Right }, |
| 15 | + { Qt::Key_Down, KeyEvent::Type::Down }, { Qt::Key_Return, KeyEvent::Type::Enter }, { Qt::Key_Enter, KeyEvent::Type::Enter } |
| 16 | +}; |
9 | 17 |
|
10 | 18 | ProjectScene::ProjectScene(QQuickItem *parent)
|
11 | 19 | {
|
| 20 | + m_keyHandler = new KeyEventHandler(this); |
| 21 | + connect(this, &QQuickItem::windowChanged, this, &ProjectScene::installKeyHandler); |
| 22 | + connect(m_keyHandler, &KeyEventHandler::keyPressed, this, &ProjectScene::handleKeyPress); |
| 23 | + connect(m_keyHandler, &KeyEventHandler::keyReleased, this, &ProjectScene::handleKeyRelease); |
12 | 24 | }
|
13 | 25 |
|
14 |
| -libscratchcpp::IEngine *ProjectScene::engine() const |
| 26 | +IEngine *ProjectScene::engine() const |
15 | 27 | {
|
16 | 28 | return m_engine;
|
17 | 29 | }
|
18 | 30 |
|
19 |
| -void ProjectScene::setEngine(libscratchcpp::IEngine *newEngine) |
| 31 | +void ProjectScene::setEngine(IEngine *newEngine) |
20 | 32 | {
|
21 | 33 | if (m_engine == newEngine)
|
22 | 34 | return;
|
@@ -45,4 +57,36 @@ void ProjectScene::handleMouseRelease()
|
45 | 57 | m_engine->setMousePressed(false);
|
46 | 58 | }
|
47 | 59 |
|
48 |
| -} // namespace scratchcppgui |
| 60 | +void ProjectScene::handleKeyPress(Qt::Key key, const QString &text) |
| 61 | +{ |
| 62 | + if (m_engine) { |
| 63 | + auto it = SPECIAL_KEY_MAP.find(key); |
| 64 | + |
| 65 | + if (it == SPECIAL_KEY_MAP.cend()) |
| 66 | + m_engine->setKeyState(text.toStdString(), true); |
| 67 | + else { |
| 68 | + KeyEvent event(it->second); |
| 69 | + m_engine->setKeyState(event.name(), true); |
| 70 | + } |
| 71 | + } |
| 72 | +} |
| 73 | + |
| 74 | +void ProjectScene::handleKeyRelease(Qt::Key key, const QString &text) |
| 75 | +{ |
| 76 | + if (m_engine) { |
| 77 | + auto it = SPECIAL_KEY_MAP.find(key); |
| 78 | + |
| 79 | + if (it == SPECIAL_KEY_MAP.cend()) |
| 80 | + m_engine->setKeyState(text.toStdString(), false); |
| 81 | + else { |
| 82 | + KeyEvent event(it->second); |
| 83 | + m_engine->setKeyState(event.name(), false); |
| 84 | + } |
| 85 | + } |
| 86 | +} |
| 87 | + |
| 88 | +void ProjectScene::installKeyHandler(QQuickWindow *window) |
| 89 | +{ |
| 90 | + if (window) |
| 91 | + window->installEventFilter(m_keyHandler); |
| 92 | +} |
0 commit comments