1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-01 12:45:36 +00:00
openmw/apps/opencs/model/prefs/modifiersetting.cpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

160 lines
4.3 KiB
C++
Raw Normal View History

2016-07-27 17:53:33 +00:00
#include "modifiersetting.hpp"
#include <QEvent>
#include <QKeyEvent>
#include <QLabel>
#include <QMouseEvent>
#include <QPushButton>
#include <components/settings/settings.hpp>
2022-10-19 17:02:00 +00:00
#include <apps/opencs/model/prefs/category.hpp>
#include <apps/opencs/model/prefs/setting.hpp>
2016-07-27 17:53:33 +00:00
#include "shortcutmanager.hpp"
#include "state.hpp"
2022-10-09 10:39:43 +00:00
class QObject;
class QWidget;
2016-07-27 17:53:33 +00:00
namespace CSMPrefs
{
2023-11-11 23:52:09 +00:00
ModifierSetting::ModifierSetting(
Category* parent, QMutex* mutex, const std::string& key, const QString& label, Settings::Index& index)
: TypedSetting(parent, mutex, key, label, index)
2020-11-13 07:39:47 +00:00
, mButton(nullptr)
2016-07-27 17:53:33 +00:00
, mEditorActive(false)
{
}
SettingWidgets ModifierSetting::makeWidgets(QWidget* parent)
2016-07-27 17:53:33 +00:00
{
int modifier = 0;
State::get().getShortcutManager().getModifier(getKey(), modifier);
2016-07-27 17:53:33 +00:00
QString text = QString::fromUtf8(State::get().getShortcutManager().convertToString(modifier).c_str());
QLabel* label = new QLabel(getLabel(), parent);
2016-07-27 17:53:33 +00:00
QPushButton* widget = new QPushButton(text, parent);
widget->setCheckable(true);
widget->installEventFilter(this);
// right clicking on button sets shortcut to RMB, so context menu should not appear
2017-05-12 00:48:25 +00:00
widget->setContextMenuPolicy(Qt::PreventContextMenu);
2016-07-27 17:53:33 +00:00
mButton = widget;
connect(widget, &QPushButton::toggled, this, &ModifierSetting::buttonToggled);
2016-07-27 17:53:33 +00:00
return SettingWidgets{ .mLabel = label, .mInput = widget };
2016-07-27 17:53:33 +00:00
}
void ModifierSetting::updateWidget()
{
if (mButton)
{
2023-11-11 23:52:09 +00:00
const std::string& shortcut = getValue();
int modifier;
State::get().getShortcutManager().convertFromString(shortcut, modifier);
State::get().getShortcutManager().setModifier(getKey(), modifier);
resetState();
}
}
2016-07-27 17:53:33 +00:00
bool ModifierSetting::eventFilter(QObject* target, QEvent* event)
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->isAutoRepeat())
return true;
int mod = keyEvent->modifiers();
int key = keyEvent->key();
return handleEvent(target, mod, key);
}
else if (event->type() == QEvent::MouseButtonPress)
{
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
int mod = mouseEvent->modifiers();
int button = mouseEvent->button();
return handleEvent(target, mod, button);
}
else if (event->type() == QEvent::FocusOut)
{
resetState();
}
2016-07-27 17:53:33 +00:00
return false;
}
bool ModifierSetting::handleEvent(QObject* target, int mod, int value)
{
// For potential future exceptions
const int Blacklist[] = { 0 };
const size_t BlacklistSize = sizeof(Blacklist) / sizeof(int);
if (!mEditorActive)
{
if (value == Qt::RightButton)
{
// Clear modifier
int modifier = 0;
storeValue(modifier);
resetState();
}
2016-07-27 17:53:33 +00:00
return false;
}
2016-07-27 17:53:33 +00:00
// Handle blacklist
for (size_t i = 0; i < BlacklistSize; ++i)
{
if (value == Blacklist[i])
return true;
}
// Update modifier
int modifier = value;
storeValue(modifier);
2016-07-27 17:53:33 +00:00
resetState();
2016-07-27 17:53:33 +00:00
return true;
}
void ModifierSetting::storeValue(int modifier)
{
State::get().getShortcutManager().setModifier(getKey(), modifier);
2023-11-11 23:52:09 +00:00
setValue(State::get().getShortcutManager().convertToString(modifier));
2016-07-27 17:53:33 +00:00
getParent()->getState()->update(*this);
}
2016-07-27 17:53:33 +00:00
void ModifierSetting::resetState()
{
2016-07-27 17:53:33 +00:00
mButton->setChecked(false);
mEditorActive = false;
// Button text
int modifier = 0;
State::get().getShortcutManager().getModifier(getKey(), modifier);
QString text = QString::fromUtf8(State::get().getShortcutManager().convertToString(modifier).c_str());
mButton->setText(text);
2016-07-27 17:53:33 +00:00
}
void ModifierSetting::buttonToggled(bool checked)
{
if (checked)
mButton->setText("Press keys or click here...");
mEditorActive = checked;
}
}