diff --git a/crates/ui-egui/locales/cs.json b/crates/ui-egui/locales/cs.json index f704de994..2dd417824 100644 --- a/crates/ui-egui/locales/cs.json +++ b/crates/ui-egui/locales/cs.json @@ -901,7 +901,7 @@ "Import from Device": "Importovat ze zařízení", "Import from Folder…": "Importovat ze složky…", "Import new photos": "Importovat nové fotografie", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importujte fotografie přes Soubor → Importovat fotografie… (Cmd+Shift+I) nebo je přetáhněte sem", + "Import photos with File → Import Photos…, or drop them here": "Importujte fotografie přes Soubor → Importovat fotografie… nebo je přetáhněte sem", "Imported": "Importováno", "Imported Photos": "Importované fotografie", "Importing": "Importování", diff --git a/crates/ui-egui/locales/de.json b/crates/ui-egui/locales/de.json index 69ff9e918..6cd06de28 100644 --- a/crates/ui-egui/locales/de.json +++ b/crates/ui-egui/locales/de.json @@ -709,7 +709,7 @@ "Import as new": "Neu importieren", "Import from Device": "Von Gerät importieren", "Import from Folder…": "Aus Ordner importieren…", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importiere Fotos über Datei → Fotos importieren… (⌘⇧I) oder lege sie hier ab", + "Import photos with File → Import Photos…, or drop them here": "Importiere Fotos über Datei → Fotos importieren… oder lege sie hier ab", "Import presets from other editors: XMP presets, classic `.lrtemplate` files, \"DNG presets\" from mobile apps and `.zip`": "Vorgaben aus anderen Editoren importieren: XMP-Vorgaben, klassische `.lrtemplate`-Dateien, „DNG-Vorgaben“ aus mobilen Apps und `.zip`-Pakete.", "Import ▸ Copy verifies every copy, like Move (issue #96): each file is written as a new file, synced to disk and": "Import → Kopieren prüft jede Kopie wie beim Verschieben (Issue #96): Jede Datei wird neu geschrieben, auf den Datenträger synchronisiert", "Import ▸ Move: photos go into the destination (with the same folders and renaming as Copy, e.g.": "Import → Verschieben: Fotos gehen mit derselben Ordnerstruktur und Umbenennung wie beim Kopieren in den Zielordner, etwa", diff --git a/crates/ui-egui/locales/es.json b/crates/ui-egui/locales/es.json index 29b6b0c9e..4fee6237b 100644 --- a/crates/ui-egui/locales/es.json +++ b/crates/ui-egui/locales/es.json @@ -715,7 +715,7 @@ "Import as new": "Importar como nuevas", "Import from Device": "Importar desde dispositivo", "Import from Folder…": "Importar desde carpeta…", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importar fotos con Archivo → Importar fotos… (Cmd+Mayús+I) o soltarlas aquí", + "Import photos with File → Import Photos…, or drop them here": "Importar fotos con Archivo → Importar fotos… o soltarlas aquí", "Imported": "Importadas", "Imported Photos": "Fotos importadas", "Importing": "Importando", diff --git a/crates/ui-egui/locales/fi.json b/crates/ui-egui/locales/fi.json index e9473bbb1..ac0bdddf9 100644 --- a/crates/ui-egui/locales/fi.json +++ b/crates/ui-egui/locales/fi.json @@ -909,7 +909,7 @@ "Import from Folder…": "Tuo kansiosta…", "Import new photos": "Tuo uudet kuvat", "Import photos to get started": "Aloita tuomalla kuvia", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Tuo kuvia valitsemalla Tiedosto → Tuo kuvia… (Cmd+Shift+I) tai pudota ne tähän", + "Import photos with File → Import Photos…, or drop them here": "Tuo kuvia valitsemalla Tiedosto → Tuo kuvia… tai pudota ne tähän", "Imported": "Tuotu", "Imported Photos": "Tuodut kuvat", "Importing": "Tuodaan", diff --git a/crates/ui-egui/locales/fr.json b/crates/ui-egui/locales/fr.json index 499141913..63f901b69 100644 --- a/crates/ui-egui/locales/fr.json +++ b/crates/ui-egui/locales/fr.json @@ -673,7 +673,7 @@ "Import as new": "Importer comme nouvelles", "Import from Device": "Importer depuis un appareil", "Import from Folder…": "Importer depuis un dossier…", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importez des photos avec Fichier → Importer des photos… (Cmd+Maj+I) ou déposez-les ici", + "Import photos with File → Import Photos…, or drop them here": "Importez des photos avec Fichier → Importer des photos… ou déposez-les ici", "Imported": "Importées", "Imported Photos": "Photos importées", "Importing": "Importation en cours", diff --git a/crates/ui-egui/locales/id.json b/crates/ui-egui/locales/id.json index faeb97b5b..f50722b55 100644 --- a/crates/ui-egui/locales/id.json +++ b/crates/ui-egui/locales/id.json @@ -913,7 +913,7 @@ "Import from Folder…": "Impor dari folder…", "Import new photos": "Impor foto baru", "Import photos to get started": "Impor foto untuk memulai", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Impor foto melalui File → Impor foto… (Cmd+Shift+I), atau seret ke sini", + "Import photos with File → Import Photos…, or drop them here": "Impor foto melalui File → Impor foto…, atau seret ke sini", "Imported": "Diimpor", "Imported Photos": "Foto yang diimpor", "Importing": "Mengimpor", diff --git a/crates/ui-egui/locales/it.json b/crates/ui-egui/locales/it.json index 971c0ae3e..dab1a08aa 100644 --- a/crates/ui-egui/locales/it.json +++ b/crates/ui-egui/locales/it.json @@ -675,7 +675,7 @@ "Import as new": "Importa come nuova", "Import from Device": "Importa da dispositivo", "Import from Folder…": "Importa da cartella…", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importa le foto con File → Importa foto… (Cmd+Maiusc+I), oppure trascinale qui", + "Import photos with File → Import Photos…, or drop them here": "Importa le foto con File → Importa foto…, oppure trascinale qui", "Imported": "Importato", "Imported Photos": "Foto importate", "Importing": "Importazione in corso", diff --git a/crates/ui-egui/locales/ja.json b/crates/ui-egui/locales/ja.json index a50ec827c..9c7f45847 100644 --- a/crates/ui-egui/locales/ja.json +++ b/crates/ui-egui/locales/ja.json @@ -836,7 +836,7 @@ "Import Profiles & Presets…": "プロファイルとプリセットを読み込む…", "Import from Device": "デバイスから読み込む", "Import from Folder…": "フォルダから読み込む…", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "「ファイル → 写真を読み込む…」(⌘⇧I)から読み込むか、ここに写真をドロップしてください", + "Import photos with File → Import Photos…, or drop them here": "「ファイル → 写真を読み込む…」から読み込むか、ここに写真をドロップしてください", "Imported Photos": "写真を読み込み", "Importing": "読み込み中", "Importing scans the source for photos; it doesn't add the folder to Local (use Local → Browse Folder… to work in a folder without importing).": "読み込みでは写真を検索しますが、フォルダはローカルに追加されません。読み込まずに作業する場合は「ローカル → フォルダを参照…」を使ってください", diff --git a/crates/ui-egui/locales/ka.json b/crates/ui-egui/locales/ka.json index 696119de4..687bed8c7 100644 --- a/crates/ui-egui/locales/ka.json +++ b/crates/ui-egui/locales/ka.json @@ -971,7 +971,7 @@ "Import from Device": "იმპორტი მოწყობილობიდან", "Import from Folder…": "იმპორტი საქაღალდიდან…", "Import new photos": "ახალი ფოტოების იმპორტი", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "ფოტოების იმპორტისთვის გამოიყენეთ ფაილი → ფოტოების იმპორტი… (Cmd+Shift+I), ან ჩააგდეთ ისინი აქ", + "Import photos with File → Import Photos…, or drop them here": "ფოტოების იმპორტისთვის გამოიყენეთ ფაილი → ფოტოების იმპორტი…, ან ჩააგდეთ ისინი აქ", "Import presets from other editors: XMP presets, classic `.lrtemplate` files, \"DNG presets\" from mobile apps and `.zip`": "პრესეტების იმპორტი სხვა რედაქტორებიდან: XMP პრესეტები, კლასიკური `.lrtemplate` ფაილები, მობილური აპების „DNG პრესეტები“ და `.zip`", "Import ▸ Copy verifies every copy, like Move (issue #96): each file is written as a new file, synced to disk and": "იმპორტი → კოპირება ყოველ ასლს ამოწმებს, ისევე როგორც გადატანა (ხარვეზი #96): ყოველი ფაილი ახალ ფაილად იწერება, დისკზე სინქრონიზდება და", "Import ▸ Move: photos go into the destination (with the same folders and renaming as Copy, e.g.": "იმპორტი → გადატანა: ფოტოები დანიშნულების ადგილას გადადის (იგივე საქაღალდეებითა და გადარქმევით, რაც კოპირებისას, მაგ.", diff --git a/crates/ui-egui/locales/pl.json b/crates/ui-egui/locales/pl.json index ae383f1df..5c0e93e28 100644 --- a/crates/ui-egui/locales/pl.json +++ b/crates/ui-egui/locales/pl.json @@ -657,7 +657,7 @@ "Import as new": "Importuj jako nowe", "Import from Device": "Importuj z urządzenia", "Import from Folder…": "Importuj z folderu…", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importuj zdjęcia przez Plik → Importuj zdjęcia… (Cmd+Shift+I) lub przeciągnij je tutaj", + "Import photos with File → Import Photos…, or drop them here": "Importuj zdjęcia przez Plik → Importuj zdjęcia… lub przeciągnij je tutaj", "Imported": "Zaimportowane", "Imported Photos": "Zaimportowane zdjęcia", "Importing": "Importowanie", diff --git a/crates/ui-egui/locales/pt-br.json b/crates/ui-egui/locales/pt-br.json index cf678a1f9..6f8c1a4d3 100644 --- a/crates/ui-egui/locales/pt-br.json +++ b/crates/ui-egui/locales/pt-br.json @@ -682,7 +682,7 @@ "Import as new": "Importar como novas", "Import from Device": "Importar de dispositivo", "Import from Folder…": "Importar de pasta…", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importe fotos com Arquivo → Importar fotos… (Cmd+Shift+I) ou solte-as aqui", + "Import photos with File → Import Photos…, or drop them here": "Importe fotos com Arquivo → Importar fotos… ou solte-as aqui", "Imported": "Importados", "Imported Photos": "Fotos importadas", "Importing": "Importando", diff --git a/crates/ui-egui/locales/ru.json b/crates/ui-egui/locales/ru.json index 2ed5b947e..e8401e32c 100644 --- a/crates/ui-egui/locales/ru.json +++ b/crates/ui-egui/locales/ru.json @@ -759,7 +759,7 @@ "Import Profiles & Presets…": "Импортировать профили и пресеты…", "Import from Device": "Импорт с устройства", "Import from Folder…": "Импорт из папки…", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Импортируйте фото через Файл → Импорт фото… (Cmd+Shift+I) или перетащите их сюда", + "Import photos with File → Import Photos…, or drop them here": "Импортируйте фото через Файл → Импорт фото… или перетащите их сюда", "Imported Photos": "Импортированные фото", "Importing": "Импорт", "Importing Lightroom Catalog": "Импорт каталога Lightroom", diff --git a/crates/ui-egui/locales/sv.json b/crates/ui-egui/locales/sv.json index f7a45cf16..8bd4d5e45 100644 --- a/crates/ui-egui/locales/sv.json +++ b/crates/ui-egui/locales/sv.json @@ -962,7 +962,7 @@ "Import Lightroom Catalog…": "Importera Lightroom-katalog…", "Import new photos": "Importera nya foton", "Import Photos": "Importera foton", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importera foton med Arkiv → Importera foton… (Cmd+Shift+I) eller släpp dem här", + "Import photos with File → Import Photos…, or drop them here": "Importera foton med Arkiv → Importera foton… eller släpp dem här", "Import Photos…": "Importera foton…", "Import Point Curve Presets": "Importera förinställningar för punktkurva", "Import Point Curve Presets…": "Importera förinställningar för punktkurva…", diff --git a/crates/ui-egui/locales/uk.json b/crates/ui-egui/locales/uk.json index 3ecf028d1..1cd0304b4 100644 --- a/crates/ui-egui/locales/uk.json +++ b/crates/ui-egui/locales/uk.json @@ -1013,7 +1013,7 @@ "Import Profiles & Presets…": "Імпортувати профілі й набори налаштувань…", "Import from Device": "Імпортувати з пристрою", "Import from Folder…": "Імпортувати з теки…", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Імпортуйте фото через Файл → Імпортувати фото… (Cmd+Shift+I) або перетягніть їх сюди", + "Import photos with File → Import Photos…, or drop them here": "Імпортуйте фото через Файл → Імпортувати фото… або перетягніть їх сюди", "Imported Photos": "Імпортовані фото", "Importing": "Імпорт", "Importing scans the source for photos; it doesn't add the folder to Local (use Local → Browse Folder… to work in a folder without importing).": "Імпорт сканує джерело фото; він не додає теку до локальних (використовуйте Локальні → Оглянути теку…, щоб працювати в теці без імпорту).", diff --git a/crates/ui-egui/locales/vi.json b/crates/ui-egui/locales/vi.json index e7a1455c2..e59dd693c 100644 --- a/crates/ui-egui/locales/vi.json +++ b/crates/ui-egui/locales/vi.json @@ -832,7 +832,7 @@ "Import from Device": "Nhập từ thiết bị", "Import from Folder…": "Nhập từ thư mục…", "Import new photos": "Nhập ảnh mới", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Nhập ảnh bằng Tệp → Nhập ảnh… (Cmd+Shift+I), hoặc thả vào đây", + "Import photos with File → Import Photos…, or drop them here": "Nhập ảnh bằng Tệp → Nhập ảnh…, hoặc thả vào đây", "Import presets from other editors: XMP presets, classic `.lrtemplate` files, \"DNG presets\" from mobile apps and `.zip`": "Nhập thiết lập sẵn từ trình soạn khác: preset XMP, tệp `.lrtemplate` cổ điển, \"DNG presets\" từ app di động và `.zip`", "Import ▸ Copy verifies every copy, like Move (issue #96): each file is written as a new file, synced to disk and": "Nhập → Sao chép xác minh mọi bản sao, như Di chuyển (issue #96): mỗi tệp ghi thành tệp mới, đồng bộ ra đĩa và", "Import ▸ Move: photos go into the destination (with the same folders and renaming as Copy, e.g.": "Nhập → Di chuyển: ảnh vào đích (cùng thư mục và đổi tên như Sao chép, ví dụ", diff --git a/crates/ui-egui/locales/zh-hans.json b/crates/ui-egui/locales/zh-hans.json index 011826287..823f67c00 100644 --- a/crates/ui-egui/locales/zh-hans.json +++ b/crates/ui-egui/locales/zh-hans.json @@ -803,7 +803,7 @@ "Import Profiles & Presets…": "导入配置文件与预设…", "Import from Device": "从设备导入", "Import from Folder…": "从文件夹导入…", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "使用“文件 → 导入照片…”(Cmd+Shift+I)导入照片,或将照片拖放到此处", + "Import photos with File → Import Photos…, or drop them here": "使用“文件 → 导入照片…”导入照片,或将照片拖放到此处", "Imported Photos": "已导入的照片", "Importing": "正在导入", "Importing scans the source for photos; it doesn't add the folder to Local (use Local → Browse Folder… to work in a folder without importing).": "导入会扫描源中的照片,但不会将该文件夹添加到“本地”(若想在不导入的情况下处理某个文件夹,请使用“本地 → 浏览文件夹…”)。", diff --git a/crates/ui-egui/locales/zh-hant.json b/crates/ui-egui/locales/zh-hant.json index 5b2300d6f..65792dfe0 100644 --- a/crates/ui-egui/locales/zh-hant.json +++ b/crates/ui-egui/locales/zh-hant.json @@ -804,7 +804,7 @@ "Import Profiles & Presets…": "匯入描述檔與預設集…", "Import from Device": "從裝置匯入", "Import from Folder…": "從資料夾匯入…", - "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "使用「檔案 → 匯入照片…」(Cmd+Shift+I),或將照片拖放至此", + "Import photos with File → Import Photos…, or drop them here": "使用「檔案 → 匯入照片…」,或將照片拖放至此", "Imported Photos": "已匯入的照片", "Importing": "正在匯入", "Importing scans the source for photos; it doesn't add the folder to Local (use Local → Browse Folder… to work in a folder without importing).": "匯入會掃描來源中的照片,不會將資料夾加入本機(若要直接使用資料夾中的檔案,請選擇「本機 → 瀏覽資料夾…」)。", diff --git a/crates/ui-egui/src/panels/grid.rs b/crates/ui-egui/src/panels/grid.rs index a12a84825..6178d5775 100644 --- a/crates/ui-egui/src/panels/grid.rs +++ b/crates/ui-egui/src/panels/grid.rs @@ -264,6 +264,13 @@ impl GridCache { } } +/// The empty view's way in: the sentence, and Import Photos' shortcut as this platform writes it +/// and as it is bound (the menu bar's own text), `None` when it is unbound. +pub(crate) fn import_way_in(keymap: &crate::shortcuts::Keymap, mac: bool) -> (&'static str, Option) { + let way = crate::i18n::tr("Import photos with File → Import Photos…, or drop them here"); + (way, crate::shortcuts::shortcut_of(keymap, "file.addPhotos").map(|sc| crate::menubar::shortcut_text(sc, mac))) +} + /// Width / height of a photo's cell: its cropped, oriented shape. pub(crate) fn shape_of(cat: &Catalog, id: PhotoId) -> f32 { let p = cat.photo(id); @@ -341,7 +348,10 @@ fn show_inner(app: &mut LightcraftApp, ui: &mut egui::Ui) { } else if super::empty_library::shown(&app.session) { super::empty_library::show(app, ui, ui.max_rect()); } else { - super::empty_message(ui, ui.max_rect(), "No photos", "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here"); + let mac = ui.ctx().os() == egui::os::OperatingSystem::Mac; + // wrapped to the grid's width, the shortcut on its own line under it + let (way, key) = import_way_in(&app.ui.settings.keymap, mac); + super::empty_state(ui, ui.max_rect(), "No photos", way, &[], key.as_deref()); } return; } diff --git a/crates/ui-egui/src/tests/grid.rs b/crates/ui-egui/src/tests/grid.rs index 3776821de..f68324950 100644 --- a/crates/ui-egui/src/tests/grid.rs +++ b/crates/ui-egui/src/tests/grid.rs @@ -378,3 +378,55 @@ fn a_grid_followed_through_edits_shows_what_a_grid_made_afresh_shows() { } } } + +/// The empty view names Import Photos' key as the menu bar writes it, as it is bound, not a +/// fixed English "Cmd+Shift+I" on every platform. +#[test] +fn the_empty_view_names_the_import_shortcut_of_this_platform() { + use crate::menubar::shortcut_text; + use crate::panels::grid::import_way_in; + let mut keymap = crate::state::AppSettings::default().keymap; + for mac in [true, false] { + let (way, key) = import_way_in(&keymap, mac); + assert_eq!(key, Some(shortcut_text("Cmd+Shift+I", mac))); + assert!(!way.contains("Cmd+Shift+I"), "{way}"); + } + assert_eq!(import_way_in(&keymap, false).1.as_deref(), Some("Ctrl+Shift+I")); + // a remapped key is the one shown + crate::shortcuts::assign(&mut keymap, "file.addPhotos", Some("Cmd+Alt+I")).unwrap(); + for mac in [true, false] { + assert_eq!(import_way_in(&keymap, mac).1, Some(shortcut_text("Cmd+Alt+I", mac))); + } + // and none at all names no key + crate::shortcuts::assign(&mut keymap, "file.addPhotos", None).unwrap(); + assert_eq!(import_way_in(&keymap, true).1, None); +} + +/// A narrow grid wraps the empty view's way in (a long translation with its shortcut would run +/// out of the window on one line) and keeps the shortcut visible. +#[test] +fn the_empty_views_way_in_wraps_in_a_narrow_grid_and_keeps_its_shortcut() { + let mut h = Headless::new(LightcraftApp::new(Session::with_demo(), Services::default()), [420.0, 700.0], 1.0); + let album = h.app.session.execute("album.create", &json!({"name": "Empty"})).unwrap()["id"].as_u64().unwrap(); + h.app.session.execute("library.source", &json!({"kind": "album", "id": album})).unwrap(); + h.app.ui.view = ViewMode::PhotoGrid; + assert_eq!(h.request("ui.set", json!({"language": "de"}), T)["ok"], true); + h.step(); + h.step(); + let texts: Vec<_> = h + .view + .painted_shapes() + .iter() + .filter_map(|s| match s { + egui::Shape::Text(t) => Some(t.galley.clone()), + _ => None, + }) + .collect(); + crate::i18n::set_language(crate::i18n::Locale::En); + let way = crate::i18n::Locale::De.tr("Import photos with File → Import Photos…, or drop them here"); + let g = texts.iter().find(|g| g.job.text == way).unwrap_or_else(|| panic!("the way in is painted: {:?}", h.painted_text())); + assert!(g.rows.len() > 1, "wrapped on a narrow grid: {} row(s) of {:?}", g.rows.len(), g.size()); + assert!(g.size().x < 420.0, "inside the window: {:?}", g.size()); + let key = crate::menubar::shortcut_text("Cmd+Shift+I", cfg!(target_os = "macos")); + assert!(h.painted_text().iter().any(|t| t.contains(&key)), "the shortcut stays visible: {:?}", h.painted_text()); +} diff --git a/docs/parity-checklist.md b/docs/parity-checklist.md index 4a695edc7..046704f88 100644 --- a/docs/parity-checklist.md +++ b/docs/parity-checklist.md @@ -1,6 +1,6 @@ # Lightroom parity checklist -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-27 · **Change:** minor (LR-BEHAV-ACCESS: the grid's date headers are named as they read; LR-BEHAV-ACCESS: the sidebar's disclosure triangles name their row; KEYC-METADATA, LRC-LIB-KEYWORDS: ⌘⌥⇧K Set Keyword Shortcut and ⇧K; KEYC-METADATA: ⌘⇧K / Ctrl+Shift+K Edit Keywords; LR-FILT-SEARCH-META: `>=` / `<=` in fielded search tokens; MENU-FILE-CLOSE, KEY-CLOSEWINDOW: the notes say Close Window quits the app, after the same check as Quit; MENU-EDIT-SELECTNONE, MENU-EDIT-PASTESELECTED: Edit lists Select Only Active Photo after Deselect All and Paste Settings from Previous after Paste Selected Settings…; on macOS no doubled separators are left where Settings… moved to the app menu; LR-BEHAV-TITLEBAR: a double-click follows the system setting, and a panel over the bar keeps the window still; KEYC-METADATA, LRC-LIB-KEYWORDS: ⌥0 / ⌥⇧0 go to the next / previous keyword set; LRC-DEV-HISTOGRAM-DRAG: the histogram's five tonal zones — hover for the value, drag to adjust the Basic control the press locked, double-click to reset; LR-VIEW-HISTOGRAM note updated; MENU-BAR: on macOS a menu item that yields its key to a focused text field or to shortcut recording really lets it go; LR-MERGE-HDR / LR-MERGE-PANO: Lanczos-3 warps; LR-IMP-LOCAL: browsing from the sidebar records the folder; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LR-IMP-ADD-DIALOG: hierarchical import album destination reconciled with main, #2362; KEY-SLIDER-NUDGE: vertical wheel nudges need a click or drag in the row; leaving it disarms them; LR-EDIT-OPTICS-PROFILE: Fujifilm nine-knot lens tables read at the plain radius; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LRC-LIB-LIBFOLDERS, LR-BEHAV-BG-TASKS: Synchronize Folder's scan shows its folder listing and stops it on ✕; LRC-LIB-LIBFOLDERS: Synchronize Folder says a folder is up to date; LR-LIB-STACK: filmstrip stack badge click; LRC-LIB-REFVIEW / CATALOG-SWITCH: Escape preserves edits; catalog-local pins; deleted and malformed references refused; LRC-LIB-COMPARE: the Info panel labels the active photo while culling, #2398; KEYC-RATING: `\` shows / hides the Filter Bar in the grids; LR-VIEW-PHOTOGRID: the grid reads only the photos an import batch or an edit touched, not the whole list; earlier: LRC-PRINT-PAGE: Print Page Options; LR-META-XMP: fewer false unimported-XMP warnings; KEYC-METADATA: ⌘K / Ctrl+K Add Keywords; LRC-DEV-HISTOGRAM-DRAG: the histogram's five tonal zones — hover for the value, drag to adjust the Basic control the press locked, double-click to reset; LR-VIEW-HISTOGRAM note updated; MENU-BAR: on macOS a menu item that yields its key to a focused text field or to shortcut recording really lets it go; LR-MERGE-HDR / LR-MERGE-PANO: Lanczos-3 warps; LR-IMP-LOCAL: browsing from the sidebar records the folder; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LR-IMP-ADD-DIALOG: hierarchical import album destination reconciled with main, #2362; KEY-SLIDER-NUDGE: vertical wheel nudges need a click or drag in the row; leaving it disarms them; LR-EDIT-OPTICS-PROFILE: Fujifilm nine-knot lens tables read at the plain radius; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LRC-LIB-LIBFOLDERS, LR-BEHAV-BG-TASKS: Synchronize Folder's scan shows its folder listing and stops it on ✕; LRC-LIB-LIBFOLDERS: Synchronize Folder says a folder is up to date; LR-LIB-STACK: filmstrip stack badge click; LRC-LIB-REFVIEW / CATALOG-SWITCH: Escape preserves edits; catalog-local pins; deleted and malformed references refused; LRC-LIB-COMPARE: the Info panel labels the active photo while culling, #2398; KEYC-RATING: `\` shows / hides the Filter Bar in the grids; LR-VIEW-PHOTOGRID: the grid reads only the photos an import batch or an edit touched, not the whole list; earlier: LRC-PRINT-PAGE: Print Page Options; LR-META-XMP: fewer false unimported-XMP warnings) · **Target:** Adobe Lightroom Classic 15.5 / Lightroom 9.6 +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-28 · **Change:** minor (LR-VIEW-PHOTOGRID: the grid's empty-view message names its shortcut as this platform writes it and as it is bound; LR-BEHAV-ACCESS: the grid's date headers are named as they read; LR-BEHAV-ACCESS: the sidebar's disclosure triangles name their row; KEYC-METADATA, LRC-LIB-KEYWORDS: ⌘⌥⇧K Set Keyword Shortcut and ⇧K; KEYC-METADATA: ⌘⇧K / Ctrl+Shift+K Edit Keywords; LR-FILT-SEARCH-META: `>=` / `<=` in fielded search tokens; MENU-FILE-CLOSE, KEY-CLOSEWINDOW: the notes say Close Window quits the app, after the same check as Quit; MENU-EDIT-SELECTNONE, MENU-EDIT-PASTESELECTED: Edit lists Select Only Active Photo after Deselect All and Paste Settings from Previous after Paste Selected Settings…; on macOS no doubled separators are left where Settings… moved to the app menu; LR-BEHAV-TITLEBAR: a double-click follows the system setting, and a panel over the bar keeps the window still; KEYC-METADATA, LRC-LIB-KEYWORDS: ⌥0 / ⌥⇧0 go to the next / previous keyword set; LRC-DEV-HISTOGRAM-DRAG: the histogram's five tonal zones — hover for the value, drag to adjust the Basic control the press locked, double-click to reset; LR-VIEW-HISTOGRAM note updated; MENU-BAR: on macOS a menu item that yields its key to a focused text field or to shortcut recording really lets it go; LR-MERGE-HDR / LR-MERGE-PANO: Lanczos-3 warps; LR-IMP-LOCAL: browsing from the sidebar records the folder; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LR-IMP-ADD-DIALOG: hierarchical import album destination reconciled with main, #2362; KEY-SLIDER-NUDGE: vertical wheel nudges need a click or drag in the row; leaving it disarms them; LR-EDIT-OPTICS-PROFILE: Fujifilm nine-knot lens tables read at the plain radius; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LRC-LIB-LIBFOLDERS, LR-BEHAV-BG-TASKS: Synchronize Folder's scan shows its folder listing and stops it on ✕; LRC-LIB-LIBFOLDERS: Synchronize Folder says a folder is up to date; LR-LIB-STACK: filmstrip stack badge click; LRC-LIB-REFVIEW / CATALOG-SWITCH: Escape preserves edits; catalog-local pins; deleted and malformed references refused; LRC-LIB-COMPARE: the Info panel labels the active photo while culling, #2398; KEYC-RATING: `\` shows / hides the Filter Bar in the grids; LR-VIEW-PHOTOGRID: the grid reads only the photos an import batch or an edit touched, not the whole list; earlier: LRC-PRINT-PAGE: Print Page Options; LR-META-XMP: fewer false unimported-XMP warnings; KEYC-METADATA: ⌘K / Ctrl+K Add Keywords; LRC-DEV-HISTOGRAM-DRAG: the histogram's five tonal zones — hover for the value, drag to adjust the Basic control the press locked, double-click to reset; LR-VIEW-HISTOGRAM note updated; MENU-BAR: on macOS a menu item that yields its key to a focused text field or to shortcut recording really lets it go; LR-MERGE-HDR / LR-MERGE-PANO: Lanczos-3 warps; LR-IMP-LOCAL: browsing from the sidebar records the folder; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LR-IMP-ADD-DIALOG: hierarchical import album destination reconciled with main, #2362; KEY-SLIDER-NUDGE: vertical wheel nudges need a click or drag in the row; leaving it disarms them; LR-EDIT-OPTICS-PROFILE: Fujifilm nine-knot lens tables read at the plain radius; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LRC-LIB-LIBFOLDERS, LR-BEHAV-BG-TASKS: Synchronize Folder's scan shows its folder listing and stops it on ✕; LRC-LIB-LIBFOLDERS: Synchronize Folder says a folder is up to date; LR-LIB-STACK: filmstrip stack badge click; LRC-LIB-REFVIEW / CATALOG-SWITCH: Escape preserves edits; catalog-local pins; deleted and malformed references refused; LRC-LIB-COMPARE: the Info panel labels the active photo while culling, #2398; KEYC-RATING: `\` shows / hides the Filter Bar in the grids; LR-VIEW-PHOTOGRID: the grid reads only the photos an import batch or an edit touched, not the whole list; earlier: LRC-PRINT-PAGE: Print Page Options; LR-META-XMP: fewer false unimported-XMP warnings) · **Target:** Adobe Lightroom Classic 15.5 / Lightroom 9.6 The measured, row-by-row checklist: one row per Lightroom feature, menu item and shortcut, what we have and what is missing. It answers *does the feature exist?* (feature breadth). Whether it is good @@ -123,7 +123,7 @@ differences and missing bindings are in [ui-parity.md](ui-parity.md#shortcuts). | Id | Feature | Tier | Status | Evidence | Missing / notes | |---|---|---|---|---|---| -| LR-VIEW-PHOTOGRID | Justified photo grid | P0 | ✅ | `cmd:view.photoGrid`, `cmd:library.groups`, `cmd:library.sort` (`group`), `crates/ui-egui/src/panels/grid.rs`, `crates/catalog/src/dates.rs` | grouped by capture / import / edit date (day headers “Wednesday, 30 September 2026 · 12 photos”, months or years when zoomed out, or a fixed day/month/year/none choice in the sort menu); sticky header; clicking a header selects its photos; stacks never split; scrolls to the active photo only when it changes (or the grid comes back on screen), never on its own; a mouse-wheel notch scrolls a third of the grid's height, in both grids, as in Lightroom Classic (`theme::WHEEL_STRIP_SHARE`; trackpads scroll the points they report); queued embedded thumbnail stand-ins follow viewport priority changes without another extraction (`crates/ui-egui/src/render.rs`, issue #348; full-app visual/timing verification pending) | +| LR-VIEW-PHOTOGRID | Justified photo grid | P0 | ✅ | `cmd:view.photoGrid`, `cmd:library.groups`, `cmd:library.sort` (`group`), `crates/ui-egui/src/panels/grid.rs`, `crates/catalog/src/dates.rs` | grouped by capture / import / edit date (day headers “Wednesday, 30 September 2026 · 12 photos”, months or years when zoomed out, or a fixed day/month/year/none choice in the sort menu); sticky header; clicking a header selects its photos; stacks never split; scrolls to the active photo only when it changes (or the grid comes back on screen), never on its own; a mouse-wheel notch scrolls a third of the grid's height, in both grids, as in Lightroom Classic (`theme::WHEEL_STRIP_SHARE`; trackpads scroll the points they report); queued embedded thumbnail stand-ins follow viewport priority changes without another extraction (`crates/ui-egui/src/render.rs`, issue #348; full-app visual/timing verification pending); the empty view (an empty album or other source in a library with photos, or an empty Recently Deleted) names Import Photos' shortcut as the menu bar writes it and as bound (⌘⇧I on macOS, Ctrl+Shift+I elsewhere), and none when it is unbound | | LR-VIEW-SQUAREGRID | Square grid | P0 | ✅ | `cmd:view.squareGrid` | same date headers as the photo grid | | LR-VIEW-DETAIL | Single-photo view | P0 | ✅ | `cmd:view.detail`, `crates/ui-egui/src/panels/detail.rs` | a “Rendering…” pill at the bottom of the photo (widget `loupe:rendering`; above the Navigator when that is in the way) once a render has been on its way for 0.5 s with nothing new on screen: over a stand-in (the raw's embedded JPEG, a thumbnail), the previous render after an edit, or, zoomed in, the magnified frame waiting for its window; Before views watch their own renders. Always on (Lightroom Classic makes it a View Options choice). When the render fails behind a stand-in, a caution pill says “This photo can't be opened” (“Original offline · no smart preview” when that is why) with the reason on hover and for screen readers (widget `loupe:renderFailed`; `ui.inspect` → `loupe.failed`) | | LR-VIEW-EDIT | Edit view | P0 | ✅ | `cmd:panel.edit` | | @@ -963,6 +963,7 @@ Latin stays upright. Advanced Japanese composition remains open. Regression cove | 2026-10-23 | patch | LR-BEHAV-ACCESS: the name field of New Album, New Smart Album, Rename and the other one-field dialogs takes the keyboard focus once when the dialog opens instead of every frame, so Tab and Shift+Tab reach the check box, Cancel and OK; status unchanged (🟡) | | 2026-10-22 | minor | LR-CROP-AUTO: Auto straighten turns by at most 10° and only on at least 3 agreeing lines, and says when it finds nothing to level by; measured on 68 photos straightened by hand and 300 left as shot, unwanted turns of more than 1° fell from 79 to 19 of the 300. Downgraded ✅ → 🟡: it still leaves most tilted photos alone | | 2026-10-23 | patch | LRC-LIB-FILTERBAR: showing an album (`library.source`) while the filter holds an album drops the filter's album, as showing a library folder already dropped its folder filter; before, the old album stayed in the filter unseen (the filter bar has no album chip) and narrowed the next source such as All Photos; the row's note says so; status unchanged (✅) | +| 2026-10-28 | patch | LR-VIEW-PHOTOGRID: the grid's empty-view message (shown when a view other than the library is empty) used a fixed "Cmd+Shift+I" (or a translation's fixed copy of it) whatever the platform or the binding, on one line that ran out of a narrow window; it now shows Import Photos' shortcut as the menu bar writes it and as it is bound on its own line, and none when it is unbound, and the sentence wraps; status unchanged (✅) | | 2026-10-27 | patch | MENU-EDIT-SELECTNONE, MENU-EDIT-PASTESELECTED: Select Only Active Photo and Paste Settings from Previous were not in the Edit menu's layout and ended up after Settings…, near the end of the menu; they now sit with the other Select and Paste rows. On macOS the Edit menu no longer shows two separators in a row where Settings… moved to the app menu; status unchanged (✅) | | 2026-10-27 | patch | MENU-FILE-CLOSE, KEY-CLOSEWINDOW: the notes say that Close Window and the red close button of the main window quit the app, after the check Quit makes; kept on purpose; a user page says so; status unchanged (✅) | | 2026-10-24 | patch | LR-BEHAV-MULTISELECT: `library.select` in `replace` mode keeps each photo once, in the order first given; status unchanged (✅) | diff --git a/docs/whats-new.md b/docs/whats-new.md index 2d9a9727a..bbb68499f 100644 --- a/docs/whats-new.md +++ b/docs/whats-new.md @@ -9,6 +9,11 @@ the selected photos as one undo step, only the active photo in Compare and Survey, and moves on with Auto Advance, as the other label keys do. +## 2026-10-28 + +### The empty photo grid names Import Photos' shortcut as it is bound +- When a view is empty and the way in is File ▸ Import Photos…, the message under "No photos" used a fixed "Cmd+Shift+I" (or a translation's fixed copy of it) whatever the platform or the binding. It now shows the key as the menu bar writes it (on a Mac its glyphs, elsewhere Ctrl+Shift+I) on its own line under the sentence, follows a remapped key, and names no key when Import Photos has none. The sentence now wraps in a narrow window instead of running off its edge. + ## 2026-10-27 ### The Edit menu groups Select Only Active Photo and Paste Settings from Previous with their kin