From b4bca6c11b2e7aea8fe826a04763521956674f8b Mon Sep 17 00:00:00 2001 From: vade Date: Thu, 24 Oct 2024 11:54:48 -0400 Subject: [PATCH] Add scrollview optimization --- .../Views/TimelineView.swift | 46 ++++++++++++++++--- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/OpenTimelineIO-Sample/OpenTimelineIO-Reader/Views/TimelineView.swift b/OpenTimelineIO-Sample/OpenTimelineIO-Reader/Views/TimelineView.swift index 91e475b..6e13f09 100644 --- a/OpenTimelineIO-Sample/OpenTimelineIO-Reader/Views/TimelineView.swift +++ b/OpenTimelineIO-Sample/OpenTimelineIO-Reader/Views/TimelineView.swift @@ -18,20 +18,52 @@ struct TimelineView : View { @Binding var secondsToPixels:Double @Binding var selectedItem:Item? + @State private var hitTestEnabled:Bool = false + var body: some View { - let videoTracks = timeline.videoTracks - let audioTracks = timeline.audioTracks + // Lame scroll view optimizations. + // It seems as though hit testing for selection causes massive slowdowns in SwiftUI + // Due to how recursive hit testing happens + // We disable hit testing using macos 15 onScrollPhaseChange - ScrollView([.horizontal, .vertical]) + if #available(macOS 15.0, *) { + ScrollView([.horizontal, .vertical]) + { + self.timelineView() + .allowsHitTesting(self.hitTestEnabled) + .drawingGroup(opaque: true) + + } + .onScrollPhaseChange({ oldPhase, newPhase, context in + guard oldPhase != newPhase else { return } + + self.hitTestEnabled = !newPhase.isScrolling + }) + } + else { + // Fallback on earlier versions + ScrollView([.horizontal, .vertical]) + { + self.timelineView() + } + } + } + + func timelineView() -> some View + { + let videoTracks = timeline.videoTracks + let audioTracks = timeline.audioTracks + + return VStack(alignment:.leading, spacing: 3) { TimeRulerView(timeline: self.timeline, secondsToPixels: self.$secondsToPixels, currentTime: self.$currentTime ) .frame(height: 40) .offset(x:100) -// -// Divider() + // + // Divider() ForEach(0..