feat: crop save (save visible area at original resolution) v1.4.0
Build & Release / build-linux (push) Has been cancelled
Build & Release / build-windows (push) Has been cancelled
Build & Release / create-release (push) Has been cancelled

- 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
This commit is contained in:
Alhan committed 2026-10-11 21:36:20 +03:00
1 parent 73c1ff51d6
commit 168e087c8b
16 files changed
+399 -14

No files matched your search

+11 -1
View File
@@ -6,9 +6,19 @@
"sortByName": "By name",
"appDescription": "Ultra-lightweight and fast image viewer. Open images and use arrows or keyboard keys to navigate.",
"shortcuts": "Shortcuts",
"shortcutsList": "• Left/Right arrow — previous/next image\n• Ctrl+Q — close window\n• Ctrl+Shift+Q — close all windows\n• Double click — toggle fill/fit\n• Right-drag — contrast\n• Shift+right-drag — rotate\n• Ctrl+right-drag — saturation\n• Ctrl+Shift+right-drag — brightness",
"shortcutsList": "• Left/Right arrow — previous/next image\n• Ctrl+S — save visible area (JPEG 90)\n• Ctrl+Q — close window\n• Ctrl+Shift+Q — close all windows\n• Double click — toggle fill/fit\n• Right-drag — contrast\n• Shift+right-drag — rotate\n• Ctrl+right-drag — saturation\n• Ctrl+Shift+right-drag — brightness",
"print": "Print",
"close": "Close",
"saveCrop": "Save visible area (JPEG 90)",
"cropSaved": "Saved: {path}",
"@cropSaved": {
"placeholders": {
"path": { "type": "String" }
}
},
"cropFileExists": "A file with the same name already exists — nothing was written",
"cropUnsupported": "This image format cannot be saved as a crop",
"cropFailed": "Failed to save crop",
"dragDropHint": "Drag images here\nor press Ctrl+O to open",
"dropHere": "Drop",
"imageLoadError": "Failed to load image"
+31 -1
View File
@@ -137,7 +137,7 @@ abstract class AppLocalizations {
/// No description provided for @shortcutsList.
///
/// In en, this message translates to:
/// **'• Left/Right arrow — previous/next image\n• Ctrl+Q — close window\n• Ctrl+Shift+Q — close all windows\n• Double click — toggle fill/fit\n• Right-drag — contrast\n• Shift+right-drag — rotate\n• Ctrl+right-drag — saturation\n• Ctrl+Shift+right-drag — brightness'**
/// **'• Left/Right arrow — previous/next image\n• Ctrl+S — save visible area (JPEG 90)\n• Ctrl+Q — close window\n• Ctrl+Shift+Q — close all windows\n• Double click — toggle fill/fit\n• Right-drag — contrast\n• Shift+right-drag — rotate\n• Ctrl+right-drag — saturation\n• Ctrl+Shift+right-drag — brightness'**
String get shortcutsList;
/// No description provided for @print.
@@ -152,6 +152,36 @@ abstract class AppLocalizations {
/// **'Close'**
String get close;
/// No description provided for @saveCrop.
///
/// In en, this message translates to:
/// **'Save visible area (JPEG 90)'**
String get saveCrop;
/// No description provided for @cropSaved.
///
/// In en, this message translates to:
/// **'Saved: {path}'**
String cropSaved(String path);
/// No description provided for @cropFileExists.
///
/// In en, this message translates to:
/// **'A file with the same name already exists — nothing was written'**
String get cropFileExists;
/// No description provided for @cropUnsupported.
///
/// In en, this message translates to:
/// **'This image format cannot be saved as a crop'**
String get cropUnsupported;
/// No description provided for @cropFailed.
///
/// In en, this message translates to:
/// **'Failed to save crop'**
String get cropFailed;
/// No description provided for @dragDropHint.
///
/// In en, this message translates to:
+19 -1
View File
@@ -29,7 +29,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get shortcutsList =>
'• Left/Right arrow — previous/next image\n• Ctrl+Q — close window\n• Ctrl+Shift+Q — close all windows\n• Double click — toggle fill/fit\n• Right-drag — contrast\n• Shift+right-drag — rotate\n• Ctrl+right-drag — saturation\n• Ctrl+Shift+right-drag — brightness';
'• Left/Right arrow — previous/next image\n• Ctrl+S — save visible area (JPEG 90)\n• Ctrl+Q — close window\n• Ctrl+Shift+Q — close all windows\n• Double click — toggle fill/fit\n• Right-drag — contrast\n• Shift+right-drag — rotate\n• Ctrl+right-drag — saturation\n• Ctrl+Shift+right-drag — brightness';
@override
String get print => 'Print';
@@ -37,6 +37,24 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get close => 'Close';
@override
String get saveCrop => 'Save visible area (JPEG 90)';
@override
String cropSaved(String path) {
return 'Saved: $path';
}
@override
String get cropFileExists =>
'A file with the same name already exists — nothing was written';
@override
String get cropUnsupported => 'This image format cannot be saved as a crop';
@override
String get cropFailed => 'Failed to save crop';
@override
String get dragDropHint => 'Drag images here\nor press Ctrl+O to open';
+18 -1
View File
@@ -29,7 +29,7 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get shortcutsList =>
'• Sol/Sağ ok — önceki/sonraki resim\n• Ctrl+Q — pencereyi kapat\n• Ctrl+Shift+Q — tüm pencereleri kapat\n• Çift tık — doldur/sığdır geçişi\n• Sağ tık sürükle — kontrast\n• Shift+sağ tık — döndür\n• Ctrl+sağ tık — doygunluk\n• Ctrl+Shift+sağ tık — parlaklık';
'• Sol/Sağ ok — önceki/sonraki resim\n• Ctrl+S — görünen alanı kaydet (JPEG 90)\n• Ctrl+Q — pencereyi kapat\n• Ctrl+Shift+Q — tüm pencereleri kapat\n• Çift tık — doldur/sığdır geçişi\n• Sağ tık sürükle — kontrast\n• Shift+sağ tık — döndür\n• Ctrl+sağ tık — doygunluk\n• Ctrl+Shift+sağ tık — parlaklık';
@override
String get print => 'Yazdır';
@@ -37,6 +37,23 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get close => 'Kapat';
@override
String get saveCrop => 'Görünen alanı kaydet (JPEG 90)';
@override
String cropSaved(String path) {
return 'Kaydedildi: $path';
}
@override
String get cropFileExists => 'Aynı adlı dosya zaten var — yazılmadı';
@override
String get cropUnsupported => 'Bu resim formatı crop olarak kaydedilemiyor';
@override
String get cropFailed => 'Crop kaydedilemedi';
@override
String get dragDropHint =>
'Resimleri buraya sürükleyin\nveya Ctrl+O ile açın';
+11 -1
View File
@@ -6,9 +6,19 @@
"sortByName": "İsme göre",
"appDescription": "Ultra hafif ve hızlı resim görüntüleyici. Görselleri açın, gezinti için okları veya klavye tuşlarını kullanın.",
"shortcuts": "Kısayollar",
"shortcutsList": "• Sol/Sağ ok — önceki/sonraki resim\n• Ctrl+Q — pencereyi kapat\n• Ctrl+Shift+Q — tüm pencereleri kapat\n• Çift tık — doldur/sığdır geçişi\n• Sağ tık sürükle — kontrast\n• Shift+sağ tık — döndür\n• Ctrl+sağ tık — doygunluk\n• Ctrl+Shift+sağ tık — parlaklık",
"shortcutsList": "• Sol/Sağ ok — önceki/sonraki resim\n• Ctrl+S — görünen alanı kaydet (JPEG 90)\n• Ctrl+Q — pencereyi kapat\n• Ctrl+Shift+Q — tüm pencereleri kapat\n• Çift tık — doldur/sığdır geçişi\n• Sağ tık sürükle — kontrast\n• Shift+sağ tık — döndür\n• Ctrl+sağ tık — doygunluk\n• Ctrl+Shift+sağ tık — parlaklık",
"print": "Yazdır",
"close": "Kapat",
"saveCrop": "Görünen alanı kaydet (JPEG 90)",
"cropSaved": "Kaydedildi: {path}",
"@cropSaved": {
"placeholders": {
"path": { "type": "String" }
}
},
"cropFileExists": "Aynı adlı dosya zaten var — yazılmadı",
"cropUnsupported": "Bu resim formatı crop olarak kaydedilemiyor",
"cropFailed": "Crop kaydedilemedi",
"dragDropHint": "Resimleri buraya sürükleyin\nveya Ctrl+O ile açın",
"dropHere": "Bırakın",
"imageLoadError": "Resim yüklenemedi"