bool KeyEditor::event(QEvent* event) { if (!m_button) { if (event->type() == QEvent::KeyPress) { QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event); if (keyEvent->key() != Qt::Key_Tab && keyEvent->key() != Qt::Key_Backtab) { return QWidget::event(event); } if (!(keyEvent->modifiers() & ~Qt::ShiftModifier)) { keyPressEvent(keyEvent); keyEvent->accept(); return true; } } } else { if (event->type() == GamepadButtonEvent::Down()) { setValueButton(static_cast<GamepadButtonEvent*>(event)->value()); event->accept(); return true; } if (event->type() == GamepadHatEvent::Down()) { GamepadHatEvent* ghe = static_cast<GamepadHatEvent*>(event); setValueHat(ghe->hatId(), ghe->direction()); event->accept(); return true; } if (event->type() == GamepadAxisEvent::Type()) { GamepadAxisEvent* gae = static_cast<GamepadAxisEvent*>(event); if (gae->isNew()) { setValueAxis(gae->axis(), gae->direction()); } event->accept(); return true; } } return QWidget::event(event); }
void InputController::testGamepad(int type) { auto activeAxes = activeGamepadAxes(type); auto oldAxes = m_activeAxes; m_activeAxes = activeAxes; auto activeButtons = activeGamepadButtons(type); auto oldButtons = m_activeButtons; m_activeButtons = activeButtons; if (!QApplication::focusWidget()) { return; } activeAxes.subtract(oldAxes); oldAxes.subtract(m_activeAxes); for (auto& axis : m_activeAxes) { bool newlyAboveThreshold = activeAxes.contains(axis); if (newlyAboveThreshold) { GamepadAxisEvent* event = new GamepadAxisEvent(axis.first, axis.second, newlyAboveThreshold, type, this); postPendingEvent(event->gbaKey()); QApplication::sendEvent(QApplication::focusWidget(), event); if (!event->isAccepted()) { clearPendingEvent(event->gbaKey()); } } } for (auto axis : oldAxes) { GamepadAxisEvent* event = new GamepadAxisEvent(axis.first, axis.second, false, type, this); clearPendingEvent(event->gbaKey()); QApplication::sendEvent(QApplication::focusWidget(), event); } if (!QApplication::focusWidget()) { return; } activeButtons.subtract(oldButtons); oldButtons.subtract(m_activeButtons); for (int button : activeButtons) { GamepadButtonEvent* event = new GamepadButtonEvent(GamepadButtonEvent::Down(), button, type, this); postPendingEvent(event->gbaKey()); QApplication::sendEvent(QApplication::focusWidget(), event); if (!event->isAccepted()) { clearPendingEvent(event->gbaKey()); } } for (int button : oldButtons) { GamepadButtonEvent* event = new GamepadButtonEvent(GamepadButtonEvent::Up(), button, type, this); clearPendingEvent(event->gbaKey()); QApplication::sendEvent(QApplication::focusWidget(), event); } }
bool ShortcutController::eventFilter(QObject*, QEvent* event) { if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) { QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event); if (keyEvent->isAutoRepeat()) { return false; } auto item = m_heldKeys.find(keyEventToSequence(keyEvent)); if (item == m_heldKeys.end()) { return false; } ShortcutItem::Functions pair = item.value()->functions(); if (event->type() == QEvent::KeyPress) { if (pair.first) { pair.first(); } } else { if (pair.second) { pair.second(); } } event->accept(); return true; } if (event->type() == GamepadButtonEvent::Down()) { auto item = m_buttons.find(static_cast<GamepadButtonEvent*>(event)->value()); if (item == m_buttons.end()) { return false; } QAction* action = item.value()->action(); if (action && action->isEnabled()) { action->trigger(); } ShortcutItem::Functions pair = item.value()->functions(); if (pair.first) { pair.first(); } event->accept(); return true; } if (event->type() == GamepadButtonEvent::Up()) { auto item = m_buttons.find(static_cast<GamepadButtonEvent*>(event)->value()); if (item == m_buttons.end()) { return false; } ShortcutItem::Functions pair = item.value()->functions(); if (pair.second) { pair.second(); } event->accept(); return true; } if (event->type() == GamepadAxisEvent::Type()) { GamepadAxisEvent* gae = static_cast<GamepadAxisEvent*>(event); auto item = m_axes.find(qMakePair(gae->axis(), gae->direction())); if (item == m_axes.end()) { return false; } if (gae->isNew()) { QAction* action = item.value()->action(); if (action && action->isEnabled()) { action->trigger(); } } ShortcutItem::Functions pair = item.value()->functions(); if (gae->isNew()) { if (pair.first) { pair.first(); } } else { if (pair.second) { pair.second(); } } event->accept(); return true; } return false; }
bool LoadSaveState::eventFilter(QObject* object, QEvent* event) { if (event->type() == QEvent::KeyPress) { int column = m_currentFocus % 3; int row = m_currentFocus - column; switch (static_cast<QKeyEvent*>(event)->key()) { case Qt::Key_Up: row += 6; break; case Qt::Key_Down: row += 3; break; case Qt::Key_Left: column += 2; break; case Qt::Key_Right: column += 1; break; case Qt::Key_1: case Qt::Key_2: case Qt::Key_3: case Qt::Key_4: case Qt::Key_5: case Qt::Key_6: case Qt::Key_7: case Qt::Key_8: case Qt::Key_9: triggerState(static_cast<QKeyEvent*>(event)->key() - Qt::Key_1 + 1); break; case Qt::Key_Escape: close(); break; case Qt::Key_Enter: case Qt::Key_Return: triggerState(m_currentFocus + 1); break; default: return false; } column %= 3; row %= 9; m_currentFocus = column + row; m_slots[m_currentFocus]->setFocus(); return true; } if (event->type() == QEvent::Enter) { int i; for (i = 0; i < 9; ++i) { if (m_slots[i] == object) { m_currentFocus = i; m_slots[m_currentFocus]->setFocus(); return true; } } } if (event->type() == GamepadButtonEvent::Down() || event->type() == GamepadAxisEvent::Type()) { int column = m_currentFocus % 3; int row = m_currentFocus - column; GBAKey key = GBA_KEY_NONE; if (event->type() == GamepadButtonEvent::Down()) { key = static_cast<GamepadButtonEvent*>(event)->gbaKey(); } else if (event->type() == GamepadAxisEvent::Type()) { GamepadAxisEvent* gae = static_cast<GamepadAxisEvent*>(event); if (gae->isNew()) { key = gae->gbaKey(); } else { return false; } } switch (key) { case GBA_KEY_UP: row += 6; break; case GBA_KEY_DOWN: row += 3; break; case GBA_KEY_LEFT: column += 2; break; case GBA_KEY_RIGHT: column += 1; break; case GBA_KEY_B: event->accept(); close(); return true; case GBA_KEY_A: case GBA_KEY_START: event->accept(); triggerState(m_currentFocus + 1); return true; default: return false; } column %= 3; row %= 9; m_currentFocus = column + row; m_slots[m_currentFocus]->setFocus(); event->accept(); return true; } return false; }