HAL
settings_widget_keybind.cpp
Go to the documentation of this file.
5 
6 #include <QFormLayout>
7 #include <QVBoxLayout>
8 #include <QLabel>
9 #include <QPair>
10 
11 #include <QCheckBox>
12 #include <QKeySequenceEdit>
13 #include <QStringList>
14 #include <QTimer>
15 #include "gui/gui_globals.h"
16 
18 
19 namespace hal
20 {
22  : SettingsWidget(item, parent)
23  {
24 
27 
28  QLabel* label = new QLabel(this);
29  layout->addWidget(label);
30 
31  mKeybindEdit = new KeybindEdit(this);
32  connect(mKeybindEdit, &QKeySequenceEdit::editingFinished, this, &SettingsWidgetKeybind::clearErrorMessage);
33  connect(mKeybindEdit, &KeybindEdit::editAccepted, this, &SettingsWidgetKeybind::onKeybindEditAccepted);
34  connect(mKeybindEdit, &KeybindEdit::editRejected, this, &SettingsWidgetKeybind::onKeybindEditRejected);
35  layout->addWidget(mKeybindEdit);
36 
37  mErrorMessage = new QLabel(this);
38  mErrorMessage->setStyleSheet("color: red;");
39  layout->addWidget(mErrorMessage);
40  load(item->value());
41  }
42 
44  {
46  QKeySequence currentSeq(value.toString());
47  mKeybindEdit->load(currentSeq, sik);
48  mErrorMessage->setText(QString());
49  }
50 
52  {
53  QKeySequence seq = mKeybindEdit->keySequence();
54  if (seq.isEmpty())
56  return QVariant(seq); // auto-cast
57  }
58 
59  bool SettingsWidgetKeybind::isKeybindUsed(const QVariant& testValue)
60  {
61  if (!mSettingsItem) return false;
62  const SettingsItemKeybind* setting = static_cast<const SettingsItemKeybind*>(mSettingsItem);
63  QKeySequence testKey = testValue.toString();
65  if (item && item!=setting)
66  {
67  onKeybindEditRejected(QString("<%1> is already assigned:\n<%2>")
68  .arg(testKey.toString())
69  .arg(item->label()));
70  return true;
71  }
72  return false;
73  }
74 
76  {
77  if (isKeybindUsed(mSettingsItem->value())) return;
79  }
80 
82  {
83  if (!setAll)
84  {
85  if (isKeybindUsed(mSettingsItem->defaultValue())) return;
86  }
88  }
89 
90  void SettingsWidgetKeybind::onKeybindEditAccepted()
91  {
93  }
94 
95  void SettingsWidgetKeybind::clearErrorMessage()
96  {
97  mErrorMessage->setText(QString());
98  }
99 
101  {
102  mKeybindEdit->clear();
103  }
104 
105  void SettingsWidgetKeybind::onKeybindEditRejected(const QString& errMsg)
106  {
107  mErrorMessage->setText(errMsg);
108 
109  QTimer::singleShot(2500, this, &SettingsWidgetKeybind::clearErrorMessage);
110  }
111 }
SettingsItemKeybind * currentAssignment(const QKeySequence &needle) const
static AssignedKeybindMap * instance()
A widget to set or configure key shortcuts.
Definition: keybind_edit.h:46
void editRejected(QString errmsg)
void load(const QKeySequence &seq, SettingsItemKeybind *item)
virtual QVariant value() const =0
virtual QString label() const
virtual QVariant defaultValue() const =0
A SettingsItem to modify keybinds.
virtual QVariant value() const override
The base class for all specific SettingsWidgets.
virtual void handleSetDefaultValue(bool setAll=false)
SettingsItem * mSettingsItem
QBoxLayout * mContainer
virtual void handleRevertModification()
virtual void load(const QVariant &value) override
virtual QVariant value() override
SettingsWidgetKeybind(SettingsItemKeybind *item, QWidget *parent=nullptr)
virtual void clearEditor() override
void handleSetDefaultValue(bool setAll=false) override
void addLayout(QLayout *layout, int stretch)
bool isEmpty() const const
QString toString(QKeySequence::SequenceFormat format) const const
void editingFinished()
void setText(const QString &)
void addWidget(QWidget *w)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString toString() const const
QLayout * layout() const const
void setStyleSheet(const QString &styleSheet)