world-manager/docs/quick-look-plan.md

3.8 KiB

Quick Look Plan

Current State

The shared Bedrock package inspection layer is implemented in app code and ready to be reused by Quick Look targets:

  • World Manager for Minecraft/Services/MinecraftPackageInspector.swift
    • extracts .mcworld, .mcpack, .mctemplate, and .mcaddon
    • normalizes archives with either flat contents or a single nested top-level folder
    • infers pack type for ambiguous .mcpack and .mcaddon archives
  • World Manager for Minecraft/Services/MinecraftContentMetadataReader.swift
    • shared manifest, icon, display-name, and world metadata parsing
  • World Manager for Minecraft/QuickLook/MinecraftPackageTypes.swift
    • central UTType identifiers and extension definitions
  • World Manager for Minecraft/QuickLook/MinecraftPackageQuickLookModel.swift
    • preview-friendly summary model
  • World Manager for Minecraft/QuickLook/MinecraftPackageThumbnailRenderer.swift
    • branded thumbnail rendering with icon fallback

Archive inspection is covered by tests in World Manager for MinecraftTests/World_Manager_for_MinecraftTests.swift.

Why The Extension Target Is Not Landed Yet

The project is using Xcode's filesystem-synchronized project format. Adding a new Quick Look target by hand in project.pbxproj is possible, but it is the highest-risk part of this feature to do blind because:

  • the target graph, extension point declaration, product embedding, and bundle metadata all need to be correct together
  • a malformed pbxproj can break the project more broadly than a normal source change
  • the extension will need generated or explicit Info.plist keys for document/UTType registration

The parsing and rendering code is now in a shape where the target layer can stay thin.

  1. Add a Quick Look Thumbnail Extension target in Xcode.
  2. Point it at the shared package inspector and thumbnail renderer.
  3. Register support for:
    • .mcworld
    • .mcpack
    • .mctemplate
    • .mcaddon
  4. Add a Quick Look Preview Extension target after thumbnails are working.
  5. Render the preview from MinecraftPackageQuickLookModel.

Thumbnail Extension Outline

Implement a provider roughly like this:

final class ThumbnailProvider: QLThumbnailProvider {
    override func provideThumbnail(
        for request: QLFileThumbnailRequest,
        _ handler: @escaping (QLThumbnailReply?, Error?) -> Void
    ) {
        do {
            let inspection = try MinecraftPackageInspector.inspectArchive(at: request.fileURL)
            defer { MinecraftPackageInspector.cleanup(inspection) }

            guard let image = MinecraftPackageThumbnailRenderer.makeThumbnail(
                for: inspection,
                size: request.maximumSize,
                scale: request.scale
            ) else {
                handler(nil, CocoaError(.fileReadCorruptFile))
                return
            }

            handler(
                QLThumbnailReply(contextSize: request.maximumSize) { context in
                    context.draw(image, in: CGRect(origin: .zero, size: request.maximumSize))
                    return true
                },
                nil
            )
        } catch {
            handler(nil, error)
        }
    }
}

Preview Extension Outline

The preview target can:

  • inspect the archive with MinecraftPackageInspector
  • build display content with MinecraftPackageQuickLookModelBuilder
  • render a compact SwiftUI summary view with:
    • package icon or branded artwork
    • title
    • package kind
    • key facts like version, UUID, minimum engine, game mode, difficulty, and last played

Verification Notes

  • xcodebuild ... build succeeds.
  • xcodebuild ... test currently does not complete cleanly because the existing test target already references IFuseDeviceServices, which is not in scope for the test build. That issue predates the Quick Look work.