Keyboard shortcut to enter page number to jump to (#393)

* added view.read_mode command

* added view.focus_page_input

* Go to page…: Ctrl+Shift+N / ⇧⌘N (Acrobat's), no indexing, rustfmt, catalog entries

Shift+Y alone (the first proposal) would have typed a capital Y in text fields
on Windows and Linux.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Brandon Thomas <echelon@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Austen
2026-10-08 21:37:22 -04:00
committed by GitHub
co-authored by Claude Opus 5.5 Brandon Thomas
parent 9c63f3e8f2
commit 0afe0b7094
12 changed files with 30 additions and 9 deletions
+9 -9
View File
@@ -19,7 +19,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Simplified Chinese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "741e71280fc40ccf711fd8c2d7cf9ad66ceb4305827b2a82b462c2a27af25d92"
sha256 = "50ec1133889f3a3948a3901a9fa40b3499f3c549b605e55848138483946d74da"
[[asset]]
path = "crates/ui-egui/src/i18n/zh-hant.tsv"
@@ -30,7 +30,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Traditional Chinese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "7e64066dd8d5a872899a1bd19916ee4b3a57effffe54a55d6e0a5777798fc97d"
sha256 = "3746a7d87fb98c9f3aeb41c63ce50371c42dfebca64b67ccbb599abb36a93ba8"
[[asset]]
path = "crates/ui-egui/src/i18n/cs.tsv"
@@ -41,7 +41,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Czech UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "1facd561cbfbfa4f2cc81c783f4ed7675871a3d63724e8b2c0fb9e29550ea4f3"
sha256 = "2c09a121e493fb123d9f886529f62268119ca580ad5d5300eca61d4a39216827"
[[asset]]
path = "crates/ui-egui/src/i18n/pt-br.tsv"
@@ -52,7 +52,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Brazilian Portuguese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "c041497ad777eb4616a204a2fbe78c6bfc38150632450d83d8498f1c573b74eb"
sha256 = "0ccf62e34424981d5980eeaee8799db2653a4c186807df143326ef9881959006"
[[asset]]
path = "crates/ui-egui/src/i18n/es.tsv"
@@ -63,7 +63,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Spanish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "e7c4d57500dea64165fe9a356bab10ed1e288bf3a8b1d6ab8377ee642e0fd109"
sha256 = "0b579afad6e52b98cef5e61e07e238d9cf76cc7f295395f7e1c855400e5fbaf9"
[[asset]]
path = "crates/ui-egui/src/i18n/fr.tsv"
@@ -74,7 +74,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "French UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "4a8508d6fd385dff2d9214e41719824639c0608e5807c46d32ad2933e679f6e1"
sha256 = "956753e05b5a9e1d4c4a63ee57667cc9fa5bb95288c3d46c6b15435b83d6ed8d"
[[asset]]
path = "crates/ui-egui/src/i18n/te.tsv"
@@ -85,7 +85,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Telugu UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "b2a4bb2fc0eb247cada87f14c8186abf72cd36b7269d173503fcb65383a9439e"
sha256 = "e8b96edd718a1cd212b7440c4ab100f2555c97dccb0cda289bdb1775d5f3aa61"
[[asset]]
path = "crates/ui-egui/src/i18n/ru.tsv"
@@ -96,7 +96,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Russian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "d9419953763bcb55a017196d72d28e8e47eb5e9197fd508e348bc047fcb433db"
sha256 = "136a9ae206c4ee5aad29d248613c568799080b4b3ee9cd197233072ee9a2983a"
[[asset]]
path = "crates/ui-egui/src/i18n/ja.tsv"
@@ -107,7 +107,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Japanese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "f8af4c1a71747533dc4b609c495c19c47f9ad6aefe1f470dfcb6440a43f3e55f"
sha256 = "d2e7114c70da3c52200cf68e9023dc32ff462439795784e49c2ae771531240e2"
[[asset]]
path = "assets/icons/accessibility.svg"
+1
View File
@@ -193,6 +193,7 @@ pub const COMMANDS: &[CommandSpec] = &[
c("edit.snapshot", "Take a snapshot", EDIT, None, Document, "camera"),
c("view.full_screen", "Full screen mode", VIEW, Some(Shortcut::cmd("L")), Document, "maximize"),
c("view.read_mode", "Read mode", VIEW, Some(Shortcut { command: true, shift: false, mac_ctrl: true, key: "H" }), Document, "book-open"),
c("view.focus_page_input", "Go to page…", VIEW, Some(Shortcut::cmd_shift("N")), Document, "text-cursor-input"),
c("view.theme", "Switch light / dark theme", None, None, Nothing, "moon"),
c("view.theme.system", "Use system setting", None, None, Nothing, "settings"),
c("view.theme.light", "Light gray", None, None, Nothing, "sun"),
+11
View File
@@ -133,6 +133,17 @@ impl PdfCraftApp {
self.views[i].open_find();
}
}
"view.focus_page_input" => {
if let (Some(ctx), Some(view)) = (self.ctx.clone(), active.and_then(|i| self.views.get(i))) {
// The page box in the toolbar (chrome.rs); select its number so typing replaces it.
let id = egui::Id::new("page-input");
ctx.memory_mut(|m| m.request_focus(id));
let mut state = egui::TextEdit::load_state(&ctx, id).unwrap_or_default();
let len = view.page_input.chars().count();
state.cursor.set_char_range(Some(egui::text::CCursorRange::two(egui::text::CCursor::new(0), egui::text::CCursor::new(len))));
state.store(&ctx, id);
}
}
"view.palette" => self.palette_open = !self.palette_open,
layout if crate::canvas::PageLayout::from_command(layout).is_some() => {
if let (Some(i), Some(layout)) = (active, crate::canvas::PageLayout::from_command(layout)) {
+1
View File
@@ -111,3 +111,4 @@
Choose a PNG or JPEG image (up to 4 MiB). Transparency is preserved. Vyberte obrázek PNG nebo JPEG (nejvýše 4 MiB). Průhlednost bude zachována.
Couldn't import the signature image: {e} Obrázek podpisu nelze importovat: {e}
Portable mode is off: {folder} can't be written ({error}). Settings are kept in your user folder instead. Přenosný režim je vypnutý: do složky {folder} nelze zapisovat ({error}). Nastavení se místo toho ukládá do vaší uživatelské složky.
Go to page… Přejít na stránku…
Can't render this file because it contains an unexpected character in line 7 and column 81.
+1
View File
@@ -1998,3 +1998,4 @@
None of those files can be made into a PDF; use PDFs, images or .txt files Ninguno de esos archivos se puede convertir en PDF; use archivos PDF, imágenes o .txt
Choose a PNG or JPEG image (up to 4 MiB). Transparency is preserved. Elija una imagen PNG o JPEG (hasta 4 MiB). Se conserva la transparencia.
Couldn't import the signature image: {e} No se pudo importar la imagen de la firma: {e}
Go to page… Ir a la página…
Can't render this file because it contains an unexpected character in line 6 and column 60.
+1
View File
@@ -2032,3 +2032,4 @@
You can pin up to {n} folders. Unpin one first. Vous pouvez épingler jusqu'à {n} dossiers. Désépinglez-en un d'abord.
Pinned {folder} to Home {folder} épinglé à l'Accueil
No recent files Aucun fichier récent
Go to page… Aller à la page…
Can't render this file because it contains an unexpected character in line 6 and column 39.
+1
View File
@@ -1974,3 +1974,4 @@
None of those files can be made into a PDF; use PDFs, images or .txt files これらのファイルは PDF にできません。PDF、画像、.txt ファイルを使用してください
Choose a PNG or JPEG image (up to 4 MiB). Transparency is preserved. PNG または JPEG 画像を選択してください(最大 4 MiB)。透明度は保持されます。
Couldn't import the signature image: {e} 署名画像を読み込めませんでした: {e}
Go to page… ページへ移動…
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -65,3 +65,4 @@
Choose a PNG or JPEG image (up to 4 MiB). Transparency is preserved. Escolha uma imagem PNG ou JPEG (até 4 MiB). A transparência é preservada.
Couldn't import the signature image: {e} Não foi possível importar a imagem da assinatura: {e}
Portable mode is off: {folder} can't be written ({error}). Settings are kept in your user folder instead. O modo portátil está desativado: não é possível gravar em {folder} ({error}). As configurações ficam na sua pasta de usuário.
Go to page… Ir para a página…
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1
View File
@@ -1993,3 +1993,4 @@
No changes to save Нет изменений для сохранения
Created a PDF from {n} files; left out: {names} PDF создан из файлов: {n}; пропущены: {names}
Created a PDF from the first {n} files PDF создан из первых файлов: {n}
Go to page… Перейти на страницу…
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1
View File
@@ -2018,3 +2018,4 @@ action wizard Start ప్రారంభించు
Open Recent ఇటీవలివి తెరువు
Pin folder to Home… ఫోల్డర్‌ను హోమ్‌కు పిన్ చేయి…
No recent files ఇటీవలి ఫైళ్లు లేవు
Go to page… పేజీకి వెళ్లు…
Can't render this file because it contains an unexpected character in line 13 and column 16.
+1
View File
@@ -2043,3 +2043,4 @@
None of those files can be made into a PDF; use PDFs, images or .txt files 这些文件都无法转换为 PDF;请使用 PDF、图像或 .txt 文件
Choose a PNG or JPEG image (up to 4 MiB). Transparency is preserved. 选择 PNG 或 JPEG 图像(最大 4 MiB)。透明度会保留。
Couldn't import the signature image: {e} 无法导入签名图像:{e}
Go to page… 转到页面…
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1
View File
@@ -1967,3 +1967,4 @@
None of those files can be made into a PDF; use PDFs, images or .txt files 這些檔案都無法轉換為 PDF;請使用 PDF、圖片或 .txt 檔案
Choose a PNG or JPEG image (up to 4 MiB). Transparency is preserved. 選擇 PNG 或 JPEG 圖像(最大 4 MiB)。透明度會保留。
Couldn't import the signature image: {e} 無法匯入簽名圖像:{e}
Go to page… 轉到頁面…
Can't render this file because it contains an unexpected character in line 9 and column 16.