Skip to content

Commit cea314b

Browse files
committed
Add effect inspecting
1 parent ef4cc9a commit cea314b

File tree

3 files changed

+76
-38
lines changed

3 files changed

+76
-38
lines changed

OpenTimelineIO-Sample/OpenTimelineIO-Sample/Views/ItemInspectorView.swift

Lines changed: 72 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,32 @@
88
import SwiftUI
99
import OpenTimelineIO
1010

11-
struct ItemInspectorView: View {
11+
struct ItemInspectorView: View
12+
{
13+
// Need to conform to these protocols or else SwiftUI isnt happy
14+
struct SwiftUISafeKeyAndMetadataValueType : Hashable, Identifiable
15+
{
16+
static func == (lhs: ItemInspectorView.SwiftUISafeKeyAndMetadataValueType, rhs: ItemInspectorView.SwiftUISafeKeyAndMetadataValueType) -> Bool {
17+
18+
return lhs.hashValue == rhs.hashValue
19+
20+
}
21+
22+
func hash(into hasher: inout Hasher) {
23+
hasher.combine(key)
24+
}
25+
26+
let id:String
27+
let key: String
28+
let value: (any MetadataValue)
29+
30+
init(id:String, key: String, value: any MetadataValue) {
31+
self.id = id
32+
self.key = key
33+
self.value = value
34+
}
35+
}
36+
1237
@Binding var selectedItem: Item?
1338

1439
@State var jsonExpanded: Bool = false
@@ -54,14 +79,15 @@ struct ItemInspectorView: View {
5479

5580
}
5681

82+
Section(header:Text("Effects"))
83+
{
84+
self.resursiveEffectViewBuilder(effects: selectedItem.effects)
85+
}
86+
5787
Section(header: Text("Metadata") )
5888
{
5989
self.resursiveMetadataViewBuilder(metadata: selectedItem.metadata)
60-
6190
}
62-
63-
64-
//if let metadata = selectedItem.metadata
6591

6692
Section("JSON", isExpanded: self.$jsonExpanded)
6793
{
@@ -87,6 +113,7 @@ struct ItemInspectorView: View {
87113
HStack(alignment: .firstTextBaseline)
88114
{
89115
Text(header + ":")
116+
.bold()
90117
.frame(minWidth: 90, alignment:.trailing)
91118

92119
Text(value.trimmingCharacters(in: .whitespaces))
@@ -224,52 +251,61 @@ struct ItemInspectorView: View {
224251
return try range.startTime.toTimecode() + " - " + range.endTimeExclusive().toTimecode() + " F"
225252
}
226253

227-
struct SwiftUISafeKeyAndMetadataValueType : Hashable, Identifiable
228-
{
229-
static func == (lhs: ItemInspectorView.SwiftUISafeKeyAndMetadataValueType, rhs: ItemInspectorView.SwiftUISafeKeyAndMetadataValueType) -> Bool {
230-
231-
return lhs.hashValue == rhs.hashValue
232-
233-
}
234-
235-
func hash(into hasher: inout Hasher) {
236-
hasher.combine(key)
237-
}
238-
239-
let id:String
240-
let key: String
241-
let value: (any MetadataValue)
242-
243-
init(key: String, value: any MetadataValue) {
244-
self.id = key
245-
self.key = key
246-
self.value = value
247-
}
248-
}
249-
250254
func safeMetadata(metadata:OpenTimelineIO.Metadata.Dictionary) -> [ SwiftUISafeKeyAndMetadataValueType ]
251255
{
252256
var safeMetadata: [ SwiftUISafeKeyAndMetadataValueType ] = []
253257

254-
for (key, value) in metadata
258+
for (index, (key, value)) in metadata.enumerated()
255259
{
256-
safeMetadata.append( SwiftUISafeKeyAndMetadataValueType(key: key, value: value))
260+
safeMetadata.append( SwiftUISafeKeyAndMetadataValueType(id:"\(index)-\(key)", key: key, value: value))
257261
}
258262

259263
return safeMetadata
260264
}
265+
266+
func safeEffects(effects: OpenTimelineIO.SerializableObject.Vector<OpenTimelineIO.Effect>) -> [SwiftUISafeKeyAndMetadataValueType]
267+
{
268+
var safeEffects: [ SwiftUISafeKeyAndMetadataValueType ] = []
269+
270+
for (index, effect) in effects.enumerated()
271+
{
272+
let id = "\(index)-\(effect.name)-\(effect.effectName)"
273+
let key = effect.name.isEmpty ? "\(index)" : "\(effect.name)"
274+
275+
safeEffects.append( SwiftUISafeKeyAndMetadataValueType(id:id, key: key, value: effect.metadata))
276+
}
277+
278+
return safeEffects
279+
}
261280

262281
func resursiveMetadataViewBuilder(metadata: OpenTimelineIO.Metadata.Dictionary, title:String = "Root" ) -> AnyView
263282
{
264283
let safeMetadata = self.safeMetadata(metadata: metadata)
265284

266-
return AnyView ( DisclosureGroup(title)
267-
{
268-
ForEach(safeMetadata, id:\.self) { workAround in
269-
270-
self.resursiveMetadataViewBuilder(workAround: workAround)
285+
return AnyView (
286+
DisclosureGroup(title)
287+
{
288+
ForEach(safeMetadata, id:\.self) { workAround in
289+
290+
self.resursiveMetadataViewBuilder(workAround: workAround)
291+
}
292+
}
293+
)
294+
}
295+
296+
func resursiveEffectViewBuilder(effects: OpenTimelineIO.SerializableObject.Vector<OpenTimelineIO.Effect>, title:String = "Effects" ) -> AnyView
297+
{
298+
let safeMetadata = self.safeEffects(effects: effects)
299+
300+
return AnyView (
301+
DisclosureGroup(title)
302+
{
303+
ForEach(safeMetadata, id:\.self) { workAround in
304+
305+
self.resursiveMetadataViewBuilder(workAround: workAround)
306+
}
271307
}
272-
})
308+
)
273309
}
274310

275311
func resursiveMetadataViewBuilder(workAround: SwiftUISafeKeyAndMetadataValueType) -> AnyView

OpenTimelineIO-Sample/OpenTimelineIO-Sample/Views/TrackView.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,13 @@ struct TrackView : View
5050
ZStack {
5151

5252
RoundedRectangle(cornerRadius: 3)
53-
.fill(Color("TrackHeaderColor"))
53+
.fill(Color("TrackHeaderColor").gradient)
5454
// .strokeBorder(.white, lineWidth: 1)
5555

5656
Text(track.name)
5757
.lineLimit(1)
5858
.font(.system(size: 10))
59+
.bold()
5960
}
6061
.frame(width: 100)
6162
.onTapGesture {

Sources/OpenTimelineIO-AVFoundation/OpenTimelineIO-Extensions/Timeline.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import CoreMedia
99
import AVFoundation
1010
import OpenTimelineIO
11+
import TimecodeKit
1112

1213
public class VideoCompositionValidator : NSObject, AVVideoCompositionValidationHandling
1314
{
@@ -211,7 +212,7 @@ public extension Timeline
211212
compositionAudioMixParams.append(audioMixParams)
212213
}
213214
}
214-
215+
215216
// Composition Validation
216217
for track in composition.tracks
217218
{

0 commit comments

Comments
 (0)