fix: Ctrl+R flip also matches the physical R key (v1.6.1)
On some keymaps the R key resolves to a different logical key (observed on a Turkish remote-desktop setup: the R key arrives as logical T), so the Ctrl+R shortcut never fired even though the key events reached the app. The shortcut now matches PhysicalKeyboardKey.keyR as well; a regression test covers the wrong-layout case.
This commit is contained in:
1 parent
bad48167c8
commit
6e13892ed1
14 files changed
+98
-35
No files matched your search
+55
-13
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:image/image.dart' as img;
|
||||
import 'package:imajviewer/shortcuts/app_shortcuts.dart';
|
||||
import 'package:imajviewer/widgets/image_canvas.dart';
|
||||
|
||||
/// Aynalama uygulandiginda render zincirinde negatif x olcekli bir Transform bulunur.
|
||||
@@ -11,13 +12,37 @@ bool _mirrored(WidgetTester tester) => tester
|
||||
.widgetList<Transform>(find.byType(Transform))
|
||||
.any((t) => t.transform.entry(0, 0) < 0);
|
||||
|
||||
Future<void> _pressR(WidgetTester tester) async {
|
||||
Future<void> _pressCtrlR(WidgetTester tester) async {
|
||||
await tester.sendKeyDownEvent(LogicalKeyboardKey.controlLeft);
|
||||
await tester.sendKeyDownEvent(LogicalKeyboardKey.keyR);
|
||||
await tester.pump();
|
||||
await tester.sendKeyUpEvent(LogicalKeyboardKey.keyR);
|
||||
await tester.sendKeyUpEvent(LogicalKeyboardKey.controlLeft);
|
||||
await tester.pump();
|
||||
await tester.pump();
|
||||
}
|
||||
|
||||
Future<void> _pressCtrlRWrongLayout(WidgetTester tester) async {
|
||||
await tester.sendKeyDownEvent(LogicalKeyboardKey.controlLeft);
|
||||
await tester.sendKeyDownEvent(LogicalKeyboardKey.keyT,
|
||||
physicalKey: PhysicalKeyboardKey.keyR);
|
||||
await tester.pump();
|
||||
await tester.sendKeyUpEvent(LogicalKeyboardKey.keyT,
|
||||
physicalKey: PhysicalKeyboardKey.keyR);
|
||||
await tester.sendKeyUpEvent(LogicalKeyboardKey.controlLeft);
|
||||
await tester.pump();
|
||||
await tester.pump();
|
||||
}
|
||||
|
||||
Widget _app(GlobalKey<ImageCanvasState> key, String path, double w, double h) {
|
||||
return MaterialApp(
|
||||
home: AppShortcuts(
|
||||
onFlipH: () => key.currentState?.toggleFlipH(),
|
||||
child: SizedBox(width: w, height: h, child: ImageCanvas(key: key, filePath: path)),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void main() {
|
||||
late Directory tmp;
|
||||
late String pngPath;
|
||||
@@ -30,22 +55,39 @@ void main() {
|
||||
|
||||
tearDownAll(() => tmp.deleteSync(recursive: true));
|
||||
|
||||
testWidgets('R yatay aynalamayi acar, tekrar basinca kapatir', (tester) async {
|
||||
await tester.pumpWidget(MaterialApp(
|
||||
home: SizedBox(
|
||||
width: 400,
|
||||
height: 300,
|
||||
child: ImageCanvas(filePath: pngPath),
|
||||
),
|
||||
));
|
||||
testWidgets('Ctrl+R yatay aynalamayi acar, tekrar basinca kapatir', (tester) async {
|
||||
final key = GlobalKey<ImageCanvasState>();
|
||||
await tester.pumpWidget(_app(key, pngPath, 400, 300));
|
||||
await tester.pump();
|
||||
|
||||
expect(_mirrored(tester), isFalse, reason: 'baslangicta aynalama olmamali');
|
||||
|
||||
await _pressR(tester);
|
||||
expect(_mirrored(tester), isTrue, reason: 'R sonrasi aynalama acik olmali');
|
||||
await _pressCtrlR(tester);
|
||||
expect(_mirrored(tester), isTrue, reason: 'Ctrl+R sonrasi aynalama acik olmali');
|
||||
|
||||
await _pressR(tester);
|
||||
expect(_mirrored(tester), isFalse, reason: 'ikinci R sonrasi eski haline donmeli');
|
||||
await _pressCtrlR(tester);
|
||||
expect(_mirrored(tester), isFalse, reason: 'ikinci Ctrl+R sonrasi eski haline donmeli');
|
||||
});
|
||||
|
||||
testWidgets('Ctrl+R crop-save parametrelerine aynalamayi tasir', (tester) async {
|
||||
final key = GlobalKey<ImageCanvasState>();
|
||||
await tester.pumpWidget(_app(key, pngPath, 100, 50));
|
||||
await tester.pump();
|
||||
await _pressCtrlR(tester);
|
||||
final vp = key.currentState!.cropViewParams(4, 2);
|
||||
expect(vp?.flipH, isTrue, reason: 'crop-save aynalamayi almali');
|
||||
});
|
||||
|
||||
testWidgets('fiziksel R tusu mantiksal T olarak gelse de Ctrl+R calisir', (tester) async {
|
||||
final key = GlobalKey<ImageCanvasState>();
|
||||
await tester.pumpWidget(_app(key, pngPath, 400, 300));
|
||||
await tester.pump();
|
||||
|
||||
await _pressCtrlRWrongLayout(tester);
|
||||
expect(_mirrored(tester), isTrue,
|
||||
reason: 'klavye haritasi R tusunu T olarak cozse bile aynalama acilmali');
|
||||
|
||||
await _pressCtrlRWrongLayout(tester);
|
||||
expect(_mirrored(tester), isFalse, reason: 'tekrar basinca geri donmeli');
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user