mirror of
https://github.com/storytold/photocraft.git
synced 2026-11-11 16:38:24 -06:00
* Brushes: keep the folder hierarchy of imported .abr files (#1851) Photoshop CC brush files keep their Brushes panel folders in a `phry` (preset hierarchy) section; the importer skipped it, so every preset of an .abr landed in one flat group named after the file. - photocraft-psd: `abr::parse` reads `phry` (a token stream of `Grup` {Nm, zuid}, `preset` and `groupEnd` objects) into `AbrFile::folders`, one folder path per preset. A damaged hierarchy never fails the parse: a stray groupEnd, more or fewer preset tokens than presets, folders nested deeper than MAX_FOLDER_DEPTH (32) or an unreadable section become warnings and the affected presets land at the top level. `write_v6_folders` writes `phry` back (`write_v6` is unchanged). - photocraft-paint: `BrushPreset::folder`, the nested folder path inside its group (serde default, so older JSON loads unchanged). - photocraft-io: the file's folders nest inside the group named after the file, as Photoshop's Import Brushes does. - Preset store: each stored preset records its `folder`; group files written before this change load with every preset directly in its group (no rewrite). Paths from disk and from imported .pcpresets files are bounded. - Commands: brush.presets.move, moveGroup, renameGroup and deleteGroup take an optional `folder` path to move a preset into a folder, or to move a folder among its siblings, rename or delete it. importAbr reports the number of folders kept. - Brushes panel and Brush Preset picker: nested folders are drawn indented under their group (list and grid), open and close like groups, take dropped presets, reorder among their siblings by drag and drop, and have Rename/Delete in their context menu. Checked against the 4-folder ABR Photoshop 25.1 exports of its default brushes (8/6/6/8 presets): all 28 land in their folders, and a write/parse round trip keeps them. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * Brushes: bound phry folder allocation; reword the move folder param Review on #2001: - read_phry now runs after every section is read, so it builds folder paths only for the presets in desc (a phry may precede desc), and the paths it holds are capped at 16 MB; presets past the cap import at the top level with a warning. - brush.presets.move documents `folder` as folder names, so the automation filesystem-path classifier no longer flags it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>