diff options
author | Nathan Collins <nathan.collins@kdab.com> | 2018-05-18 16:27:43 +0100 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2018-07-12 09:07:32 +0000 |
commit | e40f23f098a1e79c22df611b6312317582b95a3a (patch) | |
tree | 560661f5d96dc498ea6ce5fc6880c82f878ae38a /tests/auto/widgets/widgets/qdatetimeedit | |
parent | 21291d78c528b798252a046db4f17872132259f4 (diff) |
Add QStyle::SH_SpinBox_StepModifier style hint
This patch allows the developer to pick which keyboard modifier
increases the number of steps a QAbstractSpinBox takes when the user
interacts with it.
The modifier can be either Qt::ControlModifier (default),
Qt::ShiftModifier or Qt::NoModifier. Qt::NoModifier disables the step
modifier. Note that on macOS, Control corresponds to the Command key.
Holding the modifier increases the step rate when:
- scrolling;
- pressing the up/down keys;
- pressing the spin box up/down buttons.
[ChangeLog][QtWidgets][QStyle] QStyle::SH_SpinBox_StepModifier allows
the developer to pick which keyboard modifier increases the number of
steps a QAbstractSpinBox takes for the following interactions:
scrolling, up/down keyboard keys and the spin box buttons. The
Qt::ShiftModifier can now be used, or the feature can be disabled
using Qt::NoModifier. Previously, only Qt::ControlModifier could be
used as the modifier.
Change-Id: Ib5518127e86a8f67798a9a1d6e860c6e35896e6f
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'tests/auto/widgets/widgets/qdatetimeedit')
-rw-r--r-- | tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp | 327 |
1 files changed, 219 insertions, 108 deletions
diff --git a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp index 0fe5b48341..3c7a297f64 100644 --- a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp +++ b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp @@ -114,6 +114,26 @@ public: } }; +class StepModifierStyle : public QProxyStyle +{ + Q_OBJECT +public: + using QProxyStyle::QProxyStyle; + + int styleHint(QStyle::StyleHint hint, const QStyleOption *option = nullptr, + const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override + { + switch (hint) { + case QStyle::SH_SpinBox_StepModifier: + return stepModifier; + default: + return QProxyStyle::styleHint(hint, option, widget, returnData); + } + } + + Qt::KeyboardModifier stepModifier = Qt::ControlModifier; +}; + class tst_QDateTimeEdit : public QObject { Q_OBJECT @@ -295,6 +315,12 @@ static QLatin1String modifierToName(Qt::KeyboardModifier modifier) case Qt::ShiftModifier: return QLatin1Literal("Shift"); break; + case Qt::AltModifier: + return QLatin1Literal("Alt"); + break; + case Qt::MetaModifier: + return QLatin1Literal("Meta"); + break; default: qFatal("Unexpected keyboard modifier"); return QLatin1String(); @@ -3110,6 +3136,7 @@ void tst_QDateTimeEdit::wheelEvent_data() #if QT_CONFIG(wheelevent) QTest::addColumn<QPoint>("angleDelta"); QTest::addColumn<int>("qt4Delta"); + QTest::addColumn<int>("stepModifier"); QTest::addColumn<Qt::KeyboardModifiers>("modifiers"); QTest::addColumn<Qt::MouseEventSource>("source"); QTest::addColumn<QDateTimeEdit::Section>("section"); @@ -3121,8 +3148,14 @@ void tst_QDateTimeEdit::wheelEvent_data() const auto directions = {true, false}; const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, Qt::ControlModifier, - Qt::ShiftModifier}; + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; const auto sources = {Qt::MouseEventNotSynthesized, Qt::MouseEventSynthesizedBySystem, @@ -3148,73 +3181,82 @@ void tst_QDateTimeEdit::wheelEvent_data() if (modifierName.isEmpty()) continue; - const int steps = (modifier & Qt::ControlModifier ? 10 : 1) - * (up ? 1 : -1); + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; + + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); - for (auto source : sources) { + for (auto source : sources) { #ifdef Q_OS_MACOS - QPoint angleDelta; - if ((modifier & Qt::ShiftModifier) && - source == Qt::MouseEventNotSynthesized) { - // On macOS the Shift modifier converts vertical - // mouse wheel events to horizontal. - angleDelta = { units, 0 }; - } else { - // However, this is not the case for trackpad scroll - // events. - angleDelta = { 0, units }; - } + QPoint angleDelta; + if ((modifier & Qt::ShiftModifier) && + source == Qt::MouseEventNotSynthesized) { + // On macOS the Shift modifier converts vertical + // mouse wheel events to horizontal. + angleDelta = { units, 0 }; + } else { + // However, this is not the case for trackpad scroll + // events. + angleDelta = { 0, units }; + } #else - const QPoint angleDelta(0, units); + const QPoint angleDelta(0, units); #endif - QLatin1String sourceName; - switch (source) { - case Qt::MouseEventNotSynthesized: - sourceName = QLatin1Literal("NotSynthesized"); - break; - case Qt::MouseEventSynthesizedBySystem: - sourceName = QLatin1Literal("SynthesizedBySystem"); - break; - case Qt::MouseEventSynthesizedByQt: - sourceName = QLatin1Literal("SynthesizedByQt"); - break; - case Qt::MouseEventSynthesizedByApplication: - sourceName = QLatin1Literal("SynthesizedByApplication"); - break; - default: - qFatal("Unexpected wheel event source"); - continue; - } - - for (const auto section : sections) { - - DateList expectedDates; - if (fraction) - expectedDates << startDate; - - const auto expectedDate = stepDate(startDate, section, steps); - if (!expectedDate.isValid()) + QLatin1String sourceName; + switch (source) { + case Qt::MouseEventNotSynthesized: + sourceName = QLatin1Literal("NotSynthesized"); + break; + case Qt::MouseEventSynthesizedBySystem: + sourceName = QLatin1Literal("SynthesizedBySystem"); + break; + case Qt::MouseEventSynthesizedByQt: + sourceName = QLatin1Literal("SynthesizedByQt"); + break; + case Qt::MouseEventSynthesizedByApplication: + sourceName = QLatin1Literal("SynthesizedByApplication"); + break; + default: + qFatal("Unexpected wheel event source"); continue; - - expectedDates << expectedDate; - - const QLatin1String sectionName = sectionToName(section); - - QTest::addRow("%s%s%sWith%sKeyboardModifier%s", - fraction ? "half" : "full", - up ? "Up" : "Down", - sectionName.latin1(), - modifierName.latin1(), - sourceName.latin1()) - << angleDelta - << units - << modifiers - << source - << section - << startDate - << expectedDates; + } + + for (const auto section : sections) { + + DateList expectedDates; + if (fraction) + expectedDates << startDate; + + const auto expectedDate = stepDate(startDate, section, steps); + if (!expectedDate.isValid()) + continue; + + expectedDates << expectedDate; + + const QLatin1String sectionName = sectionToName(section); + + QTest::addRow("%s%s%s%sWith%sKeyboardModifier%s", + fraction ? "half" : "full", + up ? "Up" : "Down", + stepModifierName.latin1(), + sectionName.latin1(), + modifierName.latin1(), + sourceName.latin1()) + << angleDelta + << units + << static_cast<int>(stepModifier) + << modifiers + << source + << section + << startDate + << expectedDates; + } } } } @@ -3230,6 +3272,7 @@ void tst_QDateTimeEdit::wheelEvent() #if QT_CONFIG(wheelevent) QFETCH(QPoint, angleDelta); QFETCH(int, qt4Delta); + QFETCH(int, stepModifier); QFETCH(Qt::KeyboardModifiers, modifiers); QFETCH(Qt::MouseEventSource, source); QFETCH(QDateTimeEdit::Section, section); @@ -3240,6 +3283,11 @@ void tst_QDateTimeEdit::wheelEvent() edit.setDate(startDate); edit.setCurrentSection(section); + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> style( + new StepModifierStyle); + style->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + edit.setStyle(style.data()); + QWheelEvent event(QPointF(), QPointF(), QPoint(), angleDelta, qt4Delta, Qt::Vertical, Qt::NoButton, modifiers, Qt::NoScrollPhase, source); @@ -3977,6 +4025,7 @@ void tst_QDateTimeEdit::dateEditCorrectSectionSize() void tst_QDateTimeEdit::stepModifierKeys_data() { QTest::addColumn<QDate>("startDate"); + QTest::addColumn<int>("stepModifier"); QTest::addColumn<QDateTimeEdit::Section>("section"); QTest::addColumn<QTestEventList>("keys"); QTest::addColumn<QDate>("expectedDate"); @@ -3984,8 +4033,14 @@ void tst_QDateTimeEdit::stepModifierKeys_data() const auto keyList = {Qt::Key_Up, Qt::Key_Down}; const auto modifierList = {Qt::NoModifier, - Qt::ControlModifier, - Qt::ShiftModifier}; + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; const auto sections = {QDateTimeEdit::DaySection, QDateTimeEdit::MonthSection, @@ -4007,25 +4062,34 @@ void tst_QDateTimeEdit::stepModifierKeys_data() if (modifierName.isEmpty()) continue; - const int steps = (modifier & Qt::ControlModifier ? 10 : 1) - * (up ? 1 : -1); + for (auto stepModifier : validStepModifierList) { - for (const auto section : sections) { - - const auto expectedDate = stepDate(startDate, section, steps); - if (!expectedDate.isValid()) + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) continue; - const auto sectionName = sectionToName(section); + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); - QTest::addRow("%s%sWith%sKeyboardModifier", - up ? "up" : "down", - sectionName.latin1(), - modifierName.latin1()) - << startDate - << section - << keys - << expectedDate; + for (const auto section : sections) { + + const auto expectedDate = stepDate(startDate, section, steps); + if (!expectedDate.isValid()) + continue; + + const auto sectionName = sectionToName(section); + + QTest::addRow("%s%s%sWith%sKeyboardModifier", + up ? "up" : "down", + stepModifierName.latin1(), + sectionName.latin1(), + modifierName.latin1()) + << startDate + << static_cast<int>(stepModifier) + << section + << keys + << expectedDate; + } } } } @@ -4034,6 +4098,7 @@ void tst_QDateTimeEdit::stepModifierKeys_data() void tst_QDateTimeEdit::stepModifierKeys() { QFETCH(QDate, startDate); + QFETCH(int, stepModifier); QFETCH(QDateTimeEdit::Section, section); QFETCH(QTestEventList, keys); QFETCH(QDate, expectedDate); @@ -4044,6 +4109,11 @@ void tst_QDateTimeEdit::stepModifierKeys() QVERIFY(QTest::qWaitForWindowActive(&edit)); edit.setCurrentSection(section); + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> style( + new StepModifierStyle); + style->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + edit.setStyle(style.data()); + QCOMPARE(edit.date(), startDate); keys.simulate(&edit); QCOMPARE(edit.date(), expectedDate); @@ -4052,6 +4122,7 @@ void tst_QDateTimeEdit::stepModifierKeys() void tst_QDateTimeEdit::stepModifierButtons_data() { QTest::addColumn<QStyle::SubControl>("subControl"); + QTest::addColumn<int>("stepModifier"); QTest::addColumn<Qt::KeyboardModifiers>("modifiers"); QTest::addColumn<QDateTimeEdit::Section>("section"); QTest::addColumn<QTime>("startTime"); @@ -4060,8 +4131,14 @@ void tst_QDateTimeEdit::stepModifierButtons_data() const auto subControls = {QStyle::SC_SpinBoxUp, QStyle::SC_SpinBoxDown}; const auto modifierList = {Qt::NoModifier, - Qt::ControlModifier, - Qt::ShiftModifier}; + Qt::ShiftModifier, + Qt::ControlModifier, + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; const auto sections = {QDateTimeEdit::SecondSection, QDateTimeEdit::MinuteSection, @@ -4082,26 +4159,35 @@ void tst_QDateTimeEdit::stepModifierButtons_data() if (modifierName.isEmpty()) continue; - const int steps = (modifier & Qt::ControlModifier ? 10 : 1) - * (up ? 1 : -1); - - for (const auto section : sections) { + for (auto stepModifier : validStepModifierList) { - const auto expectedTime = stepTime(startTime, section, steps); - if (!expectedTime.isValid()) + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) continue; - const auto sectionName = sectionToName(section); + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); - QTest::addRow("%s%sWith%sKeyboardModifier", - up ? "up" : "down", - sectionName.latin1(), - modifierName.latin1()) - << subControl - << modifiers - << section - << startTime - << expectedTime; + for (const auto section : sections) { + + const auto expectedTime = stepTime(startTime, section, steps); + if (!expectedTime.isValid()) + continue; + + const auto sectionName = sectionToName(section); + + QTest::addRow("%s%s%sWith%sKeyboardModifier", + up ? "up" : "down", + stepModifierName.latin1(), + sectionName.latin1(), + modifierName.latin1()) + << subControl + << static_cast<int>(stepModifier) + << modifiers + << section + << startTime + << expectedTime; + } } } } @@ -4110,6 +4196,7 @@ void tst_QDateTimeEdit::stepModifierButtons_data() void tst_QDateTimeEdit::stepModifierButtons() { QFETCH(QStyle::SubControl, subControl); + QFETCH(int, stepModifier); QFETCH(Qt::KeyboardModifiers, modifiers); QFETCH(QDateTimeEdit::Section, section); QFETCH(QTime, startTime); @@ -4121,6 +4208,11 @@ void tst_QDateTimeEdit::stepModifierButtons() QVERIFY(QTest::qWaitForWindowActive(&edit)); edit.setCurrentSection(section); + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> style( + new StepModifierStyle); + style->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + edit.setStyle(style.data()); + QStyleOptionSpinBox spinBoxStyleOption; edit.initStyleOption(&spinBoxStyleOption); @@ -4135,14 +4227,21 @@ void tst_QDateTimeEdit::stepModifierButtons() void tst_QDateTimeEdit::stepModifierPressAndHold_data() { QTest::addColumn<QStyle::SubControl>("subControl"); + QTest::addColumn<int>("stepModifier"); QTest::addColumn<Qt::KeyboardModifiers>("modifiers"); QTest::addColumn<int>("expectedStepModifier"); const auto subControls = {QStyle::SC_SpinBoxUp, QStyle::SC_SpinBoxDown}; const auto modifierList = {Qt::NoModifier, + Qt::ShiftModifier, Qt::ControlModifier, - Qt::ShiftModifier}; + Qt::AltModifier, + Qt::MetaModifier}; + + const auto validStepModifierList = {Qt::NoModifier, + Qt::ControlModifier, + Qt::ShiftModifier}; for (auto subControl : subControls) { @@ -4157,15 +4256,24 @@ void tst_QDateTimeEdit::stepModifierPressAndHold_data() if (modifierName.isEmpty()) continue; - const int steps = (modifier & Qt::ControlModifier ? 10 : 1) - * (up ? 1 : -1); + for (auto stepModifier : validStepModifierList) { + + const auto stepModifierName = modifierToName(stepModifier); + if (stepModifierName.isEmpty()) + continue; - QTest::addRow("%sWith%sKeyboardModifier", - up ? "up" : "down", - modifierName.latin1()) - << subControl - << modifiers - << steps; + const int steps = (modifier & stepModifier ? 10 : 1) + * (up ? 1 : -1); + + QTest::addRow("%s%sWith%sKeyboardModifier", + up ? "up" : "down", + stepModifierName.latin1(), + modifierName.latin1()) + << subControl + << static_cast<int>(stepModifier) + << modifiers + << steps; + } } } } @@ -4173,17 +4281,20 @@ void tst_QDateTimeEdit::stepModifierPressAndHold_data() void tst_QDateTimeEdit::stepModifierPressAndHold() { QFETCH(QStyle::SubControl, subControl); + QFETCH(int, stepModifier); QFETCH(Qt::KeyboardModifiers, modifiers); QFETCH(int, expectedStepModifier); const QDate startDate(2000, 1, 1); EditorDateEdit edit(0); - QScopedPointer<PressAndHoldStyle, QScopedPointerDeleteLater> pressAndHoldStyle( - new PressAndHoldStyle); - edit.setStyle(pressAndHoldStyle.data()); edit.setDate(startDate); + QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> stepModifierStyle( + new StepModifierStyle(new PressAndHoldStyle)); + stepModifierStyle->stepModifier = static_cast<Qt::KeyboardModifier>(stepModifier); + edit.setStyle(stepModifierStyle.data()); + QSignalSpy spy(&edit, &EditorDateEdit::dateChanged); edit.show(); |