Files
imajviewer/lib/shortcuts/app_shortcuts.dart
T
Alhan 168e087c8b
Build & Release / build-linux (push) Has been cancelled
Build & Release / build-windows (push) Has been cancelled
Build & Release / create-release (push) Has been cancelled
feat: crop save (save visible area at original resolution) v1.4.0
- Save visible area at original resolution as JPEG q90 (title bar button or Ctrl+S)
- Output name: original name + _HHmmss suffix; no overwrite, warning shown
- Active color effects baked in; rotation saves bounding box
- New: crop_save_service, l10n strings TR/EN, docs/plan-crop-save.md
2026-10-11 21:36:20 +03:00

77 lines
2.4 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
const AppShortcuts({super.key, required this.child, this.onCropSave});
@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;
}
}
switch (event.logicalKey) {
case LogicalKeyboardKey.arrowLeft:
ImageManager.instance.previousImage();
return KeyEventResult.handled;
case LogicalKeyboardKey.arrowRight:
ImageManager.instance.nextImage();
return KeyEventResult.handled;
case LogicalKeyboardKey.escape:
windowManager.isFullScreen().then((isFullscreen) {
if (isFullscreen) windowManager.setFullScreen(false);
});
return KeyEventResult.handled;
}
}
return KeyEventResult.ignored;
},
child: CallbackShortcuts(
bindings: {
const SingleActivator(
LogicalKeyboardKey.keyO,
control: true,
): () {
FileHandler.openFileDialog();
},
},
child: child,
),
);
}
}