M12: move tags in the order panel (#1482)

This commit is contained in:
Earl Co 2026-10-13 06:04:16 +02:00 committed by GitHub
parent 6ed78b9133
commit ecc4a305d7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 111 additions and 28 deletions

View File

@ -7,7 +7,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Greek UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "e04ab5246125efae2bad439e62c150fc10649c4b6796b30565615f5bd7509ec6"
sha256 = "9e72de3704f5faf040d951d39f11e32536c40572cb6af4a2c8456c20d6189b81"
# ATTRIBUTION.toml: one entry per asset (AGENTS.md §1). The source of truth for provenance and licences.
# ATTRIBUTION.md is generated from this file: `cargo xtask assets --write`. Checked by `cargo xtask assets` (part of `xtask ci`).
@ -30,7 +30,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 = "7f600eaa47f23fac4f9f0fece1454e59756c8dc57c7c697502cb02ee21410ac0"
sha256 = "bf481bf7dc5b7bbd51541c5a8c3b2fbeaf545b313bd60070993f057f5b6da7f0"
[[asset]]
path = "crates/ui-egui/src/i18n/zh-hant.tsv"
@ -41,7 +41,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 = "37733adc79d7d32a057811b4dc5eb31251ef8ec91f1dac430253c69faac1c33f"
sha256 = "d07268fcab301a296e6e1c56a691331485cbdee92d8082f125df257fbd808ad1"
[[asset]]
path = "crates/ui-egui/src/i18n/cs.tsv"
@ -52,7 +52,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 = "285b689b5224a66079738ab39d5a27e5f9ba72e1ab42e148f263b7ea320c4729"
sha256 = "1b433cb74952dd5eb94e0ea685d6e8c0c715ce9609005483b832ff5c549c4623"
[[asset]]
path = "crates/ui-egui/src/i18n/pt-br.tsv"
@ -63,7 +63,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 = "e8154a154129ca158396de84d2d432ce1c587477795a6a14985f7834db255744"
sha256 = "a4d149e4a890a2846d18e9193b45f2b40c2b8cc9743ffef6201acdd1aef4c0ca"
[[asset]]
path = "crates/ui-egui/src/i18n/es.tsv"
@ -74,7 +74,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 = "50d4e66209e8b56707bcd148d4644eb0ad9f49dfc195287cfbd851ffbe5c3830"
sha256 = "aab612c6b21b71f45b09e430a046a5d57d3572b20378caad99e960e0847834f9"
[[asset]]
path = "crates/ui-egui/src/i18n/fr.tsv"
@ -85,7 +85,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 = "13e677d44d5224e60af28fcc89d8f8af552368ca3c11f0a871498c60fefa7ee2"
sha256 = "b2cd5d1269a160bc9a02d9a8fc8e7bb0819b40101905ca5552066719134b85f1"
[[asset]]
path = "crates/ui-egui/src/i18n/de.tsv"
@ -96,7 +96,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "German UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "e81112d69acc2e1bbb44c5252f8f323b1d637059b5ac5f4c9fcd3eb985a53442"
sha256 = "35f71ba25148c4d187ef5b1fea0c4ad30d9eac8f6634fdad92cce0328584581f"
[[asset]]
path = "crates/ui-egui/src/i18n/te.tsv"
@ -107,7 +107,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 = "df3d3650af984251372bf22b859ba6aca47f26eeff790e834d57a5a4071a1b48"
sha256 = "162544e5cc09a98c3c3ce957223bca08a09f452a0e1ef25192a2ee07a0cec29d"
[[asset]]
path = "crates/ui-egui/src/i18n/it.tsv"
@ -118,7 +118,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Italian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "c9e453382d9d5c83f7b0f986befc6113a62b4736a6b94a6462805cead406753b"
sha256 = "92c062f32c318875153bebd78afef94528ed7a76c074669325e58755e3494e6e"
[[asset]]
path = "crates/ui-egui/src/i18n/pl.tsv"
@ -129,7 +129,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Polish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "2a205868b13f719dbc91fdc50f1133f5f317aa2245143bfeaa048190bc9c7d8c"
sha256 = "3a39b915005b8139e0505e09484d3532d4d2b3fe57629a8b691397097507c5f3"
[[asset]]
path = "crates/ui-egui/src/i18n/ru.tsv"
@ -140,7 +140,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 = "3053aff461c289404bf3009c611037870b945692c65ce8d7c14ad26ac477660c"
sha256 = "d6dea9f180e65bc80219c36bf58f3017d71f7419bac97b554946c5d0048eef90"
[[asset]]
path = "crates/ui-egui/src/i18n/hu.tsv"
@ -151,7 +151,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Hungarian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "882b3937802bbbd5afe0087264ee4118161351e8828cb02b608488ccfe39bfe9"
sha256 = "026deb06c481650dafcb5237e88f6b60c2ae11df0d6f998727225e3a10fae5aa"
[[asset]]
path = "crates/ui-egui/src/i18n/bg.tsv"
@ -162,7 +162,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Bulgarian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "8cca054e167995ca6d95bc45fc0f75385a15a78852e4b173bd4c5b7b651c5a9d"
sha256 = "2f479cac837466414590f8c4ca5e3d4ff28b45890a60421a3ed6d176bbe8a545"
[[asset]]
path = "crates/ui-egui/src/i18n/kk.tsv"
@ -173,7 +173,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Kazakh UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "2f4a6429c0c290a53268733dac08da221085992036a4d304d7663d7947d806d3"
sha256 = "a3245989fecc7f8f0adcc19f4290744d291860c175ea8cfb3defa513e6e4708a"
[[asset]]
path = "crates/ui-egui/src/i18n/ja.tsv"
@ -184,7 +184,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 = "2792f38b1699269b5886fa99a17c7773c3934df95dc4e2db3ba6a475dd652ba0"
sha256 = "7f6558c2fac98c05cc67d16d470d3f64ecf121261a46c42476cc083830472a3a"
[[asset]]
path = "crates/ui-egui/src/i18n/uk.tsv"
@ -195,7 +195,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Ukrainian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "937ac7eac4230c9a1d26d6bd7ef4f08f8d8c9d391a091682e8758fba3ca9678e"
sha256 = "fb6ff20dc580c7e8fd456fce9857a55a1f2bd9ad560ec9aff886e071040a38fa"
[[asset]]
path = "crates/ui-egui/src/i18n/ar.tsv"
@ -206,7 +206,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Arabic UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "7ced08c3485c5eddf92767e6deb009d72351d70cefe60be654cfdac441f40f4b"
sha256 = "fa96cddb9e789d1af12bc0371fd0757c5cbc068884dde19de82d0beeef07ac90"
[[asset]]
path = "crates/ui-egui/src/i18n/tr.tsv"
@ -217,7 +217,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Turkish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "4e70c6db374db37bf70a17e251675b94128fb11b4d6d20ef669b36fd4ae14ff1"
sha256 = "818aadf33298dda57fc82326ade9d05219a04b1ce2ba38ba9af3c47290e341be"
[[asset]]
path = "crates/ui-egui/src/i18n/lt.tsv"
@ -228,7 +228,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Lithuanian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "d2e6be7cf74525310a203bed7434e7f69d2288d337ee696de2882df8da31a746"
sha256 = "60b0f9f46417ec7b164b14269a17d63a88c1419002ebc3942fb3412a47c9cb7d"
[[asset]]
path = "assets/icons/accessibility.svg"
@ -3351,4 +3351,4 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Slovene UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "6c01a439220415b83acab79c014286e5871ba7946a9c3b9a4776be797d55a086"
sha256 = "228b1032b114d08aa967cc0935c97225f8bd3d95bfa1d64ba71dc99fa1fd470e"

View File

@ -2359,3 +2359,5 @@ animation effects Off معطّلة
The linked PDF opened, but its named destination was not applied. فُتح ملف PDF المرتبط، لكن لم تُطبَّق وجهته المسماة.
The linked PDF opened, but its page destination was out of range. فُتح ملف PDF المرتبط، لكن وجهة الصفحة خارج النطاق.
Local cross-PDF links require the desktop app تتطلب الروابط المحلية بين ملفات PDF تطبيق سطح المكتب
Move tag earlier نقل العلامة للأعلى
Move tag later نقل العلامة للأسفل

Can't render this file because it contains an unexpected character in line 6 and column 47.

View File

@ -2301,3 +2301,5 @@ animation effects Off Изключени
The linked PDF opened, but its named destination was not applied. Свързаният PDF се отвори, но именуваната му цел не беше приложена.
The linked PDF opened, but its page destination was out of range. Свързаният PDF се отвори, но целевата му страница е извън обхвата.
Local cross-PDF links require the desktop app Локалните връзки между PDF файлове изискват настолното приложение
Move tag earlier Преместване на етикета по-рано
Move tag later Преместване на етикета по-късно

Can't render this file because it contains an unexpected character in line 8 and column 16.

View File

@ -2412,3 +2412,5 @@ animation effects Off Vypnuto
The linked PDF opened, but its named destination was not applied. Odkazovaný PDF se otevřel, ale jeho pojmenovaný cíl nebyl použit.
The linked PDF opened, but its page destination was out of range. Odkazovaný PDF se otevřel, ale cílová stránka je mimo rozsah.
Local cross-PDF links require the desktop app Místní odkazy mezi soubory PDF vyžadují desktopovou aplikaci
Move tag earlier Přesunout značku dříve
Move tag later Přesunout značku později

Can't render this file because it contains an unexpected character in line 6 and column 47.

View File

@ -2339,3 +2339,5 @@ animation effects Off Aus
The linked PDF opened, but its named destination was not applied. Die verknüpfte PDF wurde geöffnet, aber ihr benanntes Ziel wurde nicht angewendet.
The linked PDF opened, but its page destination was out of range. Die verknüpfte PDF wurde geöffnet, aber ihr Seitenziel liegt außerhalb des Bereichs.
Local cross-PDF links require the desktop app Lokale Verknüpfungen zwischen PDFs erfordern die Desktop-App
Move tag earlier Tag früher verschieben
Move tag later Tag später verschieben

Can't render this file because it contains an unexpected character in line 6 and column 51.

View File

@ -2348,3 +2348,5 @@ animation effects Off Ανενεργά
Local cross-PDF links require the desktop app Οι τοπικοί σύνδεσμοι μεταξύ PDF απαιτούν την εφαρμογή υπολογιστή
The existing action will be preserved. Η υπάρχουσα ενέργεια θα διατηρηθεί.
This form's scripts are turned off because one ran too long. Reopen the document to run them again. Τα σενάρια αυτής της φόρμας είναι απενεργοποιημένα, επειδή ένα από αυτά εκτελούνταν για πολύ ώρα. Ανοίξτε ξανά το έγγραφο για να εκτελεστούν ξανά.
Move tag earlier Μετακίνηση ετικέτας νωρίτερα
Move tag later Μετακίνηση ετικέτας αργότερα

Can't render this file because it has a wrong number of fields in line 5.

View File

@ -2468,3 +2468,5 @@ animation effects Off Desactivados
The linked PDF opened, but its page destination was out of range. El PDF vinculado se abrió, pero su página de destino está fuera de rango.
Local cross-PDF links require the desktop app Los enlaces locales entre PDF requieren la aplicación de escritorio
The existing action will be preserved. Se conservará la acción existente.
Move tag earlier Mover etiqueta antes
Move tag later Mover etiqueta después

Can't render this file because it contains an unexpected character in line 6 and column 60.

View File

@ -2338,3 +2338,5 @@ animation effects Off Désactivés
The linked PDF opened, but its named destination was not applied. Le PDF lié s'est ouvert, mais sa destination nommée n'a pas été appliquée.
The linked PDF opened, but its page destination was out of range. Le PDF lié s'est ouvert, mais sa page de destination est hors limites.
Local cross-PDF links require the desktop app Les liens locaux entre PDF nécessitent l'application de bureau
Move tag earlier Déplacer la balise plus tôt
Move tag later Déplacer la balise plus tard

Can't render this file because it contains an unexpected character in line 6 and column 39.

View File

@ -2337,3 +2337,5 @@ animation effects Off Ki
The linked PDF opened, but its named destination was not applied. A hivatkozott PDF megnyílt, de a nevesített cél nem lett alkalmazva.
The linked PDF opened, but its page destination was out of range. A hivatkozott PDF megnyílt, de a céloldal a tartományon kívül esik.
Local cross-PDF links require the desktop app A PDF-ek közötti helyi hivatkozásokhoz az asztali alkalmazás szükséges
Move tag earlier Címke korábbra helyezése
Move tag later Címke későbbre helyezése

Can't render this file because it contains an unexpected character in line 7 and column 44.

View File

@ -2347,3 +2347,5 @@ animation effects Off Disattivati
The linked PDF opened, but its named destination was not applied. Il PDF collegato è stato aperto, ma la sua destinazione con nome non è stata applicata.
The linked PDF opened, but its page destination was out of range. Il PDF collegato è stato aperto, ma la pagina di destinazione è fuori intervallo.
Local cross-PDF links require the desktop app I collegamenti locali tra PDF richiedono l'app desktop
Move tag earlier Sposta tag prima
Move tag later Sposta tag dopo

Can't render this file because it contains an unexpected character in line 6 and column 47.

View File

@ -2338,3 +2338,5 @@ animation effects Off オフ
The linked PDF opened, but its named destination was not applied. リンク先の PDF を開きましたが、名前付き移動先は適用されませんでした。
The linked PDF opened, but its page destination was out of range. リンク先の PDF を開きましたが、移動先のページが範囲外です。
Local cross-PDF links require the desktop app PDF 間のローカルリンクにはデスクトップアプリが必要です
Move tag earlier タグを前へ移動
Move tag later タグを後へ移動

Can't render this file because it contains an unexpected character in line 6 and column 47.

View File

@ -2336,3 +2336,5 @@ animation effects Off Өшірулі
The linked PDF opened, but its named destination was not applied. Байланысты PDF ашылды, бірақ оның аталған мақсаты қолданылмады.
The linked PDF opened, but its page destination was out of range. Байланысты PDF ашылды, бірақ оның мақсатты беті ауқымнан тыс.
Local cross-PDF links require the desktop app PDF файлдары арасындағы жергілікті сілтемелер үшін жұмыс үстелі қолданбасы қажет
Move tag earlier Тегті ертерек жылжыту
Move tag later Тегті кейінірек жылжыту

Can't render this file because it contains an unexpected character in line 829 and column 12.

View File

@ -2582,3 +2582,5 @@ key Esc Esc
key Home Home
key End End
key Space Tarpas
Move tag earlier Perkelti žymą anksčiau
Move tag later Perkelti žymą vėliau

Can't render this file because it has a wrong number of fields in line 7.

View File

@ -2318,3 +2318,5 @@ animation effects Off Wyłączone
Local cross-PDF links require the desktop app Lokalne łącza między plikami PDF wymagają aplikacji komputerowej
The existing action will be preserved. Istniejąca akcja zostanie zachowana.
This form's scripts are turned off because one ran too long. Reopen the document to run them again. Skrypty tego formularza są wyłączone, ponieważ jeden z nich działał zbyt długo. Otwórz dokument ponownie, aby znów je uruchomić.
Move tag earlier Przenieś znacznik wcześniej
Move tag later Przenieś znacznik później

Can't render this file because it contains an unexpected character in line 6 and column 47.

View File

@ -2352,3 +2352,5 @@ animation effects Off Desativados
The linked PDF opened, but its named destination was not applied. O PDF vinculado foi aberto, mas seu destino nomeado não foi aplicado.
The linked PDF opened, but its page destination was out of range. O PDF vinculado foi aberto, mas sua página de destino está fora do intervalo.
Local cross-PDF links require the desktop app Links locais entre PDFs exigem o aplicativo para desktop
Move tag earlier Mover tag para antes
Move tag later Mover tag para depois

Can't render this file because it contains an unexpected character in line 9 and column 16.

View File

@ -2251,3 +2251,5 @@ animation effects Off Выкл
The linked PDF opened, but its named destination was not applied. Связанный PDF открыт, но его именованное назначение не применено.
The linked PDF opened, but its page destination was out of range. Связанный PDF открыт, но страница назначения вне допустимого диапазона.
Local cross-PDF links require the desktop app Локальные ссылки между PDF работают только в настольном приложении
Move tag earlier Переместить тег раньше
Move tag later Переместить тег позже

Can't render this file because it contains an unexpected character in line 9 and column 16.

View File

@ -2343,3 +2343,5 @@ animation effects Off Izklopljeni
The linked PDF opened, but its named destination was not applied. Povezani PDF se je odprl, vendar njegov poimenovani cilj ni bil uporabljen.
The linked PDF opened, but its page destination was out of range. Povezani PDF se je odprl, vendar je ciljna stran zunaj obsega.
Local cross-PDF links require the desktop app Lokalne povezave med PDF-ji zahtevajo namizno aplikacijo
Move tag earlier Premakni oznako prej
Move tag later Premakni oznako pozneje

Can't render this file because it contains an unexpected character in line 9 and column 16.

View File

@ -2251,3 +2251,5 @@ animation effects Off ఆఫ్
Local cross-PDF links require the desktop app PDFల మధ్య స్థానిక లింక్‌లకు డెస్క్‌టాప్ యాప్ అవసరం
The existing action will be preserved. ఉన్న చర్య అలాగే ఉంచబడుతుంది.
This form's scripts are turned off because one ran too long. Reopen the document to run them again. ఒక స్క్రిప్ట్ చాలా సేపు నడిచినందున ఈ ఫారమ్ స్క్రిప్ట్‌లు ఆపివేయబడ్డాయి. వాటిని మళ్లీ నడపడానికి పత్రాన్ని మళ్లీ తెరవండి.
Move tag earlier ట్యాగ్‌ను ముందుకు తరలించు
Move tag later ట్యాగ్‌ను వెనుకకు తరలించు

Can't render this file because it contains an unexpected character in line 13 and column 16.

View File

@ -2334,3 +2334,5 @@ animation effects Off Kapalı
The linked PDF opened, but its named destination was not applied. Bağlantılı PDF açıldı, ancak adlandırılmış hedefi uygulanmadı.
The linked PDF opened, but its page destination was out of range. Bağlantılı PDF açıldı, ancak sayfa hedefi aralık dışında.
Local cross-PDF links require the desktop app PDF'ler arası yerel bağlantılar masaüstü uygulamasını gerektirir
Move tag earlier Etiketi daha erken taşı
Move tag later Etiketi daha geç taşı

Can't render this file because it has a wrong number of fields in line 7.

View File

@ -2360,3 +2360,5 @@ animation effects Off Вимкнено
The linked PDF opened, but its named destination was not applied. Пов’язаний PDF відкрито, але його іменоване призначення не застосовано.
The linked PDF opened, but its page destination was out of range. Пов’язаний PDF відкрито, але сторінка призначення поза межами діапазону.
Local cross-PDF links require the desktop app Локальні посилання між PDF працюють лише в настільному застосунку
Move tag earlier Перемістити тег раніше
Move tag later Перемістити тег пізніше

Can't render this file because it contains an unexpected character in line 6 and column 47.

View File

@ -2302,3 +2302,5 @@ animation effects Off 关
The linked PDF opened, but its named destination was not applied. 已打开链接的 PDF,但未应用其命名目标。
The linked PDF opened, but its page destination was out of range. 已打开链接的 PDF,但其页面目标超出范围。
Local cross-PDF links require the desktop app PDF 之间的本地链接需要桌面应用
Move tag earlier 将标签前移
Move tag later 将标签后移

Can't render this file because it contains an unexpected character in line 9 and column 16.

View File

@ -2212,3 +2212,5 @@ animation effects Off 關
The linked PDF opened, but its page destination was out of range. 已開啟連結的 PDF,但其頁面目的地超出範圍。
Local cross-PDF links require the desktop app PDF 之間的本機連結需要桌面應用程式
The existing action will be preserved. 將保留現有動作。
Move tag earlier 將標記前移
Move tag later 將標記後移

Can't render this file because it contains an unexpected character in line 9 and column 16.

View File

@ -5,7 +5,7 @@ use std::sync::Arc;
use egui::Ui;
use pdfcraft_cos::ObjRef;
use pdfcraft_engine::a11y::{TagInfo, TagProperty};
use pdfcraft_engine::a11y::{TagInfo, TagPlacement, TagProperty};
use pdfcraft_engine::{DocId, Edit};
use crate::{icons, theme::Tokens, widgets};
@ -181,13 +181,33 @@ pub(crate) fn panel(ui: &mut Ui, t: &Tokens, doc: DocId, tags: &[TagInfo], state
});
let edit = state.draft.edit(tag);
let mut save = false;
let siblings: Vec<&TagInfo> = tag.parent.map(|parent| tags.iter().filter(|other| other.parent == Some(parent)).collect()).unwrap_or_default();
let position = siblings.iter().position(|sibling| sibling.object == tag.object);
let before = position.and_then(|position| position.checked_sub(1)).map(|position| siblings[position]);
let after = position.and_then(|position| siblings.get(position + 1)).copied();
ui.horizontal(|ui| {
save = ui.add_enabled(can_edit && !state.draft.kind.is_empty() && edit.is_some(), egui::Button::new(tl!("Save tag properties"))).clicked();
if ui.add_enabled(dirty, egui::Button::new(tl!("Revert changes"))).clicked() {
state.draft = Draft::from_tag(tag);
}
});
(page, if save { edit } else { None })
let (mut earlier, mut later) = (false, false);
ui.horizontal(|ui| {
earlier = ui.add_enabled(can_edit && !dirty && before.is_some(), egui::Button::new(tl!("Move tag earlier"))).clicked();
later = ui.add_enabled(can_edit && !dirty && after.is_some(), egui::Button::new(tl!("Move tag later"))).clicked();
});
(
page,
if save {
edit
} else if earlier {
before.map(|anchor| Edit::MoveTag { object: tag.object, anchor: anchor.object, placement: TagPlacement::Before })
} else if later {
after.map(|anchor| Edit::MoveTag { object: tag.object, anchor: anchor.object, placement: TagPlacement::After })
} else {
None
},
)
}
fn visible_tags<'a>(tags: &'a [TagInfo], query: &str, collapsed: &BTreeSet<ObjRef>) -> Vec<&'a TagInfo> {

View File

@ -223,6 +223,27 @@ fn tags_panel_edits_a_tag_property_and_undoes_it() {
assert!(h.query_by_label("First figure · 7").is_none());
}
#[test]
fn tags_panel_moves_a_tag_within_its_siblings() {
let mut h = Harness::builder().with_size(egui::vec2(1400.0, 900.0)).build_eframe(move |_cc| {
let mut app = PdfCraftApp::new();
app.set_option("language", "en").unwrap();
app.open_bytes("figures.pdf", None, FIGURES.to_vec()).unwrap();
app
});
h.run_steps(4);
assert!(h.state_mut().execute("a11y.tags"));
h.run_steps(2);
h.get_by_label("Photo · 8").click();
h.run_steps(1);
h.get_by_label("Move tag earlier").click();
h.run_steps(3);
let s = h.state();
let doc = s.session.get(s.views[0].id).unwrap();
assert_eq!(doc.tags().into_iter().map(|tag| tag.object.num).collect::<Vec<_>>(), [6, 8, 7]);
assert_eq!(doc.can_undo(), Some("Move object"));
}
#[test]
fn checker_finding_opens_its_structure_tag() {
let mut h = Harness::builder().with_size(egui::vec2(1400.0, 900.0)).build_eframe(move |_cc| {

View File

@ -8909,11 +8909,11 @@ title = "Order panel"
area = "M"
tier = "P1"
milestone = "M12"
status = "planned"
commands = []
tools = []
evidence = []
notes = ""
status = "partial"
commands = ["a11y.tags"]
tools = ["accessibility_move_tag"]
evidence = ["crates/ui-egui/tests/accessibility.rs::tags_panel_moves_a_tag_within_its_siblings", "crates/a11y/src/tests.rs::sibling_tags_move_in_reading_order_without_changing_content", "crates/automation/tests/automation.rs::accessibility_check_report_and_fixes_through_tools"]
notes = "The Tags panel moves a selected reachable indirect tag earlier or later among direct siblings, preserving page appearance and making one undoable reading-order edit. It does not yet show page-content order visually, edit direct tag dictionaries, move across parents, or reorder arbitrary content."
[[feature]]
id = "a11y.content-panel"