/* Copyright (c) 2013-2015 Jeffrey Pfau * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "ShortcutView.h" #include "GamepadButtonEvent.h" #include "InputController.h" #include "InputModel.h" #include using namespace QGBA; ShortcutView::ShortcutView(QWidget* parent) : QWidget(parent) , m_model() { m_ui.setupUi(this); m_ui.keyEdit->setValueKey(0); m_ui.shortcutTable->setModel(&m_model); connect(m_ui.gamepadButton, &QAbstractButton::pressed, [this]() { bool signalsBlocked = m_ui.keyEdit->blockSignals(true); m_ui.keyEdit->setValueButton(-1); m_ui.keyEdit->blockSignals(signalsBlocked); }); connect(m_ui.keyboardButton, &QAbstractButton::pressed, [this]() { bool signalsBlocked = m_ui.keyEdit->blockSignals(true); m_ui.keyEdit->setValueKey(0); m_ui.keyEdit->blockSignals(signalsBlocked); }); connect(m_ui.keyEdit, &KeyEditor::valueChanged, this, &ShortcutView::updateButton); connect(m_ui.keyEdit, &KeyEditor::axisChanged, this, &ShortcutView::updateAxis); connect(m_ui.shortcutTable, &QAbstractItemView::doubleClicked, this, &ShortcutView::load); connect(m_ui.clearButton, &QAbstractButton::clicked, this, &ShortcutView::clear); #ifdef BUILD_SDL connect(m_ui.gamepadName, static_cast(&QComboBox::currentIndexChanged), [this](int index) { m_input->setGamepad(SDL_BINDING_BUTTON, index); }); #endif } ShortcutView::~ShortcutView() { m_input->releaseFocus(this); } void ShortcutView::setModel(InputIndex* model) { m_model.clone(*model); } void ShortcutView::setInputController(InputController* controller) { if (m_input) { m_input->releaseFocus(this); } m_input = controller; m_input->stealFocus(this); updateGamepads(); } void ShortcutView::updateGamepads() { if (!m_input) { return; } #ifdef BUILD_SDL m_ui.gamepadName->clear(); QStringList gamepads = m_input->connectedGamepads(SDL_BINDING_BUTTON); int activeGamepad = m_input->gamepad(SDL_BINDING_BUTTON); for (const auto& gamepad : gamepads) { m_ui.gamepadName->addItem(gamepad); } m_ui.gamepadName->setCurrentIndex(activeGamepad); #endif } void ShortcutView::load(const QModelIndex& index) { InputItem* item = m_model.itemAt(index); if (!item) { return; } int shortcut = item->shortcut(); if (index.column() == 1) { m_ui.keyboardButton->click(); } else if (index.column() == 2) { m_ui.gamepadButton->click(); } bool blockSignals = m_ui.keyEdit->blockSignals(true); m_ui.keyEdit->setFocus(Qt::MouseFocusReason); if (m_ui.gamepadButton->isChecked()) { m_ui.keyEdit->setValueButton(-1); // There are no default bindings } else { m_ui.keyEdit->setValueKey(shortcut); } m_ui.keyEdit->blockSignals(blockSignals); } void ShortcutView::clear() { QModelIndex index = m_ui.shortcutTable->selectionModel()->currentIndex(); InputItem* item = m_model.itemAt(index); if (!item) { return; } if (m_ui.gamepadButton->isChecked()) { item->clearButton(); m_ui.keyEdit->setValueButton(-1); } else { item->clearShortcut(); m_ui.keyEdit->setValueKey(-1); } } void ShortcutView::updateButton(int button) { InputItem* item = m_model.itemAt(m_ui.shortcutTable->selectionModel()->currentIndex()); if (!item) { return; } if (m_ui.gamepadButton->isChecked()) { item->setButton(button); } else { item->setShortcut(button); } } void ShortcutView::updateAxis(int axis, int direction) { InputItem* item = m_model.itemAt(m_ui.shortcutTable->selectionModel()->currentIndex()); if (!item) { return; } item->setAxis(axis, static_cast(direction)); } void ShortcutView::closeEvent(QCloseEvent*) { if (m_input) { m_input->releaseFocus(this); } } bool ShortcutView::event(QEvent* event) { if (m_input) { QEvent::Type type = event->type(); if (type == QEvent::WindowActivate || type == QEvent::Show) { m_input->stealFocus(this); } else if (type == QEvent::WindowDeactivate || type == QEvent::Hide) { m_input->releaseFocus(this); } } return QWidget::event(event); }