Version 2.0.2
Categories:
RawCull Changelog — v1.9.6 → 2.0.2
Updated on Apple App Store.
✨ New — Image source toggle in zoom / loupe view
Switch between the embedded JPEG preview and a full-size JPEG created from the RAW file while inspecting an image:
- New
ImageSourceToggleViewwith keyboard shortcut support ZoomPreviewHandlersignificantly expanded to manage source switchingZoomOverlayViewupdated with key-action routingFullSizeJPGDiskCacheextended to support the toggle flow- New
DiskCacheAndScanAdmissionTestscovering the cache admission logic
✨ New — Burst Review Queue
A structured review-queue workflow for burst groups:
- New
BurstReviewQueueFilter(.all,.needsReview,.deferred,.reviewed) — filter the culling grid to a specific review state - New
BurstReviewQueuePolicy— stateless logic that derives each group’s effective state (high-confidence, no cautions → auto-reviewed; low confidence or open cautions → needs review) - New
BurstReviewQueueCountsvalue type exposed onRawCullViewModel - Review-state action buttons in
BurstGroupHeaderView: Reviewed, Needs Review, Defer — rendered contextually per current state - State badge overlay on burst group headers (purple = Needs Review, blue = Reviewed, gray = Deferred)
- Filter buttons added to
SimilarityGridSelectionViewtoolbar — live counts shown inline; filter resets to.allon Exit Groups - Auto-sharpness scoring toggle removed from toolbar; scoring now triggered automatically via
runWithAutoScoringbefore burst analysis runs - Review states persisted to the burst analysis disk cache on every state change
🏗️ Refactored — CullingGridView decomposed
The monolithic CullingGridView split into focused, independently testable objects:
CullingGridSelectionCoordinator— selection state & keyboard navigationCullingGridRenderCache— per-cell image caching (keyed byCullingGridRenderCacheKey)CullingGridProgressOverlay— loading progress overlay- Cell data flow cleaned up:
isSelected,ratingValue,ratingDisplay,ratingColornow passed directly toImageItemView, removing ViewModel look-ups inside the cell
🏗️ Refactored — ComparisonGridView decomposed and redesigned
ComparisonGridDisplayState— display/layout state extracted from the viewComparisonGridImageCoordinator— per-pane image loading coordination extracted from the view- Background changed to near-black (
Color.black.opacity(0.97)) for a cinema-style comparison experience BurstComparisonEvidenceViewpromoted to a floating overlay (ZStack+.zIndex(2)) so it no longer pushes image panes down- Image panes fill the full viewport height instead of being constrained to a fixed 3:2 ratio
- Scroll indicators hidden; viewport transform resets automatically when the comparison group or active burst group changes
📦 New — RawParserKit SPM package (rsyncOSX/RawParserKit v1.1.0)
All raw-file parsing logic extracted from RawCull into a standalone, reusable Swift package:
- Sony:
SonyMakerNoteParser,SonyThumbnailExtractor,SonyRawFormat,JPGSonyARWExtractor - Nikon:
NikonMakerNoteParser,NikonThumbnailExtractor,NikonRawFormat,JPGNikonNEFExtractor - Shared:
RawFormat,RawFormatRegistry,RawParserDiagnostics,CancellableImageIOWork,ThumbnailSharpener - ✨ New in package:
SonyRAWJPEGCreator— Sony-specific embedded JPEG creator;ThumbnailErrortyped errors
📦 New — RawCullCore SPM package (rsyncOSX/RawCullCore v1.0.0)
Core data models and domain logic extracted into a standalone package:
- Burst:
BurstGroupingEngine,BurstRankingEngine,BurstAnalysisModels - File model:
RawCullFileItem(replaces the internalFileItem) - Histogram:
HistogramCalculator(replaces the internalCalculateHistogram) - ✨ New in package:
ExifMetadata,FocusPointParser,RawCullSourceCatalog,SaliencyInfo— new shared data types
🏗️ Refactored — ScanStatsSheetView expanded
- Layout widened from 460 → 800 pt; content reorganised into a two-column
HStack - Left column: Culling Status, Catalog Summary, Sharpness Summary, and a new Burst Review section (total groups, needs-review / deferred / reviewed counts)
- Right column: new Burst Label Guide — caption-sized reference grid explaining every confidence and state badge
🧹 Cleanup & dead-code removal
FocusPeakingControlsViewand relatedBurstAnalysisModelsdisplay-only properties removed (moved to package / no longer needed)CacheSettingsTabsimplified — removed staleshowResetConfirmation,showSaveSettingsConfirmation, andcacheConfigstate variablesSharedMemoryCache— 34 lines of redundant code removedSettingsViewModel— dead state and unused helpers prunedImageItemView— substantial simplification following the cell data-flow refactorSharedMainToolbarContent— stale toolbar items removed
🧪 Tests — Cleaned up & extended
Tests for code that moved to SPM packages removed from the main test target; new and expanded tests added:
- ➕
CullingGridCoordinatorTests— coordinator selection and keyboard-navigation logic - ➕
ZoomOverlayKeyActionTests(expanded) — image-source toggle key actions - ➕
DiskCacheAndScanAdmissionTests— full-size JPG disk-cache admission coverage - ➕
CullingModelTests(expanded) —BurstWinnerOverrideexact-membership matching; upsert with differing member sets - ➕
RawCullVerifyTestsConcurrencyTests(expanded) — burst review-state concurrency coverage - ➖ Removed (now tested inside their respective SPM packages):
BurstAnalysisTests,NikonMakerNoteParserTests,SonyMakerNoteParserTests,SimilarityScoringTests,CancellableImageIOWorkTests,ComparisonCandidateInspectorTests,LoupeImageKeyActionTests