summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/widgets/qdatetimeedit
diff options
context:
space:
mode:
authorNathan Collins <nathan.collins@kdab.com>2018-05-18 16:27:43 +0100
committerMitch Curtis <mitch.curtis@qt.io>2018-07-12 09:07:32 +0000
commite40f23f098a1e79c22df611b6312317582b95a3a (patch)
tree560661f5d96dc498ea6ce5fc6880c82f878ae38a /tests/auto/widgets/widgets/qdatetimeedit
parent21291d78c528b798252a046db4f17872132259f4 (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.cpp327
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();