From 70bc6f4f71b1c7001376b54cfb16ca75832ca62b Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Sun, 24 Apr 2022 23:55:19 +0200 Subject: [PATCH] Add pageStep --- lib/src/base_spin_box.dart | 14 +++++++++---- lib/src/cupertino/spin_box.dart | 7 +++++++ lib/src/material/spin_box.dart | 7 +++++++ test/test_spinbox.dart | 36 +++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/lib/src/base_spin_box.dart b/lib/src/base_spin_box.dart index 426e086..449b35d 100644 --- a/lib/src/base_spin_box.dart +++ b/lib/src/base_spin_box.dart @@ -33,6 +33,7 @@ abstract class BaseSpinBox extends StatefulWidget { double get min; double get max; double get step; + double get pageStep; double get value; int get decimals; int get digits; @@ -66,8 +67,10 @@ mixin SpinBoxMixin on State { return { // ### TODO: use SingleActivator fixed in Flutter 2.10+ // https://github.com/flutter/flutter/issues/92717 - LogicalKeySet(LogicalKeyboardKey.arrowUp): _increaseValue, - LogicalKeySet(LogicalKeyboardKey.arrowDown): _decreaseValue, + LogicalKeySet(LogicalKeyboardKey.arrowUp): _stepUp, + LogicalKeySet(LogicalKeyboardKey.arrowDown): _stepDown, + LogicalKeySet(LogicalKeyboardKey.pageUp): _pageStepUp, + LogicalKeySet(LogicalKeyboardKey.pageDown): _pageStepDown, }; } @@ -92,8 +95,11 @@ mixin SpinBoxMixin on State { super.dispose(); } - void _increaseValue() => setValue(value + widget.step); - void _decreaseValue() => setValue(value - widget.step); + void _stepUp() => setValue(value + widget.step); + void _stepDown() => setValue(value - widget.step); + + void _pageStepUp() => setValue(value + widget.pageStep); + void _pageStepDown() => setValue(value - widget.pageStep); void _updateValue() { final v = _parseValue(_controller.text); diff --git a/lib/src/cupertino/spin_box.dart b/lib/src/cupertino/spin_box.dart index 1d92f8b..143f6d4 100644 --- a/lib/src/cupertino/spin_box.dart +++ b/lib/src/cupertino/spin_box.dart @@ -52,6 +52,7 @@ class CupertinoSpinBox extends BaseSpinBox { this.min = 0, this.max = 100, this.step = 1, + this.pageStep = 10, this.value = 0, this.interval = const Duration(milliseconds: 100), this.acceleration, @@ -119,6 +120,12 @@ class CupertinoSpinBox extends BaseSpinBox { @override final double step; + /// The page step size for incrementing and decrementing the value. + /// + /// Defaults to `10.0`. + @override + final double pageStep; + /// The current value. /// /// Defaults to `0.0`. diff --git a/lib/src/material/spin_box.dart b/lib/src/material/spin_box.dart index 6a6ab2b..6d277b2 100644 --- a/lib/src/material/spin_box.dart +++ b/lib/src/material/spin_box.dart @@ -53,6 +53,7 @@ class SpinBox extends BaseSpinBox { this.min = 0, this.max = 100, this.step = 1, + this.pageStep = 10, this.value = 0, this.interval = const Duration(milliseconds: 100), this.acceleration, @@ -117,6 +118,12 @@ class SpinBox extends BaseSpinBox { @override final double step; + /// The page step size for incrementing and decrementing the value. + /// + /// Defaults to `10.0`. + @override + final double pageStep; + /// The current value. /// /// Defaults to `0.0`. diff --git a/test/test_spinbox.dart b/test/test_spinbox.dart index e60a5b6..1ab4e9c 100644 --- a/test/test_spinbox.dart +++ b/test/test_spinbox.dart @@ -164,6 +164,42 @@ void testInput(TestBuilder builder) { expect(find.editableText, hasText('0')); }); + testWidgets('page step', (tester) async { + await tester.pumpWidget(builder()); + expect(find.editableText, hasFocus); + await tester.showKeyboard(find.byType(S)); + + await tester.sendKeyEvent(LogicalKeyboardKey.pageDown); + await tester.idle(); + expect(tester.state(find.byType(S)), hasValue(0)); + expect(find.editableText, hasText('0')); + + await tester.sendKeyEvent(LogicalKeyboardKey.pageUp); + await tester.idle(); + expect(tester.state(find.byType(S)), hasValue(10)); + expect(find.editableText, hasText('10')); + + await tester.sendKeyEvent(LogicalKeyboardKey.pageUp); + await tester.idle(); + expect(tester.state(find.byType(S)), hasValue(20)); + expect(find.editableText, hasText('20')); + + await tester.sendKeyEvent(LogicalKeyboardKey.arrowDown); + await tester.idle(); + expect(tester.state(find.byType(S)), hasValue(19)); + expect(find.editableText, hasText('19')); + + await tester.sendKeyEvent(LogicalKeyboardKey.pageDown); + await tester.idle(); + expect(tester.state(find.byType(S)), hasValue(9)); + expect(find.editableText, hasText('9')); + + await tester.sendKeyEvent(LogicalKeyboardKey.pageDown); + await tester.idle(); + expect(tester.state(find.byType(S)), hasValue(0)); + expect(find.editableText, hasText('0')); + }); + testWidgets('text', (tester) async { await tester.pumpWidget(builder()); expect(find.editableText, hasFocus);