forked from mirror/openmw-tes3mp
Add modifier setting.
This commit is contained in:
parent
b204758be1
commit
12db6d2114
7 changed files with 193 additions and 8 deletions
|
@ -113,7 +113,7 @@ opencs_units (view/prefs
|
||||||
|
|
||||||
opencs_units (model/prefs
|
opencs_units (model/prefs
|
||||||
state setting intsetting doublesetting boolsetting enumsetting coloursetting shortcut
|
state setting intsetting doublesetting boolsetting enumsetting coloursetting shortcut
|
||||||
shortcuteventhandler shortcutmanager shortcutsetting
|
shortcuteventhandler shortcutmanager shortcutsetting modifiersetting
|
||||||
)
|
)
|
||||||
|
|
||||||
opencs_units_noqt (model/prefs
|
opencs_units_noqt (model/prefs
|
||||||
|
|
125
apps/opencs/model/prefs/modifiersetting.cpp
Normal file
125
apps/opencs/model/prefs/modifiersetting.cpp
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
#include "modifiersetting.hpp"
|
||||||
|
|
||||||
|
#include <QEvent>
|
||||||
|
#include <QKeyEvent>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
#include "state.hpp"
|
||||||
|
#include "shortcutmanager.hpp"
|
||||||
|
|
||||||
|
namespace CSMPrefs
|
||||||
|
{
|
||||||
|
ModifierSetting::ModifierSetting(Category* parent, Settings::Manager* values, QMutex* mutex, const std::string& key,
|
||||||
|
const std::string& label)
|
||||||
|
: Setting(parent, values, mutex, key, label)
|
||||||
|
, mEditorActive(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
std::pair<QWidget*, QWidget*> ModifierSetting::makeWidgets(QWidget* parent)
|
||||||
|
{
|
||||||
|
QKeySequence sequence;
|
||||||
|
int modifier = 0;
|
||||||
|
State::get().getShortcutManager().getSequence(getKey(), sequence, modifier);
|
||||||
|
|
||||||
|
QString text = QString::fromUtf8(State::get().getShortcutManager().convertToString(modifier).c_str());
|
||||||
|
|
||||||
|
QLabel* label = new QLabel(QString::fromUtf8(getLabel().c_str()), parent);
|
||||||
|
QPushButton* widget = new QPushButton(text, parent);
|
||||||
|
|
||||||
|
widget->setCheckable(true);
|
||||||
|
widget->installEventFilter(this);
|
||||||
|
mButton = widget;
|
||||||
|
|
||||||
|
connect(widget, SIGNAL(toggled(bool)), this, SLOT(buttonToggled(bool)));
|
||||||
|
|
||||||
|
return std::make_pair(label, widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Handle blacklist
|
||||||
|
for (size_t i = 0; i < BlacklistSize; ++i)
|
||||||
|
{
|
||||||
|
if (value == Blacklist[i])
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Update modifier
|
||||||
|
QKeySequence sequence;
|
||||||
|
int modifier = 0;
|
||||||
|
|
||||||
|
State::get().getShortcutManager().getSequence(getKey(), sequence, modifier);
|
||||||
|
|
||||||
|
modifier = value;
|
||||||
|
State::get().getShortcutManager().setSequence(getKey(), sequence, modifier);
|
||||||
|
|
||||||
|
// Store
|
||||||
|
{
|
||||||
|
std::string value = State::get().getShortcutManager().convertToString(sequence, modifier);
|
||||||
|
|
||||||
|
QMutexLocker lock(getMutex());
|
||||||
|
getValues().setString(getKey(), getParent()->getKey(), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
getParent()->getState()->update(*this);
|
||||||
|
|
||||||
|
// Update button
|
||||||
|
QString text = QString::fromUtf8(State::get().getShortcutManager().convertToString(modifier).c_str());
|
||||||
|
|
||||||
|
mButton->setText(text);
|
||||||
|
mButton->setChecked(false);
|
||||||
|
mEditorActive = false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModifierSetting::buttonToggled(bool checked)
|
||||||
|
{
|
||||||
|
if (checked)
|
||||||
|
mButton->setText("Press keys or click here...");
|
||||||
|
|
||||||
|
mEditorActive = checked;
|
||||||
|
}
|
||||||
|
}
|
41
apps/opencs/model/prefs/modifiersetting.hpp
Normal file
41
apps/opencs/model/prefs/modifiersetting.hpp
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
#ifndef CSM_PREFS_MODIFIERSETTING_H
|
||||||
|
#define CSM_PREFS_MODIFIERSETTING_H
|
||||||
|
|
||||||
|
#include <QKeySequence>
|
||||||
|
|
||||||
|
#include "setting.hpp"
|
||||||
|
|
||||||
|
class QEvent;
|
||||||
|
class QPushButton;
|
||||||
|
|
||||||
|
namespace CSMPrefs
|
||||||
|
{
|
||||||
|
class ModifierSetting : public Setting
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
ModifierSetting(Category* parent, Settings::Manager* values, QMutex* mutex, const std::string& key,
|
||||||
|
const std::string& label);
|
||||||
|
|
||||||
|
virtual std::pair<QWidget*, QWidget*> makeWidgets(QWidget* parent);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
bool eventFilter(QObject* target, QEvent* event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
bool handleEvent(QObject* target, int mod, int value);
|
||||||
|
|
||||||
|
QPushButton* mButton;
|
||||||
|
bool mEditorActive;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void buttonToggled(bool checked);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -14,9 +14,8 @@
|
||||||
namespace CSMPrefs
|
namespace CSMPrefs
|
||||||
{
|
{
|
||||||
ShortcutSetting::ShortcutSetting(Category* parent, Settings::Manager* values, QMutex* mutex, const std::string& key,
|
ShortcutSetting::ShortcutSetting(Category* parent, Settings::Manager* values, QMutex* mutex, const std::string& key,
|
||||||
const std::string& label, const QKeySequence& default_)
|
const std::string& label)
|
||||||
: Setting(parent, values, mutex, key, label)
|
: Setting(parent, values, mutex, key, label)
|
||||||
, mDefault(default_)
|
|
||||||
, mEditorActive(false)
|
, mEditorActive(false)
|
||||||
, mEditorPos(0)
|
, mEditorPos(0)
|
||||||
{
|
{
|
||||||
|
@ -30,7 +29,11 @@ namespace CSMPrefs
|
||||||
|
|
||||||
std::pair<QWidget*, QWidget*> ShortcutSetting::makeWidgets(QWidget* parent)
|
std::pair<QWidget*, QWidget*> ShortcutSetting::makeWidgets(QWidget* parent)
|
||||||
{
|
{
|
||||||
QString text = QString::fromUtf8(State::get().getShortcutManager().convertToString(mDefault).c_str());
|
QKeySequence sequence;
|
||||||
|
int modifier = 0;
|
||||||
|
State::get().getShortcutManager().getSequence(getKey(), sequence, modifier);
|
||||||
|
|
||||||
|
QString text = QString::fromUtf8(State::get().getShortcutManager().convertToString(sequence).c_str());
|
||||||
|
|
||||||
QLabel* label = new QLabel(QString::fromUtf8(getLabel().c_str()), parent);
|
QLabel* label = new QLabel(QString::fromUtf8(getLabel().c_str()), parent);
|
||||||
QPushButton* widget = new QPushButton(text, parent);
|
QPushButton* widget = new QPushButton(text, parent);
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace CSMPrefs
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ShortcutSetting(Category* parent, Settings::Manager* values, QMutex* mutex, const std::string& key,
|
ShortcutSetting(Category* parent, Settings::Manager* values, QMutex* mutex, const std::string& key,
|
||||||
const std::string& label, const QKeySequence& default_);
|
const std::string& label);
|
||||||
|
|
||||||
virtual std::pair<QWidget*, QWidget*> makeWidgets(QWidget* parent);
|
virtual std::pair<QWidget*, QWidget*> makeWidgets(QWidget* parent);
|
||||||
|
|
||||||
|
@ -29,8 +29,6 @@ namespace CSMPrefs
|
||||||
|
|
||||||
bool handleEvent(QObject* target, int mod, int value, bool active);
|
bool handleEvent(QObject* target, int mod, int value, bool active);
|
||||||
|
|
||||||
QKeySequence mDefault;
|
|
||||||
|
|
||||||
QPushButton* mButton;
|
QPushButton* mButton;
|
||||||
|
|
||||||
bool mEditorActive;
|
bool mEditorActive;
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "boolsetting.hpp"
|
#include "boolsetting.hpp"
|
||||||
#include "coloursetting.hpp"
|
#include "coloursetting.hpp"
|
||||||
#include "shortcutsetting.hpp"
|
#include "shortcutsetting.hpp"
|
||||||
|
#include "modifiersetting.hpp"
|
||||||
|
|
||||||
CSMPrefs::State *CSMPrefs::State::sThis = 0;
|
CSMPrefs::State *CSMPrefs::State::sThis = 0;
|
||||||
|
|
||||||
|
@ -292,6 +293,7 @@ void CSMPrefs::State::declare()
|
||||||
declareShortcut ("free-backward", "Free camera backward", QKeySequence(Qt::Key_S));
|
declareShortcut ("free-backward", "Free camera backward", QKeySequence(Qt::Key_S));
|
||||||
declareShortcut ("free-left", "Free camera left", QKeySequence(Qt::Key_A));
|
declareShortcut ("free-left", "Free camera left", QKeySequence(Qt::Key_A));
|
||||||
declareShortcut ("free-right", "Free camera right", QKeySequence(Qt::Key_D));
|
declareShortcut ("free-right", "Free camera right", QKeySequence(Qt::Key_D));
|
||||||
|
declareModifier ("free-forward", "Free camera speed modifier");
|
||||||
declareShortcut ("free-roll-left", "Free camera roll left", QKeySequence(Qt::Key_Q));
|
declareShortcut ("free-roll-left", "Free camera roll left", QKeySequence(Qt::Key_Q));
|
||||||
declareShortcut ("free-roll-right", "Free camera roll right", QKeySequence(Qt::Key_E));
|
declareShortcut ("free-roll-right", "Free camera roll right", QKeySequence(Qt::Key_E));
|
||||||
declareShortcut ("free-speed-mode", "Free camera speed mode toggle", QKeySequence(Qt::Key_F));
|
declareShortcut ("free-speed-mode", "Free camera speed mode toggle", QKeySequence(Qt::Key_F));
|
||||||
|
@ -301,6 +303,7 @@ void CSMPrefs::State::declare()
|
||||||
declareShortcut ("orbit-down", "Orbit camera down", QKeySequence(Qt::Key_S));
|
declareShortcut ("orbit-down", "Orbit camera down", QKeySequence(Qt::Key_S));
|
||||||
declareShortcut ("orbit-left", "Orbit camera left", QKeySequence(Qt::Key_A));
|
declareShortcut ("orbit-left", "Orbit camera left", QKeySequence(Qt::Key_A));
|
||||||
declareShortcut ("orbit-right", "Orbit camera right", QKeySequence(Qt::Key_D));
|
declareShortcut ("orbit-right", "Orbit camera right", QKeySequence(Qt::Key_D));
|
||||||
|
declareModifier ("orbit-up", "Orbit camera speed modifier");
|
||||||
declareShortcut ("orbit-roll-left", "Orbit camera roll left", QKeySequence(Qt::Key_Q));
|
declareShortcut ("orbit-roll-left", "Orbit camera roll left", QKeySequence(Qt::Key_Q));
|
||||||
declareShortcut ("orbit-roll-right", "Orbit camera roll right", QKeySequence(Qt::Key_E));
|
declareShortcut ("orbit-roll-right", "Orbit camera roll right", QKeySequence(Qt::Key_E));
|
||||||
declareShortcut ("orbit-speed-mode", "Orbit camera speed mode toggle", QKeySequence(Qt::Key_F));
|
declareShortcut ("orbit-speed-mode", "Orbit camera speed mode toggle", QKeySequence(Qt::Key_F));
|
||||||
|
@ -452,7 +455,19 @@ CSMPrefs::ShortcutSetting& CSMPrefs::State::declareShortcut (const std::string&
|
||||||
getShortcutManager().setSequence(key, sequence, mod);
|
getShortcutManager().setSequence(key, sequence, mod);
|
||||||
|
|
||||||
CSMPrefs::ShortcutSetting *setting = new CSMPrefs::ShortcutSetting (&mCurrentCategory->second, &mSettings, &mMutex,
|
CSMPrefs::ShortcutSetting *setting = new CSMPrefs::ShortcutSetting (&mCurrentCategory->second, &mSettings, &mMutex,
|
||||||
key, label, sequence);
|
key, label);
|
||||||
|
mCurrentCategory->second.addSetting (setting);
|
||||||
|
|
||||||
|
return *setting;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSMPrefs::ModifierSetting& CSMPrefs::State::declareModifier(const std::string& key, const std::string& label)
|
||||||
|
{
|
||||||
|
if (mCurrentCategory==mCategories.end())
|
||||||
|
throw std::logic_error ("no category for setting");
|
||||||
|
|
||||||
|
CSMPrefs::ModifierSetting *setting = new CSMPrefs::ModifierSetting (&mCurrentCategory->second, &mSettings, &mMutex,
|
||||||
|
key, label);
|
||||||
mCurrentCategory->second.addSetting (setting);
|
mCurrentCategory->second.addSetting (setting);
|
||||||
|
|
||||||
return *setting;
|
return *setting;
|
||||||
|
|
|
@ -27,6 +27,7 @@ namespace CSMPrefs
|
||||||
class BoolSetting;
|
class BoolSetting;
|
||||||
class ColourSetting;
|
class ColourSetting;
|
||||||
class ShortcutSetting;
|
class ShortcutSetting;
|
||||||
|
class ModifierSetting;
|
||||||
|
|
||||||
/// \brief User settings state
|
/// \brief User settings state
|
||||||
///
|
///
|
||||||
|
@ -77,6 +78,8 @@ namespace CSMPrefs
|
||||||
ShortcutSetting& declareShortcut (const std::string& key, const std::string& label,
|
ShortcutSetting& declareShortcut (const std::string& key, const std::string& label,
|
||||||
const QKeySequence& default_, int modifier_=0);
|
const QKeySequence& default_, int modifier_=0);
|
||||||
|
|
||||||
|
ModifierSetting& declareModifier(const std::string& key, const std::string& label);
|
||||||
|
|
||||||
void declareSeparator();
|
void declareSeparator();
|
||||||
|
|
||||||
void setDefault (const std::string& key, const std::string& default_);
|
void setDefault (const std::string& key, const std::string& default_);
|
||||||
|
|
Loading…
Reference in a new issue