Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,11 +139,19 @@ the drag donut shows files and flips on `FlipKeyPressed` / `FlipWheelTurned`: th
can't hold an event back; Explorer and Finder ignore Tab during a drag) and reports one flip per key press.
The editor's Front / Back switch (`ToolbarPageViewModel.EditingBack`) edits either list with the same drag and drop.

## Crop overlay
A group is one slice that opens up to six non-group actions. Its members may be conversions or interactive tools
(for example the PDF Edit group contains Crop and the page editor); groups cannot contain another group. The group
editor offers both kinds, and `UserDataStore.EnsureConsistency` removes missing, duplicate, nested or excess members
without excluding tools.

The Crop tool (`tool-crop`) opens `Views/CropOverlayWindow` instead of running a job: the files one after another,
## Crop overlay and PDF page editor

The image Crop tool (`tool-crop`) and PDF Crop (`tool-pdf-crop`) open `Views/CropOverlayWindow` instead of running a job:
the files one after another,
each cropped by hand and saved by `CropService` (the preset's output rule, the source's quality kept, animated or
multi-frame pictures refused, the EXIF thumbnail dropped), one history entry for the run.
multi-frame pictures refused, the EXIF thumbnail dropped), one history entry for the run. A PDF preview is rendered
with PDFium and the chosen rectangle changes every page's crop box in a copied document opened in modify mode, so
text, vectors, outlines, forms, page labels and document information remain PDF objects and stay attached.

- `CropOverlayViewModel` walks the queue (Enter saves and opens the next file, Skip, Esc closes), keeps a
`CropQueueItem` per file for the strip of thumbnails (waiting, current, done, skipped, failed; a thumbnail is a
Expand All @@ -166,6 +174,14 @@ multi-frame pictures refused, the EXIF thumbnail dropped), one history entry for
- `Controls/CropMath` holds the arithmetic (ratios and their portrait forms, nudging by whole pixels, the frame in
pixels, where the size chip goes, where the dial opens) and is unit tested.

`tool-pdf-pages` opens `Views/PdfPageEditorWindow`: it previews, reorders, rotates, deletes, adds and extracts pages.
Each source PDF's bytes and page sizes are cached once after the window has appeared; thumbnails and the large preview
render off the UI thread. A whole-document edit keeps the original catalogue and changes `/Rotate` in modify mode.
An actual reorder, deletion, addition or extraction builds a new PDF from selected page objects. A PDF that opens
without a password but requires an owner password for modify mode uses the same page-copy fallback as compression;
its outlines and form fields are not preserved by that fallback. Generated copies are writable even when the source
has the read-only attribute; the source's bytes and attributes are left alone.

## Clip window

The Cut a clip tool (`tool-clip`, first on the back of the video donut) opens `Views/ClipWindow` instead of running a
Expand Down
2 changes: 1 addition & 1 deletion docs/ENGINES.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Filee chooses engines automatically. Settings → *Engines* shows their status,
| Windows Imaging Component | part of Windows (Windows only) | **JPEG XR** (JXR, WDP, HDP; HDR screenshots of Windows) → the images ImageMagick writes, and PDF, ICNS, HEIC and SVG through PNG; HDR tone-mapped to SDR |
| Vector graphics | built in (Svg.Skia, SkiaSharp, ACadSharp) | **SVG/SVGZ → PDF (vector) and images**, SVG ↔ SVGZ, **SVG → DXF** (→ DWG with the CAD engine), **raster images → SVG (tracing)**, PDF-compatible AI → PDF, **HP-GL / HP-GL/2 plot files (PLT) → SVG**, PDF and images (pen moves, packed PE polylines, arcs and filled polygons; text labels are not drawn), **Tajima DST embroidery → SVG** (stitches as lines, a palette colour per thread; → PNG, JPG, PDF from there) |
| ICNS | built in | images → ICNS (16–1024 px), ICNS → images |
| PDFsharp | built in (library) | images → PDF, merge, split, page ranges, spreadsheet print-studio assembly, **compression** (smaller PDFs, see below), PDFs without their metadata |
| PDFsharp | built in (library) | images → PDF, merge, split, page ranges, page organising, lossless rotate and crop-box edits, spreadsheet print-studio assembly, **compression** (smaller PDFs, see below), PDFs without their metadata |
| PDFium | built in (library) | PDF → images (multi-page TIFF/GIF supported) |
| Unhwp | built in (library) | HWP/HWPX → TXT, Markdown, HTML (pictures in a `<name>_files` folder next to the Markdown, embedded in the HTML) |
| Text & Markdown (Markdig) | built in (library) | **Markdown → HTML, TXT**; **TXT, LOG, PY, PAC, BAT, COMMAND, LUA, CSS, PS1 → UTF-8 TXT**, preserving source text without running scripts (and → PDF / DOCX through the HWPX writer, rhwp or LibreOffice) |
Expand Down
19 changes: 19 additions & 0 deletions src/Filee.App/Assets/i18n/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,25 @@
"preset.merge_pdf": "دمج PDF",
"merge.order_title": "اختيار ترتيب الدمج",
"merge.order_hint": "حدّد ملفًا وانقله إلى أعلى أو أسفل. تُدمج الملفات بالترتيب من الأعلى إلى الأسفل. (‎Alt+↑ / Alt+↓‎)",
"preset.group_pdf_edit": "تحرير",
"preset.pdf_crop": "اقتصاص PDF",
"preset.pdf_crop.short": "اقتصاص",
"preset.pdf_pages": "ترتيب / حذف الصفحات",
"preset.pdf_pages.short": "الصفحات",
"preset.pdf_add": "إضافة صفحات",
"preset.pdf_add.short": "إضافة",
"preset.pdf_extract": "استخراج صفحة",
"preset.pdf_extract.short": "استخراج",
"preset.split_pdf.short": "تقسيم",
"pdf_editor.title": "تحرير صفحات PDF",
"pdf_editor.hint": "أعد ترتيب الصفحات أو أدرها أو احذفها. أضف صفحات من PDF آخر أو استخرج الصفحة المحددة.",
"pdf_editor.add": "إضافة PDF",
"pdf_editor.delete": "حذف",
"pdf_editor.page": "الصفحة {0}",
"pdf_editor.rotation": "تدوير {0}°",
"pdf_editor.loading": "جارٍ تحميل الصفحات…",
"pdf_editor.saving": "جارٍ حفظ PDF…",
"pdf_editor.saved": "تم الحفظ: {0}",
"preset.split_pdf": "تقسيم PDF",
"preset.compress_pdf": "ضغط PDF",
"preset.searchable_pdf": "PDF قابل للبحث",
Expand Down
19 changes: 19 additions & 0 deletions src/Filee.App/Assets/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,25 @@
"preset.merge_pdf": "Merge PDF",
"merge.order_title": "Choose merge order",
"merge.order_hint": "Select a file and move it up or down. Files are merged from top to bottom. (Alt+↑ / Alt+↓)",
"preset.group_pdf_edit": "Edit",
"preset.pdf_crop": "Crop PDF",
"preset.pdf_crop.short": "Crop",
"preset.pdf_pages": "Reorder / delete pages",
"preset.pdf_pages.short": "Pages",
"preset.pdf_add": "Add pages",
"preset.pdf_add.short": "Add",
"preset.pdf_extract": "Extract page",
"preset.pdf_extract.short": "Extract",
"preset.split_pdf.short": "Split",
"pdf_editor.title": "Edit PDF pages",
"pdf_editor.hint": "Reorder, rotate or delete pages. Add pages from another PDF, or extract the selected page as its own file.",
"pdf_editor.add": "Add PDF",
"pdf_editor.delete": "Delete",
"pdf_editor.page": "Page {0}",
"pdf_editor.rotation": "Rotated {0}°",
"pdf_editor.loading": "Loading pages…",
"pdf_editor.saving": "Saving PDF…",
"pdf_editor.saved": "Saved {0}",
"preset.split_pdf": "Split PDF",
"preset.compress_pdf": "Compress PDF",
"preset.searchable_pdf": "Searchable PDF",
Expand Down
19 changes: 19 additions & 0 deletions src/Filee.App/Assets/i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,25 @@
"preset.merge_pdf": "Combinar PDF",
"merge.order_title": "Elegir el orden de combinación",
"merge.order_hint": "Selecciona un archivo y muévelo arriba o abajo. Los archivos se combinan de arriba abajo. (Alt+↑ / Alt+↓)",
"preset.group_pdf_edit": "Editar",
"preset.pdf_crop": "Recortar PDF",
"preset.pdf_crop.short": "Recortar",
"preset.pdf_pages": "Reordenar / eliminar páginas",
"preset.pdf_pages.short": "Páginas",
"preset.pdf_add": "Añadir páginas",
"preset.pdf_add.short": "Añadir",
"preset.pdf_extract": "Extraer página",
"preset.pdf_extract.short": "Extraer",
"preset.split_pdf.short": "Dividir",
"pdf_editor.title": "Editar páginas PDF",
"pdf_editor.hint": "Reordena, gira o elimina páginas. Añade páginas de otro PDF o extrae la seleccionada como archivo independiente.",
"pdf_editor.add": "Añadir PDF",
"pdf_editor.delete": "Eliminar",
"pdf_editor.page": "Página {0}",
"pdf_editor.rotation": "Girada {0}°",
"pdf_editor.loading": "Cargando páginas…",
"pdf_editor.saving": "Guardando PDF…",
"pdf_editor.saved": "Guardado: {0}",
"preset.split_pdf": "Dividir PDF",
"preset.compress_pdf": "Comprimir PDF",
"preset.searchable_pdf": "PDF con búsqueda",
Expand Down
19 changes: 19 additions & 0 deletions src/Filee.App/Assets/i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,25 @@
"preset.merge_pdf": "Fusionner les PDF",
"merge.order_title": "Choisir l'ordre de fusion",
"merge.order_hint": "Sélectionnez un fichier et déplacez-le vers le haut ou le bas. Les fichiers sont fusionnés de haut en bas. (Alt+↑ / Alt+↓)",
"preset.group_pdf_edit": "Modifier",
"preset.pdf_crop": "Rogner le PDF",
"preset.pdf_crop.short": "Rogner",
"preset.pdf_pages": "Réorganiser / supprimer",
"preset.pdf_pages.short": "Pages",
"preset.pdf_add": "Ajouter des pages",
"preset.pdf_add.short": "Ajouter",
"preset.pdf_extract": "Extraire la page",
"preset.pdf_extract.short": "Extraire",
"preset.split_pdf.short": "Scinder",
"pdf_editor.title": "Modifier les pages PDF",
"pdf_editor.hint": "Réorganisez, faites pivoter ou supprimez des pages. Ajoutez des pages d’un autre PDF ou extrayez la page sélectionnée.",
"pdf_editor.add": "Ajouter un PDF",
"pdf_editor.delete": "Supprimer",
"pdf_editor.page": "Page {0}",
"pdf_editor.rotation": "Rotation {0}°",
"pdf_editor.loading": "Chargement des pages…",
"pdf_editor.saving": "Enregistrement du PDF…",
"pdf_editor.saved": "Enregistré : {0}",
"preset.split_pdf": "Diviser le PDF",
"preset.compress_pdf": "Compresser le PDF",
"preset.searchable_pdf": "PDF consultable",
Expand Down
19 changes: 19 additions & 0 deletions src/Filee.App/Assets/i18n/hi.json
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,25 @@
"preset.merge_pdf": "PDF मर्ज करें",
"merge.order_title": "मर्ज करने का क्रम चुनें",
"merge.order_hint": "फ़ाइल चुनकर उसे ऊपर या नीचे ले जाएँ। फ़ाइलें ऊपर से नीचे के क्रम में मर्ज होंगी। (Alt+↑ / Alt+↓)",
"preset.group_pdf_edit": "संपादित करें",
"preset.pdf_crop": "PDF क्रॉप करें",
"preset.pdf_crop.short": "क्रॉप",
"preset.pdf_pages": "पुनः क्रम / पृष्ठ हटाएँ",
"preset.pdf_pages.short": "पृष्ठ",
"preset.pdf_add": "पृष्ठ जोड़ें",
"preset.pdf_add.short": "जोड़ें",
"preset.pdf_extract": "पृष्ठ निकालें",
"preset.pdf_extract.short": "निकालें",
"preset.split_pdf.short": "विभाजित करें",
"pdf_editor.title": "PDF पृष्ठ संपादित करें",
"pdf_editor.hint": "पृष्ठों का क्रम बदलें, घुमाएँ या हटाएँ। दूसरे PDF से पृष्ठ जोड़ें या चुना हुआ पृष्ठ निकालें।",
"pdf_editor.add": "PDF जोड़ें",
"pdf_editor.delete": "हटाएँ",
"pdf_editor.page": "पृष्ठ {0}",
"pdf_editor.rotation": "{0}° घुमाया",
"pdf_editor.loading": "पृष्ठ लोड हो रहे हैं…",
"pdf_editor.saving": "PDF सहेजा जा रहा है…",
"pdf_editor.saved": "सहेजा गया: {0}",
"preset.split_pdf": "PDF बाँटें",
"preset.compress_pdf": "PDF कंप्रेस करें",
"preset.searchable_pdf": "खोजने योग्य PDF",
Expand Down
19 changes: 19 additions & 0 deletions src/Filee.App/Assets/i18n/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,25 @@
"preset.merge_pdf": "結合",
"merge.order_title": "結合順序を選択",
"merge.order_hint": "ファイルを選択して上下に移動します。上から順に結合されます。(Alt+↑ / Alt+↓)",
"preset.group_pdf_edit": "編集",
"preset.pdf_crop": "PDF をトリミング",
"preset.pdf_crop.short": "トリミング",
"preset.pdf_pages": "並べ替え / 削除",
"preset.pdf_pages.short": "ページ",
"preset.pdf_add": "ページを追加",
"preset.pdf_add.short": "追加",
"preset.pdf_extract": "ページを抽出",
"preset.pdf_extract.short": "抽出",
"preset.split_pdf.short": "分割",
"pdf_editor.title": "PDF ページを編集",
"pdf_editor.hint": "ページの並べ替え、回転、削除ができます。別の PDF から追加するか、選択したページを抽出できます。",
"pdf_editor.add": "PDF を追加",
"pdf_editor.delete": "削除",
"pdf_editor.page": "{0} ページ",
"pdf_editor.rotation": "{0}° 回転",
"pdf_editor.loading": "ページを読み込み中…",
"pdf_editor.saving": "PDF を保存中…",
"pdf_editor.saved": "保存しました: {0}",
"preset.split_pdf": "分割",
"preset.compress_pdf": "圧縮",
"preset.searchable_pdf": "検索可能なPDF",
Expand Down
19 changes: 19 additions & 0 deletions src/Filee.App/Assets/i18n/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,25 @@
"preset.merge_pdf": "PDF 병합",
"merge.order_title": "병합 순서 선택",
"merge.order_hint": "파일을 골라 위아래로 옮기세요. 위에서부터 순서대로 병합돼요. (Alt+↑ / Alt+↓)",
"preset.group_pdf_edit": "편집",
"preset.pdf_crop": "PDF 자르기",
"preset.pdf_crop.short": "자르기",
"preset.pdf_pages": "페이지 순서 / 삭제",
"preset.pdf_pages.short": "페이지",
"preset.pdf_add": "페이지 추가",
"preset.pdf_add.short": "추가",
"preset.pdf_extract": "페이지 추출",
"preset.pdf_extract.short": "추출",
"preset.split_pdf.short": "분할",
"pdf_editor.title": "PDF 페이지 편집",
"pdf_editor.hint": "페이지 순서를 바꾸거나 회전·삭제하세요. 다른 PDF에서 페이지를 추가하거나 선택한 페이지를 추출할 수 있어요.",
"pdf_editor.add": "PDF 추가",
"pdf_editor.delete": "삭제",
"pdf_editor.page": "{0}페이지",
"pdf_editor.rotation": "{0}° 회전",
"pdf_editor.loading": "페이지 불러오는 중…",
"pdf_editor.saving": "PDF 저장 중…",
"pdf_editor.saved": "저장됨: {0}",
"preset.split_pdf": "PDF 분할",
"preset.compress_pdf": "PDF 압축",
"preset.searchable_pdf": "검색 가능한 PDF",
Expand Down
19 changes: 19 additions & 0 deletions src/Filee.App/Assets/i18n/ne.json
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,25 @@
"preset.merge_pdf": "PDF मर्ज गर्नुहोस्",
"merge.order_title": "मर्ज क्रम मिलाउनुहोस्",
"merge.order_hint": "फाइलहरूलाई इच्छित क्रममा मिलाउन तान्नुहोस् र छाड्नुहोस्",
"preset.group_pdf_edit": "सम्पादन",
"preset.pdf_crop": "PDF क्रप गर्नुहोस्",
"preset.pdf_crop.short": "क्रप",
"preset.pdf_pages": "पृष्ठहरू क्रम मिलाउनुहोस् / मेटाउनुहोस्",
"preset.pdf_pages.short": "पृष्ठहरू",
"preset.pdf_add": "पृष्ठहरू थप्नुहोस्",
"preset.pdf_add.short": "थप्नुहोस्",
"preset.pdf_extract": "पृष्ठ निकाल्नुहोस्",
"preset.pdf_extract.short": "निकाल्नुहोस्",
"preset.split_pdf.short": "विभाजन",
"pdf_editor.title": "PDF पृष्ठहरू सम्पादन गर्नुहोस्",
"pdf_editor.hint": "पृष्ठहरूको क्रम मिलाउनुहोस्, घुमाउनुहोस् वा मेटाउनुहोस्। अर्को PDF बाट पृष्ठहरू थप्नुहोस्, वा छानिएको पृष्ठलाई छुट्टै फाइलका रूपमा निकाल्नुहोस्।",
"pdf_editor.add": "PDF थप्नुहोस्",
"pdf_editor.delete": "मेटाउनुहोस्",
"pdf_editor.page": "पृष्ठ {0}",
"pdf_editor.rotation": "{0}° घुमाइयो",
"pdf_editor.loading": "पृष्ठहरू लोड हुँदैछन्…",
"pdf_editor.saving": "PDF सेभ हुँदैछ…",
"pdf_editor.saved": "सेभ भयो: {0}",
"preset.split_pdf": "PDF विभाजन गर्नुहोस्",
"preset.compress_pdf": "PDF कम्प्रेस गर्नुहोस्",
"preset.searchable_pdf": "खोज्न मिल्ने PDF",
Expand Down
19 changes: 19 additions & 0 deletions src/Filee.App/Assets/i18n/pl.json
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,25 @@
"preset.merge_pdf": "Połącz PDF",
"merge.order_title": "Wybierz kolejność scalania",
"merge.order_hint": "Wybierz plik i przesuń go w górę lub w dół. Pliki są scalane od góry do dołu. (Alt+↑ / Alt+↓)",
"preset.group_pdf_edit": "Edytuj",
"preset.pdf_crop": "Przytnij PDF",
"preset.pdf_crop.short": "Przytnij",
"preset.pdf_pages": "Zmień kolejność / usuń",
"preset.pdf_pages.short": "Strony",
"preset.pdf_add": "Dodaj strony",
"preset.pdf_add.short": "Dodaj",
"preset.pdf_extract": "Wyodrębnij stronę",
"preset.pdf_extract.short": "Wyodrębnij",
"preset.split_pdf.short": "Podziel",
"pdf_editor.title": "Edytuj strony PDF",
"pdf_editor.hint": "Zmieniaj kolejność, obracaj lub usuwaj strony. Dodaj strony z innego PDF albo wyodrębnij wybraną stronę.",
"pdf_editor.add": "Dodaj PDF",
"pdf_editor.delete": "Usuń",
"pdf_editor.page": "Strona {0}",
"pdf_editor.rotation": "Obrót {0}°",
"pdf_editor.loading": "Wczytywanie stron…",
"pdf_editor.saving": "Zapisywanie PDF…",
"pdf_editor.saved": "Zapisano: {0}",
"preset.split_pdf": "Podziel PDF",
"preset.compress_pdf": "Kompresuj PDF",
"preset.searchable_pdf": "Przeszukiwalny PDF",
Expand Down
19 changes: 19 additions & 0 deletions src/Filee.App/Assets/i18n/pt-BR.json
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,25 @@
"preset.merge_pdf": "Mesclar PDF",
"merge.order_title": "Escolha a ordem da mesclagem",
"merge.order_hint": "Selecione um arquivo e mova para cima ou para baixo. Os arquivos são mesclados de cima para baixo. (Alt+↑ / Alt+↓)",
"preset.group_pdf_edit": "Editar",
"preset.pdf_crop": "Recortar PDF",
"preset.pdf_crop.short": "Recortar",
"preset.pdf_pages": "Reordenar / excluir páginas",
"preset.pdf_pages.short": "Páginas",
"preset.pdf_add": "Adicionar páginas",
"preset.pdf_add.short": "Adicionar",
"preset.pdf_extract": "Extrair página",
"preset.pdf_extract.short": "Extrair",
"preset.split_pdf.short": "Dividir",
"pdf_editor.title": "Editar páginas do PDF",
"pdf_editor.hint": "Reordene, gire ou exclua páginas. Adicione páginas de outro PDF ou extraia a página selecionada.",
"pdf_editor.add": "Adicionar PDF",
"pdf_editor.delete": "Excluir",
"pdf_editor.page": "Página {0}",
"pdf_editor.rotation": "Girada {0}°",
"pdf_editor.loading": "Carregando páginas…",
"pdf_editor.saving": "Salvando PDF…",
"pdf_editor.saved": "Salvo: {0}",
"preset.split_pdf": "Dividir PDF",
"preset.compress_pdf": "Comprimir PDF",
"preset.searchable_pdf": "PDF pesquisável",
Expand Down
Loading
Loading