mirror of
https://invent.kde.org/marcoa/a-la-karte.git
synced 2026-02-09 21:13:08 +00:00
105 lines
2.2 KiB
C++
105 lines
2.2 KiB
C++
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||
|
|
// SPDX-FileCopyrightText: 2026 A-La-Karte Contributors
|
||
|
|
|
||
|
|
#include "inputmanager.h"
|
||
|
|
|
||
|
|
#include "gamepadmanager.h"
|
||
|
|
|
||
|
|
#include <QCoreApplication>
|
||
|
|
#include <QEvent>
|
||
|
|
#include <QGuiApplication>
|
||
|
|
|
||
|
|
InputManager *InputManager::s_instance = nullptr;
|
||
|
|
|
||
|
|
InputManager::InputManager(QObject *parent)
|
||
|
|
: QObject(parent)
|
||
|
|
{
|
||
|
|
if (QCoreApplication::instance()) {
|
||
|
|
QCoreApplication::instance()->installEventFilter(this);
|
||
|
|
}
|
||
|
|
|
||
|
|
auto *pad = GamepadManager::instance();
|
||
|
|
connect(pad, &GamepadManager::activeChanged, this, [this, pad]() {
|
||
|
|
if (pad->active()) {
|
||
|
|
if (!m_hasSeenGamepad) {
|
||
|
|
m_hasSeenGamepad = true;
|
||
|
|
Q_EMIT inputHistoryChanged();
|
||
|
|
}
|
||
|
|
setActiveInput(Gamepad);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
connect(pad, &GamepadManager::connectedChanged, this, [this, pad]() {
|
||
|
|
if (!pad->connected() && m_activeInput == Gamepad) {
|
||
|
|
setActiveInput(KeyboardMouse);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
InputManager *InputManager::instance()
|
||
|
|
{
|
||
|
|
if (!s_instance) {
|
||
|
|
s_instance = new InputManager();
|
||
|
|
}
|
||
|
|
return s_instance;
|
||
|
|
}
|
||
|
|
|
||
|
|
InputManager *InputManager::create(QQmlEngine *engine, QJSEngine *scriptEngine)
|
||
|
|
{
|
||
|
|
Q_UNUSED(engine)
|
||
|
|
Q_UNUSED(scriptEngine)
|
||
|
|
return instance();
|
||
|
|
}
|
||
|
|
|
||
|
|
InputManager::ActiveInput InputManager::activeInput() const
|
||
|
|
{
|
||
|
|
return m_activeInput;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool InputManager::hasSeenKeyboardMouse() const
|
||
|
|
{
|
||
|
|
return m_hasSeenKeyboardMouse;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool InputManager::hasSeenGamepad() const
|
||
|
|
{
|
||
|
|
return m_hasSeenGamepad;
|
||
|
|
}
|
||
|
|
|
||
|
|
void InputManager::setActiveInput(ActiveInput input)
|
||
|
|
{
|
||
|
|
if (m_activeInput == input) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
m_activeInput = input;
|
||
|
|
Q_EMIT activeInputChanged();
|
||
|
|
}
|
||
|
|
|
||
|
|
bool InputManager::eventFilter(QObject *watched, QEvent *event)
|
||
|
|
{
|
||
|
|
Q_UNUSED(watched)
|
||
|
|
|
||
|
|
if (!event) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
switch (event->type()) {
|
||
|
|
case QEvent::KeyPress:
|
||
|
|
case QEvent::KeyRelease:
|
||
|
|
case QEvent::MouseButtonPress:
|
||
|
|
case QEvent::MouseButtonRelease:
|
||
|
|
case QEvent::Wheel:
|
||
|
|
if (!m_hasSeenKeyboardMouse) {
|
||
|
|
m_hasSeenKeyboardMouse = true;
|
||
|
|
Q_EMIT inputHistoryChanged();
|
||
|
|
}
|
||
|
|
setActiveInput(KeyboardMouse);
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
return false;
|
||
|
|
}
|