Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160#include "modifiersetting.hpp"
#include <QEvent>#include <QKeyEvent>#include <QLabel>#include <QMouseEvent>#include <QPushButton>
#include <components/settings/settings.hpp>
#include <apps/opencs/model/prefs/category.hpp>#include <apps/opencs/model/prefs/setting.hpp>
#include "shortcutmanager.hpp"#include "state.hpp"
class QObject;class QWidget;
namespace CSMPrefs{ ModifierSetting::ModifierSetting( Category* parent, QMutex* mutex, std::string_view key, const QString& label, Settings::Index& index) : TypedSetting(parent, mutex, key, label, index) , mButton(nullptr) , mEditorActive(false) { }
SettingWidgets ModifierSetting::makeWidgets(QWidget* parent) { int modifier = 0; State::get().getShortcutManager().getModifier(getKey(), modifier);
QString text = QString::fromUtf8(State::get().getShortcutManager().convertToString(modifier).c_str());
QLabel* label = new QLabel(getLabel(), parent); 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 widget->setContextMenuPolicy(Qt::PreventContextMenu);
mButton = widget;
connect(widget, &QPushButton::toggled, this, &ModifierSetting::buttonToggled);
return SettingWidgets{ .mLabel = label, .mInput = widget }; }
void ModifierSetting::updateWidget() { if (mButton) { const std::string& shortcut = getValue();
int modifier; State::get().getShortcutManager().convertFromString(shortcut, modifier); State::get().getShortcutManager().setModifier(getKey(), modifier); resetState(); } }
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(); }
return false; }
bool ModifierSetting::handleEvent(QObject* target, int mod, int value) { // For potential future exceptions const int blacklist[] = { 0 };
const size_t blacklistSize = std::size(blacklist);
if (!mEditorActive) { if (value == Qt::RightButton) { // Clear modifier int modifier = 0; storeValue(modifier);
resetState(); }
return false; }
// Handle blacklist for (size_t i = 0; i < blacklistSize; ++i) { if (value == blacklist[i]) return true; }
// Update modifier int modifier = value; storeValue(modifier);
resetState();
return true; }
void ModifierSetting::storeValue(int modifier) { State::get().getShortcutManager().setModifier(getKey(), modifier); setValue(State::get().getShortcutManager().convertToString(modifier)); getParent()->getState()->update(*this); }
void ModifierSetting::resetState() { 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); }
void ModifierSetting::buttonToggled(bool checked) { if (checked) mButton->setText("Press keys or click here...");
mEditorActive = checked; }}