Unverified Commit e4bd5d55 authored by Taha Tesser's avatar Taha Tesser Committed by GitHub

`CupertinoSegmentedControl`/`CupertinoSlidingSegmentedControl`: Add clickable...

`CupertinoSegmentedControl`/`CupertinoSlidingSegmentedControl`: Add clickable cursor for web (#99551)
parent d2cb63c8
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
import 'dart:collection'; import 'dart:collection';
import 'dart:math' as math; import 'dart:math' as math;
import 'package:flutter/foundation.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
...@@ -351,24 +352,27 @@ class _SegmentedControlState<T extends Object> extends State<CupertinoSegmentedC ...@@ -351,24 +352,27 @@ class _SegmentedControlState<T extends Object> extends State<CupertinoSegmentedC
child: widget.children[currentKey], child: widget.children[currentKey],
); );
child = GestureDetector( child = MouseRegion(
behavior: HitTestBehavior.opaque, cursor: kIsWeb ? SystemMouseCursors.click : MouseCursor.defer,
onTapDown: (TapDownDetails event) { child: GestureDetector(
_onTapDown(currentKey); behavior: HitTestBehavior.opaque,
}, onTapDown: (TapDownDetails event) {
onTapCancel: _onTapCancel, _onTapDown(currentKey);
onTap: () { },
_onTap(currentKey); onTapCancel: _onTapCancel,
}, onTap: () {
child: IconTheme( _onTap(currentKey);
data: iconTheme, },
child: DefaultTextStyle( child: IconTheme(
style: textStyle, data: iconTheme,
child: Semantics( child: DefaultTextStyle(
button: true, style: textStyle,
inMutuallyExclusiveGroup: true, child: Semantics(
selected: widget.groupValue == currentKey, button: true,
child: child, inMutuallyExclusiveGroup: true,
selected: widget.groupValue == currentKey,
child: child,
),
), ),
), ),
), ),
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import 'dart:math' as math; import 'dart:math' as math;
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/physics.dart'; import 'package:flutter/physics.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
...@@ -656,12 +657,15 @@ class _SegmentedControlState<T> extends State<CupertinoSlidingSegmentedControl<T ...@@ -656,12 +657,15 @@ class _SegmentedControlState<T> extends State<CupertinoSlidingSegmentedControl<T
onTap: () { widget.onValueChanged(entry.key); }, onTap: () { widget.onValueChanged(entry.key); },
inMutuallyExclusiveGroup: true, inMutuallyExclusiveGroup: true,
selected: widget.groupValue == entry.key, selected: widget.groupValue == entry.key,
child: _Segment<T>( child: MouseRegion(
key: ValueKey<T>(entry.key), cursor: kIsWeb ? SystemMouseCursors.click : MouseCursor.defer,
highlighted: isHighlighted, child: _Segment<T>(
pressed: pressed == entry.key, key: ValueKey<T>(entry.key),
isDragging: isThumbDragging, highlighted: isHighlighted,
child: entry.value, pressed: pressed == entry.key,
isDragging: isThumbDragging,
child: entry.value,
),
), ),
), ),
); );
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
...@@ -1577,4 +1579,47 @@ void main() { ...@@ -1577,4 +1579,47 @@ void main() {
matchesGoldenFile('segmented_control_test.1.png'), matchesGoldenFile('segmented_control_test.1.png'),
); );
}); });
testWidgets('Hovering over Cupertino segmented control updates cursor to clickable on Web', (WidgetTester tester) async {
final Map<int, Widget> children = <int, Widget>{};
children[0] = const Text('A');
children[1] = const Text('B');
children[2] = const Text('C');
const int currentValue = 0;
await tester.pumpWidget(
RepaintBoundary(
child: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return boilerplate(
child: SizedBox(
width: 800.0,
child: CupertinoSegmentedControl<int>(
key: const ValueKey<String>('Segmented Control'),
children: children,
onValueChanged: (int newValue) { },
groupValue: currentValue,
),
),
);
},
),
),
);
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse, pointer: 1);
await gesture.addPointer(location: const Offset(10, 10));
await tester.pumpAndSettle();
expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.basic);
final Offset firstChild = tester.getCenter(find.text('A'));
await gesture.moveTo(firstChild);
addTearDown(gesture.removePointer);
await tester.pumpAndSettle();
expect(
RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1),
kIsWeb ? SystemMouseCursors.click : SystemMouseCursors.basic,
);
});
} }
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
import 'dart:collection'; import 'dart:collection';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
...@@ -1244,7 +1246,6 @@ void main() { ...@@ -1244,7 +1246,6 @@ void main() {
} }
}); });
testWidgets('ScrollView + SlidingSegmentedControl interaction', (WidgetTester tester) async { testWidgets('ScrollView + SlidingSegmentedControl interaction', (WidgetTester tester) async {
const Map<int, Widget> children = <int, Widget>{ const Map<int, Widget> children = <int, Widget>{
0: Text('Child 1'), 0: Text('Child 1'),
...@@ -1330,4 +1331,38 @@ void main() { ...@@ -1330,4 +1331,38 @@ void main() {
expect(scrollController.offset, 0); expect(scrollController.offset, 0);
expect(groupValue, 1); expect(groupValue, 1);
}); });
testWidgets('Hovering over Cupertino sliding segmented control updates cursor to clickable on Web', (WidgetTester tester) async {
const Map<int, Widget> children = <int, Widget>{
0: Text('A'),
1: Text('BB'),
2: Text('CCCC'),
};
await tester.pumpWidget(
boilerplate(
builder: (BuildContext context) {
return CupertinoSlidingSegmentedControl<int>(
key: const ValueKey<String>('Segmented Control'),
children: children,
onValueChanged: defaultCallback,
);
},
),
);
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse, pointer: 1);
await gesture.addPointer(location: const Offset(10, 10));
await tester.pumpAndSettle();
expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.basic);
final Offset firstChild = tester.getCenter(find.text('A'));
await gesture.moveTo(firstChild);
addTearDown(gesture.removePointer);
await tester.pumpAndSettle();
expect(
RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1),
kIsWeb ? SystemMouseCursors.click : SystemMouseCursors.basic,
);
});
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment