mirror of
https://github.com/storytold/lightcraft.git
synced 2026-10-27 19:47:35 -06:00
KEYC-METADATA: Alt+0 / Alt+Shift+0 go to the next / previous keyword set
Lightroom Classic's keyboard shortcut page lists Option+0 / Option+Shift+0 (Alt+0 / Alt+Shift+0 on Windows) for cycling forward and backward through the keyword sets; LightCraft had no key or command for it. Next Keyword Set (keyword.nextSet, Alt+0) and Previous Keyword Set (keyword.previousSet, Alt+Shift+0) make the set after or before the current one current, in the Keyword Set menu's order: Recent Keywords, then the saved sets. The keys wrap around at either end, and Alt+1 to Alt+9 then apply the new set's keywords. The two command labels have rows in every catalog. The KEYC-METADATA and LRC-LIB-KEYWORDS rows, docs/ui-parity.md and docs/library-shortcuts.md list the keys.
This commit is contained in:
@@ -154,6 +154,16 @@ pub fn keyword_sets_json(s: &Session) -> Value {
|
||||
json!({"sets": sets, "current": s.keyword_set.clone().unwrap_or_else(|| RECENT.into()), "keywords": current_keywords(s)})
|
||||
}
|
||||
|
||||
/// Make the set `step` places after the current one current, in the Keyword Set menu's order
|
||||
/// (Recent Keywords, then the saved sets), wrapping around from the last to the first and back.
|
||||
fn step_set(s: &mut Session, step: isize) -> Result<Value> {
|
||||
let at = s.keyword_set.as_deref().and_then(|n| s.keyword_sets.iter().position(|x| same_set(&x.name, n))).map_or(0, |i| i + 1);
|
||||
let next = (at as isize + step).rem_euclid(s.keyword_sets.len() as isize + 1) as usize;
|
||||
s.keyword_set = next.checked_sub(1).and_then(|i| s.keyword_sets.get(i)).map(|x| x.name.clone());
|
||||
s.save_prefs()?;
|
||||
Ok(keyword_sets_json(s))
|
||||
}
|
||||
|
||||
pub fn specs() -> Vec<CommandSpec> {
|
||||
vec![
|
||||
cmd!(query "keyword.sets", "Keyword Sets", [], None, "{} → {sets: [{name, keywords}], current, keywords: the nine ⌥1–⌥9 apply}", always, |s, _| Ok(keyword_sets_json(s))),
|
||||
@@ -174,6 +184,24 @@ pub fn specs() -> Vec<CommandSpec> {
|
||||
s.save_prefs()?;
|
||||
Ok(keyword_sets_json(s))
|
||||
}),
|
||||
cmd!(
|
||||
"keyword.nextSet",
|
||||
"Next Keyword Set",
|
||||
[],
|
||||
Some("Alt+0"),
|
||||
"{}: the set after the current one (after the last, Recent Keywords)",
|
||||
always,
|
||||
|s, _| step_set(s, 1)
|
||||
),
|
||||
cmd!(
|
||||
"keyword.previousSet",
|
||||
"Previous Keyword Set",
|
||||
[],
|
||||
Some("Alt+Shift+0"),
|
||||
"{}: the set before the current one (before Recent Keywords, the last)",
|
||||
always,
|
||||
|s, _| step_set(s, -1)
|
||||
),
|
||||
cmd!(
|
||||
"keyword.saveSet",
|
||||
"Save Keyword Set",
|
||||
|
||||
@@ -263,6 +263,29 @@ fn set_names_match_whatever_their_case() {
|
||||
assert!(set_named(&mut s, "ÉTÉ").is_null(), "deleted");
|
||||
}
|
||||
|
||||
/// Next / Previous Keyword Set (⌥0 / ⌥⇧0) step through the sets in the Keyword Set menu's order,
|
||||
/// Recent Keywords first, and wrap around at either end; with no saved sets they stay on Recent
|
||||
/// Keywords.
|
||||
#[test]
|
||||
fn next_and_previous_keyword_set_wrap_around_the_sets() {
|
||||
let mut s = Session::with_demo();
|
||||
let current = |r: serde_json::Value| r["current"].as_str().unwrap_or_default().to_string();
|
||||
assert_eq!(current(s.execute("keyword.nextSet", &json!({})).unwrap()), "Recent Keywords", "no sets: nothing to go to");
|
||||
assert_eq!(current(s.execute("keyword.previousSet", &json!({})).unwrap()), "Recent Keywords");
|
||||
s.execute("keyword.saveSet", &json!({"name": "Weddings", "keywords": ["ceremony"]})).unwrap();
|
||||
s.execute("keyword.saveSet", &json!({"name": "Travel", "keywords": ["harbor"]})).unwrap();
|
||||
s.execute("keyword.useSet", &json!({"name": "Recent Keywords"})).unwrap();
|
||||
let forward: Vec<String> = (0..3).map(|_| current(s.execute("keyword.nextSet", &json!({})).unwrap())).collect();
|
||||
assert_eq!(forward, ["Weddings", "Travel", "Recent Keywords"]);
|
||||
let back: Vec<String> = (0..3).map(|_| current(s.execute("keyword.previousSet", &json!({})).unwrap())).collect();
|
||||
assert_eq!(back, ["Travel", "Weddings", "Recent Keywords"]);
|
||||
let r = s.execute("keyword.nextSet", &json!({})).unwrap();
|
||||
assert_eq!(r["keywords"], json!(["ceremony"]), "⌥1–⌥9 now apply the set's keywords");
|
||||
// a current set that is no longer there counts as Recent Keywords
|
||||
s.keyword_set = Some("Gone".into());
|
||||
assert_eq!(current(s.execute("keyword.nextSet", &json!({})).unwrap()), "Weddings");
|
||||
}
|
||||
|
||||
/// Export Keywords writes the keyword list file, and names the keywords Capture One's importer
|
||||
/// refuses (it allows none of ; , < > in a list); without a path it gives the text.
|
||||
#[test]
|
||||
|
||||
@@ -1193,6 +1193,7 @@
|
||||
"New time": "Nový čas",
|
||||
"New…": "Nový…",
|
||||
"Next Appearance Mode": "Další režim vzhledu",
|
||||
"Next Keyword Set": "Další sada klíčových slov",
|
||||
"Next Photo": "Další fotografie",
|
||||
"Next up for AI Denoise…": "Další na řadě pro redukci šumu pomocí AI…",
|
||||
"Night Blue": "Noční modř",
|
||||
@@ -1402,6 +1403,7 @@
|
||||
"Preview size": "Velikost náhledu",
|
||||
"Preview unavailable": "Náhled není dostupný",
|
||||
"Previews": "Náhledy",
|
||||
"Previous Keyword Set": "Předchozí sada klíčových slov",
|
||||
"Previous Photo": "Předchozí fotografie",
|
||||
"Primaries (x, y)": "Primární barvy (x, y)",
|
||||
"Print": "Tisk",
|
||||
|
||||
@@ -950,6 +950,7 @@
|
||||
"New name": "Neuer Name",
|
||||
"New time": "Neue Zeit",
|
||||
"New…": "Neu…",
|
||||
"Next Keyword Set": "Nächster Stichwortsatz",
|
||||
"Next Photo": "Nächstes Foto",
|
||||
"Night Blue": "Nachtblau",
|
||||
"Nikon NEFs start from a colour and tone look fitted to the camera's own JPEG, as Sony ARWs do, instead of a muted,": "Nikon-NEFs beginnen mit einem Farb- und Tonwertbild, das wie bei Sony-ARWs an das Kamera-JPEG angepasst ist, statt mit einem gedämpften,",
|
||||
@@ -1112,6 +1113,7 @@
|
||||
"Preview size": "Vorschaugröße",
|
||||
"Preview unavailable": "Vorschau nicht verfügbar",
|
||||
"Previews": "Vorschauen",
|
||||
"Previous Keyword Set": "Vorheriger Stichwortsatz",
|
||||
"Previous Photo": "Vorheriges Foto",
|
||||
"Print": "Drucken",
|
||||
"Print…": "Drucken…",
|
||||
|
||||
@@ -961,6 +961,7 @@
|
||||
"New name": "Nuevo nombre",
|
||||
"New time": "Nueva hora",
|
||||
"New…": "Nuevo…",
|
||||
"Next Keyword Set": "Conjunto de palabras clave siguiente",
|
||||
"Next Photo": "Foto siguiente",
|
||||
"Night Blue": "Azul nocturno",
|
||||
"No": "No",
|
||||
@@ -1117,6 +1118,7 @@
|
||||
"Preview size": "Tamaño de la vista previa",
|
||||
"Preview unavailable": "Vista previa no disponible",
|
||||
"Previews": "Vistas previas",
|
||||
"Previous Keyword Set": "Conjunto de palabras clave anterior",
|
||||
"Previous Photo": "Foto anterior",
|
||||
"Print": "Imprimir",
|
||||
"Print…": "Imprimir…",
|
||||
|
||||
@@ -1236,6 +1236,7 @@
|
||||
"New…": "Uusi…",
|
||||
"Next Appearance Mode": "Seuraava ulkoasutila",
|
||||
"Next History Step": "Seuraava historiavaihe",
|
||||
"Next Keyword Set": "Seuraava avainsanajoukko",
|
||||
"Next Photo": "Seuraava kuva",
|
||||
"Next Slide": "Seuraava dia",
|
||||
"Next page": "Seuraava sivu",
|
||||
@@ -1461,6 +1462,7 @@
|
||||
"Preview unavailable": "Esikatselu ei käytettävissä",
|
||||
"Previews": "Esikatselut",
|
||||
"Previous History Step": "Edellinen historiavaihe",
|
||||
"Previous Keyword Set": "Edellinen avainsanajoukko",
|
||||
"Previous Photo": "Edellinen kuva",
|
||||
"Previous Slide": "Edellinen dia",
|
||||
"Previous page": "Edellinen sivu",
|
||||
|
||||
@@ -904,6 +904,7 @@
|
||||
"New name": "Nouveau nom",
|
||||
"New time": "Nouvelle heure",
|
||||
"New…": "Nouveau…",
|
||||
"Next Keyword Set": "Jeu de mots-clés suivant",
|
||||
"Next Photo": "Photo suivante",
|
||||
"Night Blue": "Bleu nuit",
|
||||
"No": "Non",
|
||||
@@ -1059,6 +1060,7 @@
|
||||
"Preview size": "Taille de l'aperçu",
|
||||
"Preview unavailable": "Aperçu indisponible",
|
||||
"Previews": "Aperçus",
|
||||
"Previous Keyword Set": "Jeu de mots-clés précédent",
|
||||
"Previous Photo": "Photo précédente",
|
||||
"Print": "Imprimer",
|
||||
"Print…": "Imprimer…",
|
||||
|
||||
@@ -1233,6 +1233,7 @@
|
||||
"New…": "Baru…",
|
||||
"Next Appearance Mode": "Mode tampilan berikutnya",
|
||||
"Next History Step": "Langkah riwayat berikutnya",
|
||||
"Next Keyword Set": "Set kata kunci berikutnya",
|
||||
"Next Photo": "Foto berikutnya",
|
||||
"Next Slide": "Slide berikutnya",
|
||||
"Next up for AI Denoise…": "Berikutnya dalam antrean pengurangan noise AI…",
|
||||
@@ -1445,6 +1446,7 @@
|
||||
"Preview unavailable": "Pratinjau tidak tersedia",
|
||||
"Previews": "Pratinjau",
|
||||
"Previous History Step": "Langkah riwayat sebelumnya",
|
||||
"Previous Keyword Set": "Set kata kunci sebelumnya",
|
||||
"Previous Photo": "Foto sebelumnya",
|
||||
"Previous Slide": "Slide sebelumnya",
|
||||
"Previous settings": "Pengaturan sebelumnya",
|
||||
|
||||
@@ -907,6 +907,7 @@
|
||||
"New name": "Nuovo nome",
|
||||
"New time": "Nuova ora",
|
||||
"New…": "Nuovo…",
|
||||
"Next Keyword Set": "Set di parole chiave successivo",
|
||||
"Next Photo": "Foto successiva",
|
||||
"Night Blue": "Blu notte",
|
||||
"No": "No",
|
||||
@@ -1068,6 +1069,7 @@
|
||||
"Preview size": "Dimensione dell'anteprima",
|
||||
"Preview unavailable": "Anteprima non disponibile",
|
||||
"Previews": "Anteprime",
|
||||
"Previous Keyword Set": "Set di parole chiave precedente",
|
||||
"Previous Photo": "Foto precedente",
|
||||
"Print": "Stampa",
|
||||
"Print…": "Stampa…",
|
||||
|
||||
@@ -632,6 +632,7 @@
|
||||
"Nested group": "入れ子のグループ",
|
||||
"New Album": "新しいアルバム",
|
||||
"New time": "新しい日時",
|
||||
"Next Keyword Set": "次のキーワードセット",
|
||||
"Next Photo": "次の写真",
|
||||
"Night Blue": "ナイトブルー",
|
||||
"No contributor data was built into this copy.": "このビルドにはコントリビューターのデータが含まれていません",
|
||||
@@ -672,6 +673,7 @@
|
||||
"Preview Build Progress": "プレビュー作成の進行状況",
|
||||
"Preview only: editing the camera's embedded JPEG": "プレビューのみ:カメラの埋め込みJPEGを編集中",
|
||||
"Preview unavailable": "プレビューを表示できません",
|
||||
"Previous Keyword Set": "前のキーワードセット",
|
||||
"Previous Photo": "前の写真",
|
||||
"Profile Browser": "プロファイルブラウザー",
|
||||
"Profile Menu": "プロファイルメニュー",
|
||||
|
||||
@@ -1310,6 +1310,7 @@
|
||||
"New…": "ახალი…",
|
||||
"Next Appearance Mode": "შემდეგი იერსახის რეჟიმი",
|
||||
"Next History Step": "ისტორიის შემდეგი ნაბიჯი",
|
||||
"Next Keyword Set": "საკვანძო სიტყვების შემდეგი ნაკრები",
|
||||
"Next Photo": "შემდეგი ფოტო",
|
||||
"Next up for AI Denoise…": "შემდეგია AI ხმაურის მოცილების რიგში…",
|
||||
"Night Blue": "ღამის ლურჯი",
|
||||
@@ -1534,6 +1535,7 @@
|
||||
"Previews": "წინასწარი ხედები",
|
||||
"Previews match exports on Mac screens": "წინასწარი ხედები ემთხვევა ექსპორტს Mac-ის ეკრანებზე",
|
||||
"Previous History Step": "ისტორიის წინა ნაბიჯი",
|
||||
"Previous Keyword Set": "საკვანძო სიტყვების წინა ნაკრები",
|
||||
"Previous Photo": "წინა ფოტო",
|
||||
"Primaries (x, y)": "ძირითადი ფერები (x, y)",
|
||||
"Print": "ბეჭდვა",
|
||||
|
||||
@@ -886,6 +886,7 @@
|
||||
"New name": "Nowa nazwa",
|
||||
"New time": "Nowy czas",
|
||||
"New…": "Nowy…",
|
||||
"Next Keyword Set": "Następny zestaw słów kluczowych",
|
||||
"Next Photo": "Następne zdjęcie",
|
||||
"Night Blue": "Nocny błękit",
|
||||
"No": "Nie",
|
||||
@@ -1030,6 +1031,7 @@
|
||||
"Preview only": "Tylko podgląd",
|
||||
"Preview size": "Rozmiar podglądu",
|
||||
"Previews": "Podglądy",
|
||||
"Previous Keyword Set": "Poprzedni zestaw słów kluczowych",
|
||||
"Previous Photo": "Poprzednie zdjęcie",
|
||||
"Print": "Drukuj",
|
||||
"Print…": "Drukuj…",
|
||||
|
||||
@@ -916,6 +916,7 @@
|
||||
"New name": "Novo nome",
|
||||
"New time": "Novo horário",
|
||||
"New…": "Novo…",
|
||||
"Next Keyword Set": "Próximo conjunto de palavras-chave",
|
||||
"Next Photo": "Próxima foto",
|
||||
"Night Blue": "Azul noturno",
|
||||
"No": "Não",
|
||||
@@ -1077,6 +1078,7 @@
|
||||
"Preview size": "Tamanho da pré-visualização",
|
||||
"Preview unavailable": "Prévia indisponível",
|
||||
"Previews": "Pré-visualizações",
|
||||
"Previous Keyword Set": "Conjunto de palavras-chave anterior",
|
||||
"Previous Photo": "Foto anterior",
|
||||
"Print": "Imprimir",
|
||||
"Print…": "Imprimir…",
|
||||
|
||||
@@ -760,6 +760,7 @@
|
||||
"New blank PDF": "Новый пустой PDF",
|
||||
"New name": "Новое имя",
|
||||
"New…": "Новый…",
|
||||
"Next Keyword Set": "Следующий набор ключевых слов",
|
||||
"Next Photo": "Следующее фото",
|
||||
"Night Blue": "Ночной синий",
|
||||
"No": "Нет",
|
||||
@@ -897,6 +898,7 @@
|
||||
"Preview size": "Размер просмотра",
|
||||
"Preview unavailable": "Просмотр недоступен",
|
||||
"Previews": "Просмотры",
|
||||
"Previous Keyword Set": "Предыдущий набор ключевых слов",
|
||||
"Previous Photo": "Предыдущее фото",
|
||||
"Print": "Печать",
|
||||
"Print…": "Печать…",
|
||||
|
||||
@@ -1362,6 +1362,7 @@
|
||||
"New…": "Ny…",
|
||||
"Next Appearance Mode": "Nästa utseendeläge",
|
||||
"Next page": "Nästa sida",
|
||||
"Next Keyword Set": "Nästa nyckelordsuppsättning",
|
||||
"Next Photo": "Nästa foto",
|
||||
"Next up for AI Denoise…": "Näst i tur för AI-brusreducering…",
|
||||
"Night Blue": "Nattblå",
|
||||
@@ -1599,6 +1600,7 @@
|
||||
"Previews": "Förhandsgranskningar",
|
||||
"previews": "förhandsgranskningar",
|
||||
"Previous page": "Föregående sida",
|
||||
"Previous Keyword Set": "Föregående nyckelordsuppsättning",
|
||||
"Previous Photo": "Föregående foto",
|
||||
"Previous settings": "Föregående inställningar",
|
||||
"Primaries (x, y)": "Primärfärger (x, y)",
|
||||
|
||||
@@ -855,6 +855,7 @@
|
||||
"Nested group": "Вкладена група",
|
||||
"New Album": "Новий альбом",
|
||||
"New time": "Новий час",
|
||||
"Next Keyword Set": "Наступний набір ключових слів",
|
||||
"Next Photo": "Наступне фото",
|
||||
"Night Blue": "Нічна синява",
|
||||
"No named people in these photos": "На цих фото немає людей з іменами",
|
||||
@@ -887,6 +888,7 @@
|
||||
"Presets and profiles": "Набори налаштувань і профілі",
|
||||
"Preview Build Progress": "Перебіг створення переглядів",
|
||||
"Preview only: editing the camera's embedded JPEG": "Лише перегляд: редагування вбудованого JPEG камери",
|
||||
"Previous Keyword Set": "Попередній набір ключових слів",
|
||||
"Previous Photo": "Попереднє фото",
|
||||
"Profile Browser": "Оглядач профілів",
|
||||
"Profile Menu": "Меню профілів",
|
||||
|
||||
@@ -1136,6 +1136,7 @@
|
||||
"New…": "Mới…",
|
||||
"Next Appearance Mode": "Chế độ giao diện tiếp theo",
|
||||
"Next History Step": "Bước lịch sử sau",
|
||||
"Next Keyword Set": "Bộ từ khóa tiếp theo",
|
||||
"Next Photo": "Ảnh tiếp theo",
|
||||
"Next up for AI Denoise…": "Tiếp theo cho AI Khử nhiễu…",
|
||||
"Night Blue": "Xanh đêm",
|
||||
@@ -1338,6 +1339,7 @@
|
||||
"Preview unavailable": "Không có xem trước",
|
||||
"Previews": "Xem trước",
|
||||
"Previous History Step": "Bước lịch sử trước",
|
||||
"Previous Keyword Set": "Bộ từ khóa trước",
|
||||
"Previous Photo": "Ảnh trước",
|
||||
"Primaries (x, y)": "Màu gốc (x, y)",
|
||||
"Print": "In",
|
||||
|
||||
@@ -981,6 +981,7 @@
|
||||
"New blank PDF": "新建空白 PDF",
|
||||
"New name": "新名称",
|
||||
"New…": "新建…",
|
||||
"Next Keyword Set": "下一个关键字集",
|
||||
"Next Photo": "下一张照片",
|
||||
"Night Blue": "夜色蓝调",
|
||||
"No": "否",
|
||||
@@ -1109,6 +1110,7 @@
|
||||
"Preview only": "仅预览",
|
||||
"Preview size": "预览大小",
|
||||
"Previews": "预览",
|
||||
"Previous Keyword Set": "上一个关键字集",
|
||||
"Previous Photo": "上一张照片",
|
||||
"Print": "打印",
|
||||
"Print…": "打印…",
|
||||
|
||||
@@ -982,6 +982,7 @@
|
||||
"New blank PDF": "新增空白 PDF",
|
||||
"New name": "新名稱",
|
||||
"New…": "新增…",
|
||||
"Next Keyword Set": "下一個關鍵字集",
|
||||
"Next Photo": "下一張照片",
|
||||
"Night Blue": "夜色藍調",
|
||||
"No": "否",
|
||||
@@ -1110,6 +1111,7 @@
|
||||
"Preview only": "僅供預覽",
|
||||
"Preview size": "預覽尺寸",
|
||||
"Previews": "預覽",
|
||||
"Previous Keyword Set": "上一個關鍵字集",
|
||||
"Previous Photo": "上一張照片",
|
||||
"Print": "列印",
|
||||
"Print…": "列印…",
|
||||
|
||||
@@ -160,3 +160,20 @@ fn save_as_a_new_set_keeps_the_original() {
|
||||
assert_eq!(names, ["Recent Keywords", "Weddings", "Ceremonies"]);
|
||||
assert_eq!(s["current"], "Ceremonies");
|
||||
}
|
||||
|
||||
/// ⌥0 / ⌥⇧0 (Alt+0 / Alt+Shift+0) go to the next and the previous keyword set, as in Lightroom
|
||||
/// Classic's Library, and ⌥1 then applies the new set's first keyword.
|
||||
#[test]
|
||||
fn alt_0_and_alt_shift_0_cycle_the_keyword_sets() {
|
||||
let mut h = keywords_panel();
|
||||
h.app.session.execute("keyword.saveSet", &json!({"name": "Weddings", "keywords": ["ceremony"]})).unwrap();
|
||||
h.app.session.execute("keyword.useSet", &json!({"name": "Recent Keywords"})).unwrap();
|
||||
h.settle(SETTLE);
|
||||
ask(&mut h, "ui.key", json!({"key": "0", "alt": true}));
|
||||
assert_eq!(sets(&mut h)["current"], "Weddings", "⌥0: the next set");
|
||||
ask(&mut h, "ui.key", json!({"key": "1", "alt": true}));
|
||||
let id = h.app.session.selected()[0];
|
||||
assert!(h.app.session.catalog.photo(id).unwrap().meta.keywords.iter().any(|k| k == "ceremony"), "⌥1 applied the set's keyword");
|
||||
ask(&mut h, "ui.key", json!({"key": "0", "alt": true, "shift": true}));
|
||||
assert_eq!(sets(&mut h)["current"], "Recent Keywords", "⌥⇧0: the previous set");
|
||||
}
|
||||
|
||||
@@ -83,7 +83,18 @@ Survey and Reference, and leave text fields alone, so the search box still types
|
||||
commands (`view.thumbSizeUp`, `view.thumbSizeDown`, reachable from the control channel and MCP, which
|
||||
return `{"size"}`); the size is saved with the other interface settings.
|
||||
|
||||
Public behaviour references, checked 2026-10-08 (thumbnail size: 2026-10-13):
|
||||
## Keyword sets
|
||||
|
||||
`⌥1`–`⌥9` (`Alt+1`–`Alt+9` on Windows and Linux) add or remove the current keyword set's keywords on
|
||||
the selected photos. `⌥0` makes the next keyword set current and `⌥⇧0` the previous one (`Alt+0` /
|
||||
`Alt+Shift+0`), in the order of the Keywords panel's Keyword Set menu: Recent Keywords, then the saved
|
||||
sets. After the last set comes Recent Keywords again, and before Recent Keywords comes the last set;
|
||||
with no saved sets the keys leave Recent Keywords current. The shortcut list does not say what happens
|
||||
past either end; wrapping around is LightCraft's choice. The same steps are the Next / Previous
|
||||
Keyword Set commands (`keyword.nextSet`, `keyword.previousSet`), which return what `keyword.sets`
|
||||
returns, and both keys can be reassigned in Help → Keyboard Shortcuts.
|
||||
|
||||
Public behavior references, checked 2026-10-08 (thumbnail size: 2026-10-13; keyword sets: 2026-10-24):
|
||||
|
||||
- [Lightroom Classic keyboard shortcuts](https://helpx.adobe.com/lightroom-classic/help/keyboard-shortcuts.html)
|
||||
- [Lightroom Classic flagging, labelling and rating](https://helpx.adobe.com/lightroom-classic/help/flag-label-rate-photos.html)
|
||||
|
||||
File diff suppressed because one or more lines are too long
+4
-1
@@ -1,6 +1,6 @@
|
||||
# UI parity
|
||||
|
||||
> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-23 · **Change:** minor (KEYC-RATING: ⌘L Enable Filters; context menus: a right-click elsewhere on the same widget moves its open menu instead of flashing it, issue #1877; Reference Escape, catalog-local pins and deleted-photo handling verified on Windows; KEYC-RATING: `\` shows / hides the Filter Bar in the grids; earlier: zoom row soft proofing sharp at 1:1, canvas tools by keyboard, focus-order test, ~50 unnamed hand-drawn widgets named) · **Target:** Adobe Lightroom Classic 15.5 / Lightroom 9.6
|
||||
> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-24 · **Change:** minor (KEYC-METADATA: ⌥0 / ⌥⇧0 next / previous keyword set; KEYC-RATING: ⌘L Enable Filters; context menus: a right-click elsewhere on the same widget moves its open menu instead of flashing it, issue #1877; Reference Escape, catalog-local pins and deleted-photo handling verified on Windows; KEYC-RATING: `\` shows / hides the Filter Bar in the grids; earlier: zoom row soft proofing sharp at 1:1, canvas tools by keyboard, focus-order test, ~50 unnamed hand-drawn widgets named) · **Target:** Adobe Lightroom Classic 15.5 / Lightroom 9.6
|
||||
|
||||
How LightCraft's interaction compares with Lightroom's: views, panels, tools and handles, modifier
|
||||
keys, shortcuts, zoom, context menus and feel. Rows for individual menu items and shortcuts live in
|
||||
@@ -72,6 +72,8 @@ under the UI command that wraps it (a no-op error); the UI command now wins.
|
||||
|
||||
**Library navigation keys (KEYC-COMPARE):** in Photo Grid and Square Grid, `Home` / `End` make the first / last photo of the view the active, selected one, and `Shift+Left` / `Shift+Right` add the previous / next photo of the view to the selection (the added photo becomes active; the keys never remove a photo from the selection, and do nothing at either end of the view). They wait in the other views, in the full-screen preview, while a text field or a dialog has the keyboard, and when you gave the key to a command; they are listed under Fixed keys in Help → Keyboard Shortcuts. `Cmd+O` (`Ctrl+O` on Windows and Linux) runs File → Open Library… ; View → Visualize HDR has no default key (`Shift+H` cycles the Tool Overlay, issue #224; `Cmd+Shift+H` stays the Histogram). Covered by `crates/ui-egui/src/tests_keymap.rs`; the macOS native menu path for `Cmd+O` is not exercised by the headless tests.
|
||||
|
||||
**Keyword sets (KEYC-METADATA):** `⌥0` / `⌥⇧0` (`Alt+0` / `Alt+Shift+0` on Windows and Linux) make the next / previous keyword set current (`keyword.nextSet`, `keyword.previousSet`), in the Keyword Set menu's order: Recent Keywords, then the saved sets. After the last set comes Recent Keywords, and before Recent Keywords comes the last set (not documented by Adobe, our choice). `⌥1`–`⌥9` then apply the new set's keywords. Both keys can be reassigned in Help → Keyboard Shortcuts.
|
||||
|
||||
**Still missing / broken:**
|
||||
- Tab / ⇧Tab (hide the side panels / all panels): Tab moves the keyboard focus here (accessibility), so it is
|
||||
not bound; F5 (hide the top panel) is not bound either.
|
||||
@@ -148,6 +150,7 @@ establish OS keyboard delivery or cross-platform acceptance.
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-24 | minor | KEYC-METADATA: ⌥0 / ⌥⇧0 (Alt+0 / Alt+Shift+0) go to the next / previous keyword set, Recent Keywords first, wrapping around at either end |
|
||||
| 2026-10-15 | patch | Context menus: a right-click elsewhere on the same widget while its menu is open moves the menu to the pointer; before it flashed at the new spot and closed (issue #1877); every site uses `widgets::context_menu`; 70% unchanged |
|
||||
| 2026-10-23 | patch | KEYC-RATING: ⌘L / Ctrl+L (Library ▸ Enable Filters) switches the filter off and on, restoring it as it was |
|
||||
| 2026-10-15 | patch | KEYC-RATING: `\` shows / hides the Filter Bar in Photo Grid and Square Grid (Show Original in Detail); ⌘L is the filter-bar key left |
|
||||
|
||||
Reference in New Issue
Block a user