QueuePanel reused one pixel TransformState for all non-fine-tuned items,
mis-placing garments/prints of other sizes. Store the ratio-based template
instead and recompute each item from its own garment/print size.
- add core.composer.image_size() and resolve_transform() (pure, tested)
- queue: set_template() replaces set_transform(); per-item resolve + size cache
- template_panel: expose current_template(); main_window pushes it to the queue
- tests: +4 covering fine-tune precedence, per-size recompute, empty inputs
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Material list:
- Switch asset list from one-per-row to a wrapping thumbnail grid
(IconMode cards: thumbnail + corner checkbox + elided name, subfolder
moved to tooltip).
Templates:
- Template.to_transform_state now contains-fits the print inside the
target box by the print's native aspect ratio (no stretch); falls back
to the box when print size is unknown.
- Feed print native size into template_panel for aspect-aware fitting.
- Shrink built-in template boxes to realistic print proportions.
UI hierarchy:
- Promote 打开文件夹 buttons to primary (filled accent).
- Add inline 归零 (reset angle) and a 重置位置/尺寸/角度 button to the
transform panel; wire it to re-apply the selected template.
- Hide 保存 for built-in templates instead of leaving it greyed.
Docs: record template box/contain behavior (PRD) and the grid layout,
button hierarchy, and reset/save-visibility rules (UI design).
Tests: add 3 aspect-fit cases for to_transform_state.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>