Skip to content

Commit

Permalink
Merge pull request #5665 from jthistle/297176-scroll-prevent-inspector
Browse files Browse the repository at this point in the history
fix #297176: prevent scrolling on non-focussed spinboxes and comboboxes
  • Loading branch information
dmitrio95 committed Mar 17, 2020
2 parents 6fb9106 + ff08e84 commit 1ba354e
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 0 deletions.
33 changes: 33 additions & 0 deletions mscore/inspector/inspectorBase.cpp
Expand Up @@ -48,6 +48,7 @@ InspectorBase::InspectorBase(QWidget* parent)
_layout->setSpacing(0);
_layout->setContentsMargins(0, 10, 0, 0);
_layout->addStretch(100);
scrollPreventer = new InspectorScrollPreventer(this);
}

//---------------------------------------------------------
Expand Down Expand Up @@ -570,6 +571,16 @@ void InspectorBase::mapSignals(const std::vector<InspectorItem>& il, const std::
QWidget* w = ii.w;
if (!w)
continue;

if (qobject_cast<QAbstractSpinBox*>(w)
|| qobject_cast<QComboBox*>(w)) {
w->setFocusPolicy(Qt::StrongFocus);
w->installEventFilter(scrollPreventer);
}
else if (qobject_cast<OffsetSelect*>(w)) {
qobject_cast<OffsetSelect*>(w)->installScrollPreventer(scrollPreventer);
}

if (qobject_cast<QDoubleSpinBox*>(w))
connect(qobject_cast<QDoubleSpinBox*>(w), QOverload<double>::of(&QDoubleSpinBox::valueChanged), [=] { valueChanged(i); });
else if (qobject_cast<QSpinBox*>(w))
Expand Down Expand Up @@ -655,6 +666,28 @@ void InspectorBase::resetToStyle()
score->endCmd();
}

//---------------------------------------------------------
// eventFilter
/// This blocks scrolling on a scrollable thing when not in focus.
/// `watched` should be a QComboBox or QAbstractSpinBox.
/// If this event filter is on any non-QWidget, it will crash.
//---------------------------------------------------------

bool InspectorScrollPreventer::eventFilter(QObject* watched, QEvent* event)
{
if (event->type() != QEvent::Wheel)
return QObject::eventFilter(watched, event);

if (!qobject_cast<QWidget*>(watched)->hasFocus())
return true;

return QObject::eventFilter(watched, event);
}

//---------------------------------------------------------
// event
//---------------------------------------------------------

void InspectorEventObserver::event(EventType evtType, const InspectorItem& ii, const Element* e)
{
#ifdef BUILD_TELEMETRY_MODULE
Expand Down
16 changes: 16 additions & 0 deletions mscore/inspector/inspectorBase.h
Expand Up @@ -20,6 +20,7 @@ namespace Ms {

class Inspector;
class Element;
class InspectorScrollPreventer;

//---------------------------------------------------------
// InspectorPanel
Expand Down Expand Up @@ -53,6 +54,7 @@ class InspectorBase : public QWidget {
void checkDifferentValues(const InspectorItem&);
bool compareValues(const InspectorItem& ii, QVariant a, QVariant b);
Element* effectiveElement(const InspectorItem&) const;
InspectorScrollPreventer* scrollPreventer;

signals:
void elementChanged();
Expand Down Expand Up @@ -87,6 +89,20 @@ class InspectorBase : public QWidget {
friend class InspectorScriptEntry;
};

//---------------------------------------------------------
// InspectorScrollPreventer
//---------------------------------------------------------

class InspectorScrollPreventer : public QObject {
Q_OBJECT

protected:
bool eventFilter(QObject* watched, QEvent* event) override;

public:
InspectorScrollPreventer(QObject* parent) : QObject(parent) {};
};

//---------------------------------------------------------
// InspectorEventObserver
//---------------------------------------------------------
Expand Down
7 changes: 7 additions & 0 deletions mscore/inspector/offsetSelect.cpp
Expand Up @@ -14,6 +14,7 @@
#include "libmscore/types.h"
#include "icons.h"
#include "musescore.h"
#include "inspectorBase.h"

namespace Ms {

Expand Down Expand Up @@ -104,6 +105,12 @@ void OffsetSelect::setOffset(const QPointF& o)
blockOffset(false);
}

void OffsetSelect::installScrollPreventer(InspectorScrollPreventer* sp)
{
xVal->installEventFilter(sp);
yVal->installEventFilter(sp);
}

}


3 changes: 3 additions & 0 deletions mscore/inspector/offsetSelect.h
Expand Up @@ -17,6 +17,8 @@

namespace Ms {

class InspectorScrollPreventer;

//---------------------------------------------------------
// OffsetSelect
//---------------------------------------------------------
Expand All @@ -38,6 +40,7 @@ class OffsetSelect : public QWidget, public Ui::OffsetSelect {
QPointF offset() const;
void setOffset(const QPointF&);
void showRaster(bool);
void installScrollPreventer(InspectorScrollPreventer* sp);
};

}
Expand Down
6 changes: 6 additions & 0 deletions mscore/inspector/offset_select.ui
Expand Up @@ -36,6 +36,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Horizontal offset</string>
</property>
Expand Down Expand Up @@ -78,6 +81,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Vertical offset</string>
</property>
Expand Down

0 comments on commit 1ba354e

Please sign in to comment.