Prevent accidental edits of actions and conditions when scrolling

This commit is contained in:
WarmUpTill 2021-07-18 14:16:04 +02:00 committed by WarmUpTill
parent 95409dfa26
commit 84e4b740a8
6 changed files with 55 additions and 5 deletions

View File

@ -34,7 +34,7 @@ private:
static std::map<std::string, MacroActionInfo> _methods;
};
class MacroActionEdit : public QWidget {
class MacroActionEdit : public MacroSegmentEdit {
Q_OBJECT
public:

View File

@ -35,7 +35,7 @@ private:
static std::map<std::string, MacroConditionInfo> _methods;
};
class MacroConditionEdit : public QWidget {
class MacroConditionEdit : public MacroSegmentEdit {
Q_OBJECT
public:

View File

@ -159,3 +159,23 @@ public:
void ResolveMacroRef();
MacroRef _macro;
};
// TODO: Rework macro condition and action edit to allow moving control
// handling to MacroSegmentEdit
class MacroSegmentEdit : public QWidget {
Q_OBJECT
public:
MacroSegmentEdit(QWidget *parent = nullptr);
// Use this function to avoid accidental edits when scrolling through
// list of actions and conditions
void SetFocusPolicyOfWidgets();
};
class MouseWheelWidgetAdjustmentGuard : public QObject {
public:
explicit MouseWheelWidgetAdjustmentGuard(QObject *parent);
protected:
bool eventFilter(QObject *o, QEvent *e) override;
};

View File

@ -60,7 +60,7 @@ static inline void populateActionSelection(QComboBox *list)
MacroActionEdit::MacroActionEdit(QWidget *parent,
std::shared_ptr<MacroAction> *entryData,
const std::string &id)
: QWidget(parent), _entryData(entryData)
: MacroSegmentEdit(parent), _entryData(entryData)
{
_actionSelection = new QComboBox();
_section = new Section(300);
@ -140,6 +140,7 @@ void MacroActionEdit::ActionSelectionChanged(const QString &text)
QWidget::connect(widget, SIGNAL(HeaderInfoChanged(const QString &)),
this, SLOT(HeaderInfoChanged(const QString &)));
_section->SetContent(widget, false);
SetFocusPolicyOfWidgets();
}
void MacroActionEdit::UpdateEntryData(const std::string &id)
@ -152,6 +153,7 @@ void MacroActionEdit::UpdateEntryData(const std::string &id)
HeaderInfoChanged(
QString::fromStdString((*_entryData)->GetShortDesc()));
_section->SetContent(widget, (*_entryData)->GetCollapsed());
SetFocusPolicyOfWidgets();
}
void MacroActionEdit::HeaderInfoChanged(const QString &text)

View File

@ -88,7 +88,7 @@ static inline void populateConditionSelection(QComboBox *list)
MacroConditionEdit::MacroConditionEdit(
QWidget *parent, std::shared_ptr<MacroCondition> *entryData,
const std::string &id, bool root)
: QWidget(parent), _isRoot(root), _entryData(entryData)
: MacroSegmentEdit(parent), _isRoot(root), _entryData(entryData)
{
_logicSelection = new QComboBox();
_conditionSelection = new QComboBox();
@ -164,7 +164,6 @@ void MacroConditionEdit::leaveEvent(QEvent *)
{
_controls->Show(false);
}
void MacroConditionEdit::LogicSelectionChanged(int idx)
{
if (_loading || !_entryData) {
@ -216,6 +215,7 @@ void MacroConditionEdit::UpdateEntryData(const std::string &id)
_dur->setVisible(MacroConditionFactory::UsesDurationConstraint(id));
auto constraint = (*_entryData)->GetDurationConstraint();
_dur->SetValue(constraint);
SetFocusPolicyOfWidgets();
}
void MacroConditionEdit::ConditionSelectionChanged(const QString &text)
@ -241,6 +241,7 @@ void MacroConditionEdit::ConditionSelectionChanged(const QString &text)
this, SLOT(HeaderInfoChanged(const QString &)));
_section->SetContent(widget, false);
_dur->setVisible(MacroConditionFactory::UsesDurationConstraint(id));
SetFocusPolicyOfWidgets();
}
void MacroConditionEdit::DurationChanged(double seconds)

View File

@ -649,3 +649,30 @@ void MacroRefAction::ResolveMacroRef()
{
_macro.UpdateRef();
}
MouseWheelWidgetAdjustmentGuard::MouseWheelWidgetAdjustmentGuard(QObject *parent)
: QObject(parent)
{
}
bool MouseWheelWidgetAdjustmentGuard::eventFilter(QObject *o, QEvent *e)
{
const QWidget *widget = static_cast<QWidget *>(o);
if (e->type() == QEvent::Wheel && widget && !widget->hasFocus()) {
e->ignore();
return true;
}
return QObject::eventFilter(o, e);
}
MacroSegmentEdit::MacroSegmentEdit(QWidget *parent) : QWidget(parent) {}
void MacroSegmentEdit::SetFocusPolicyOfWidgets()
{
QList<QWidget *> widgets = this->findChildren<QWidget *>();
for (auto w : widgets) {
w->setFocusPolicy(Qt::StrongFocus);
w->installEventFilter(new MouseWheelWidgetAdjustmentGuard(w));
}
}