95 lines
3.0 KiB
Dart
95 lines
3.0 KiB
Dart
import 'dart:io';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter/services.dart';
|
||
import 'package:window_manager/window_manager.dart';
|
||
import '../services/image_manager.dart';
|
||
import '../services/file_handler.dart';
|
||
|
||
class AppShortcuts extends StatelessWidget {
|
||
final Widget child;
|
||
final VoidCallback? onCropSave;
|
||
final VoidCallback? onFlipH;
|
||
|
||
const AppShortcuts({
|
||
super.key,
|
||
required this.child,
|
||
this.onCropSave,
|
||
this.onFlipH,
|
||
});
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return Focus(
|
||
autofocus: true,
|
||
onKeyEvent: (node, event) {
|
||
if (event is KeyDownEvent) {
|
||
final ctrl = HardwareKeyboard.instance.isControlPressed;
|
||
final shift = HardwareKeyboard.instance.isShiftPressed;
|
||
|
||
// Ctrl+Shift+Q: tüm pencereleri kapat
|
||
if (ctrl && shift && event.logicalKey == LogicalKeyboardKey.keyQ) {
|
||
if (Platform.isWindows) {
|
||
Process.runSync('taskkill', ['/F', '/IM', 'imajviewer.exe']);
|
||
} else {
|
||
Process.runSync('pkill', ['imajviewer']);
|
||
}
|
||
return KeyEventResult.handled;
|
||
}
|
||
|
||
// Ctrl+Q: bu pencereyi kapat
|
||
if (ctrl && event.logicalKey == LogicalKeyboardKey.keyQ) {
|
||
windowManager.close();
|
||
return KeyEventResult.handled;
|
||
}
|
||
|
||
// Ctrl+S: görünen alanı kaydet (crop save)
|
||
if (ctrl && !shift && event.logicalKey == LogicalKeyboardKey.keyS) {
|
||
if (onCropSave != null) {
|
||
onCropSave!();
|
||
return KeyEventResult.handled;
|
||
}
|
||
}
|
||
|
||
// Ctrl+R: yatay aynala / geri al (fiziksel R: bazi klavye haritalarinda
|
||
// mantiksal tus T gibi farkli cozuluyor)
|
||
if (ctrl &&
|
||
(event.logicalKey == LogicalKeyboardKey.keyR ||
|
||
event.physicalKey == PhysicalKeyboardKey.keyR)) {
|
||
if (onFlipH != null) {
|
||
onFlipH!();
|
||
return KeyEventResult.handled;
|
||
}
|
||
}
|
||
|
||
switch (event.logicalKey) {
|
||
case LogicalKeyboardKey.arrowLeft:
|
||
ImageManager.instance.previousImage();
|
||
return KeyEventResult.handled;
|
||
case LogicalKeyboardKey.arrowRight:
|
||
ImageManager.instance.nextImage();
|
||
return KeyEventResult.handled;
|
||
case LogicalKeyboardKey.f11:
|
||
case LogicalKeyboardKey.escape:
|
||
windowManager.isFullScreen().then((isFullscreen) {
|
||
windowManager.setFullScreen(event.logicalKey == LogicalKeyboardKey.f11 ? !isFullscreen : false);
|
||
});
|
||
return KeyEventResult.handled;
|
||
}
|
||
}
|
||
return KeyEventResult.ignored;
|
||
},
|
||
child: CallbackShortcuts(
|
||
bindings: {
|
||
const SingleActivator(
|
||
LogicalKeyboardKey.keyO,
|
||
control: true,
|
||
): () {
|
||
FileHandler.openFileDialog();
|
||
},
|
||
},
|
||
child: child,
|
||
),
|
||
);
|
||
}
|
||
}
|