88import SwiftUI
99import 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
0 commit comments