macOS: projects open from Finder; .pcraft is PhotoCraft's again

The app bundle exported ai.storyteller.effectcraft.document with the
`.pcraft` extension, PhotoCraft's document format. Installing EffectCraft
took `.pcraft` over, and since EffectCraft declared no document types,
neither app was offered for PhotoCraft documents in Finder. EffectCraft's
own projects (.ecproj, .ecprojx) had no file type at all.

- Info.plist: the exported type now tags .ecproj and .ecprojx ("EffectCraft
  Project", conforming to public.data and public.content rather than
  public.image), and CFBundleDocumentTypes makes EffectCraft their owner.
- Finder double-click, Open With, Dock drops and `open -a EffectCraft
  x.ecproj` send a kAEOpenDocuments Apple event that winit 0.30 doesn't
  handle. Register it with the audited fmv-macos-events crate that
  PhotoCraft and PdfCraft use (it keeps the unsafe Objective-C interop out
  of this workspace). Opened paths go through the dropped-file handling, so
  a project opens after the unsaved-changes prompt and media is imported. A
  quit event closes the window.
- The event that launches the app arrives before the UI draws: the first
  frames skip the panels until the fonts are installed, which dropped it.
  The paths wait for EffectcraftApp::is_ready().

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
lloydandClaude Opus 5.5 committed 2026-10-10 14:22:22 +02:00
1 parent 813c7c4650
commit f041aa7782
6 files changed
+141 -4

No files matched your search

+23 -4
View File
@@ -45,25 +45,44 @@
<key>NSHumanReadableCopyright</key>
<string>Copyright © the EffectCraft authors. MIT OR Apache-2.0.</string>
<!-- Effectcraft's own format. -->
<!-- Projects open from Finder (double-click, Open With, Dock); src/apple_events.rs. -->
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>EffectCraft Project</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>CFBundleTypeIconFile</key>
<string>EffectCraft</string>
<key>LSItemContentTypes</key>
<array><string>ai.storyteller.effectcraft.document</string></array>
</dict>
</array>
<!-- EffectCraft's own format: the project (.ecproj) and its XML copy (.ecprojx). -->
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key>
<string>ai.storyteller.effectcraft.document</string>
<key>UTTypeDescription</key>
<string>EffectCraft Document</string>
<string>EffectCraft Project</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
<string>public.image</string>
<string>public.content</string>
</array>
<key>UTTypeIconFile</key>
<string>EffectCraft</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array><string>pcraft</string></array>
<array>
<string>ecproj</string>
<string>ecprojx</string>
</array>
<key>public.mime-type</key>
<array><string>application/x-effectcraft</string></array>
</dict>