Skip to content

Commit bce5fe3

Browse files
authored
Add bindings for Item's enabled property (#79)
Signed-off-by: Joshua Minor <jminor@users.noreply.github.com>
1 parent a511698 commit bce5fe3

File tree

4 files changed

+74
-46
lines changed

4 files changed

+74
-46
lines changed

Sources/objc/include/opentimelineio.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ bool item_trimmed_range_in_parent(CxxRetainer* self, CxxTimeRange*, CxxErrorStru
135135
CxxTimeRange item_range_in_parent(CxxRetainer* self, CxxErrorStruct*);
136136
CxxRationalTime item_transformed_time(CxxRetainer* self, CxxRationalTime, CxxRetainer* to_item, CxxErrorStruct*);
137137
CxxTimeRange item_transformed_time_range(CxxRetainer* self, CxxTimeRange, CxxRetainer* to_item, CxxErrorStruct*);
138+
bool item_get_enabled(CxxRetainer* self);
139+
void item_set_enabled(CxxRetainer* self, bool enabled);
138140

139141
// MARK: - Transition
140142
CxxRationalTime transition_get_in_offset(CxxRetainer* self);

Sources/objc/opentimelineio.mm

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,16 @@ CxxTimeRange item_transformed_time_range(CxxRetainer* self, CxxTimeRange tr, Cxx
410410
&aeh.error_status));
411411
}
412412

413+
bool item_get_enabled(CxxRetainer* self) {
414+
auto item = SO_cast<otio::Item>(self);
415+
return item->enabled();
416+
}
417+
418+
void item_set_enabled(CxxRetainer* self, bool enabled) {
419+
auto item = SO_cast<otio::Item>(self);
420+
item->set_enabled(enabled);
421+
}
422+
413423
// MARK: - Transition
414424
CxxRationalTime transition_get_in_offset(CxxRetainer* self) {
415425
return cxxRationalTime(SO_cast<otio::Transition>(self)->in_offset());

Sources/swift/Item.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class Item : Composable {
2020
sourceRange: TimeRange? = nil,
2121
effects: [Effect]? = nil,
2222
markers: [Marker]? = nil,
23+
enabled: Bool = true,
2324
metadata: ST? = nil) where ST.Element == Metadata.Dictionary.Element {
2425
self.init()
2526
metadataInit(name, metadata)
@@ -32,14 +33,16 @@ public class Item : Composable {
3233
if let effects = effects {
3334
self.effects.set(contents: effects)
3435
}
36+
self.enabled = enabled
3537
}
3638

3739
public convenience init(name: String? = nil,
3840
sourceRange: TimeRange? = nil,
3941
effects: [Effect]? = nil,
40-
markers: [Marker]? = nil) {
42+
markers: [Marker]? = nil,
43+
enabled: Bool = true) {
4144
self.init(name: name, sourceRange: sourceRange, effects: effects, markers: markers,
42-
metadata: Metadata.Dictionary.none)
45+
enabled: enabled, metadata: Metadata.Dictionary.none)
4346
}
4447

4548
public var sourceRange: TimeRange? {
@@ -56,6 +59,11 @@ public class Item : Composable {
5659
}
5760
}
5861
}
62+
63+
public var enabled: Bool {
64+
get { item_get_enabled(self) }
65+
set { item_set_enabled(self, newValue) }
66+
}
5967

6068
lazy var _markersProperty = { create_item_markers_vector_property(self) }()
6169
lazy var _effectsProperty = { create_item_effects_vector_property(self) }()

Tests/OpenTimelineIOTests/testSO.swift

Lines changed: 52 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class testSO: XCTestCase {
1212
func otioFilePath(_ filename: String) -> String? {
1313
return Bundle.module.path(forResource: filename, ofType: "")
1414
}
15-
15+
1616
func uniqueTmpFileName(_ basename: String) -> URL {
1717
let r = UUID().uuidString
1818
let tmpFile = FileManager.default.temporaryDirectory.appendingPathComponent("otio-tmp-xctest-\(r).otio")
@@ -23,7 +23,7 @@ class testSO: XCTestCase {
2323
let so0 = SerializableObject()
2424
XCTAssert(so0.schemaName == "SerializableObject")
2525
XCTAssert(so0.schemaVersion == 1)
26-
26+
2727
let path = otioFilePath("data/so1.otio")
2828
XCTAssert(path != nil)
2929
if (path == nil) {
@@ -32,22 +32,22 @@ class testSO: XCTestCase {
3232

3333
let so1 = try! SerializableObject.fromJSON(filename: path!)
3434
XCTAssert(so0.isEquivalent(to: so1))
35-
35+
3636
let clip1 = Clip()
3737
clip1.name = "my-clip-1"
38-
38+
3939
let clip1String = try! clip1.toJSON()
4040
let clip2 = try! SerializableObject.fromJSON(string: clip1String)
41-
41+
4242
XCTAssertNotNil(clip2 as? Clip)
4343
XCTAssertNil(clip2 as? Gap)
4444
XCTAssert(clip1.isEquivalent(to: clip2))
45-
45+
4646
let tmpFile = uniqueTmpFileName("t1")
4747
try! clip2.toJSON(url: tmpFile)
4848
XCTAssert(clip2.isEquivalent(to: try! SerializableObject.fromJSON(url: tmpFile)))
4949
try! FileManager.default.removeItem(at: tmpFile)
50-
50+
5151
XCTAssert(!so0.isUnknownSchema)
5252
XCTAssert(!clip2.isUnknownSchema)
5353
}
@@ -64,22 +64,22 @@ class testSO: XCTestCase {
6464
let uso = so as! UnknownSchema
6565
XCTAssert(uso.originalSchemaVersion == 3 && uso.originalSchemaName == "BogusName")
6666
}
67-
67+
6868
func test_SerializableObjectWithMetadata() {
6969
let sowm = SerializableObjectWithMetadata()
7070
let clip = Clip()
7171
sowm.metadata["anInt"] = 1
7272
sowm.metadata["aString"] = "foo"
7373
sowm.metadata["aVector"] = Metadata.Vector(arrayLiteral: 3, "abc", clip)
7474
sowm.name = "sowm"
75-
75+
7676
let sowm2 = try! sowm.clone() as! SerializableObjectWithMetadata
7777
XCTAssert(sowm2.isEquivalent(to: sowm))
78-
78+
7979
let sowm3 = SerializableObjectWithMetadata(name: sowm.name, metadata: sowm.metadata)
8080
let sowm4 = SerializableObjectWithMetadata(name: sowm3.name, metadata: sowm3.metadata.map { $0 })
8181
XCTAssert(sowm3.isEquivalent(to: sowm4))
82-
82+
8383
print(try! sowm.toJSON())
8484
}
8585

@@ -88,8 +88,8 @@ class testSO: XCTestCase {
8888
c.name = "composable"
8989
c.metadata["abc"] = 8
9090
// c.metadata["blah"] = c // Cycles in the graph are currently disallowed
91-
92-
91+
92+
9393
XCTAssert(c.parent == nil)
9494

9595
let c2 = try! c.clone() as! Composable
@@ -98,30 +98,30 @@ class testSO: XCTestCase {
9898
XCTAssert(c2.visible)
9999
XCTAssert(!c2.overlapping)
100100
XCTAssertNil(c2.parent)
101-
101+
102102
print(try! c.toJSON())
103103
}
104-
104+
105105
func test_Marker() {
106106
let tr = TimeRange(startTime: RationalTime(value: 1, rate: 2),
107107
duration: RationalTime(value: 4, rate: 30))
108108
let m = Marker(name: "marker", markedRange: tr, color: Marker.Color.pink.rawValue)
109109
m.metadata["abc"] = 9
110-
110+
111111
let m2 = try! m.clone() as! Marker
112112
XCTAssert(m2.name == "marker")
113113
XCTAssert(m2.metadata["abc"] == 9)
114114
XCTAssert(m2.markedRange == tr)
115115
XCTAssert(m2.color == Marker.Color.pink.rawValue)
116116
XCTAssert(Marker().color == Marker.Color.green.rawValue)
117117
}
118-
118+
119119
func test_SerializableCollection() {
120120
let m1 = Marker(name: "marker1")
121121
let c1 = Clip(name: "clip1")
122122
let sc = SerializableCollection(name: "sc", children: [m1, c1], metadata: [])
123123
sc.metadata["abc"] = 10
124-
124+
125125
let sc2 = try! sc.clone() as! SerializableCollection
126126
XCTAssert(sc2.name == "sc")
127127
XCTAssert(sc2.metadata["abc"] == 10)
@@ -137,16 +137,16 @@ class testSO: XCTestCase {
137137
let child1 = Composable(name: "Composable1")
138138
let child2 = Composable(name: "Composable2")
139139
let child3 = Composable(name: "Composable3")
140-
140+
141141
XCTAssert(child1.parent == nil)
142142
assertErrorType(.illegalIndex, expr: {try c1.remove(index: 0) })
143143

144144
XCTAssert(c1.children.map { $0 } == [])
145145
try! c1.append(child: child1);
146146
XCTAssert(c1.children.map { $0 } == [child1])
147-
147+
148148
XCTAssert(child1.parent === c1)
149-
149+
150150
assertErrorType(.childAlreadyParented, expr: {try c1.append(child: child1)})
151151
try! c1.append(child: child2)
152152
XCTAssert(c1.children.map { $0 } == [child1, child2])
@@ -184,13 +184,13 @@ class testSO: XCTestCase {
184184
func test_item() {
185185
let item = Item(name: "item1")
186186
item.metadata["abc"] = 11
187-
187+
188188
let item2 = Item(name: item.name, metadata: item.metadata)
189189
let item3 = Item()
190-
190+
191191
let item4 = Item(name: "item4")
192192
item4.metadata["xyz"] = 12
193-
193+
194194
let item5 = item2;
195195

196196
XCTAssert(item.isEquivalent(to: item2))
@@ -206,12 +206,21 @@ class testSO: XCTestCase {
206206
XCTAssert(item.visible)
207207
XCTAssert(!item.overlapping)
208208

209+
XCTAssertTrue(item.enabled)
210+
item.enabled = false
211+
XCTAssertFalse(item.enabled)
212+
item.enabled = true
213+
XCTAssertTrue(item.enabled)
214+
215+
let disabledItem = Item(name: "disabled", enabled: false)
216+
XCTAssertFalse(disabledItem.enabled)
217+
209218
assertErrorType(.notImplemented) { try _ = item.duration() }
210219
assertErrorType(.notImplemented) { try _ = item.availableRange() }
211220
assertErrorType(.notImplemented) { try _ = item.trimmedRange() }
212221
assertErrorType(.notImplemented) { try _ = item.visibleRange() }
213222
assertErrorType(.notAChild) { try _ = item.rangeInParent() }
214-
223+
215224
let tr = TimeRange(startTime: RationalTime(value: 10, rate: 12), duration: RationalTime(value: 14, rate: 24))
216225
XCTAssert(try item.transformed(time: tr.startTime, toItem: item) == tr.startTime)
217226
XCTAssert(try item.transformed(timeRange: tr, toItem: item) == tr)
@@ -233,7 +242,7 @@ class testSO: XCTestCase {
233242
let mr1 = MediaReference()
234243
let clip = Clip(name: "clipA", mediaReference: mr1)
235244
let c2 = try! clip.clone()
236-
245+
237246
XCTAssert(clip.isEquivalent(to: c2))
238247
XCTAssert(clip.mediaReference === mr1)
239248
}
@@ -242,28 +251,28 @@ class testSO: XCTestCase {
242251
let s1 = Stack(name: "my-stack")
243252
XCTAssert(s1.isEquivalent(to: try! s1.clone()))
244253
print(try! s1.rangeOfAllChildren())
245-
254+
246255
let result = try! Algorithms.flatten(stack: s1)
247256
let result2 = try! Algorithms.flatten(tracks: [result])
248257
print(result)
249258
print(result2)
250259
}
251-
260+
252261
func test_timeline() {
253262
let t1 = Timeline(name: "t1", globalStartTime: RationalTime(value: 3, rate: 12))
254263
let t2 = Timeline(name: "t2")
255264
XCTAssert(t2.globalStartTime == nil)
256-
265+
257266
t2.globalStartTime = t1.globalStartTime
258267
XCTAssert(t2.globalStartTime == t1.globalStartTime)
259268
t2.globalStartTime = nil
260269
XCTAssert(t2.globalStartTime == nil)
261-
270+
262271
XCTAssert(t1.isEquivalent(to: try! t1.clone()))
263272
let t3 = try! t1.clone() as! Timeline
264273
XCTAssert(t3.isEquivalent(to: t1))
265274
}
266-
275+
267276
func testD0() {
268277
var v = Metadata.Vector()
269278
for i in 0..<10 {
@@ -277,7 +286,7 @@ class testSO: XCTestCase {
277286
// print("[\(i)]: \(value)")
278287
// }
279288
}
280-
289+
281290
/*
282291
func testD2() {
283292
let xx = SerializableObjectWithMetadata()
@@ -287,9 +296,9 @@ class testSO: XCTestCase {
287296
md["a3"] = 3
288297
md["a4"] = 4
289298
md["a5"] = 5
290-
299+
291300
print(xx.metadata)
292-
301+
293302
for (key, value) in xx.metadata {
294303
if let v: Int = value as? Int {
295304
if v >= 3 {
@@ -302,37 +311,37 @@ class testSO: XCTestCase {
302311
print("------------")
303312

304313
_ = Metadata.Dictionary(arrayLiteral: ("integer", 123), ("Double", 3.14159), ("Bool", true))
305-
314+
306315
xx.metadata["keys"] = Metadata.Vector(contents: md.map { $0.0 })
307316
xx.metadata["this_is_cool"] = Metadata.Vector(arrayLiteral: 1, 3, "alpha")
308317
let mv = Metadata.Vector(arrayLiteral: 1, 3, "alpha", md)
309318
xx.metadata["this_is_really_cool"] = Metadata.Vector(mv.compactMap { ($0 as? Int) == nil ? $0 : nil })
310-
319+
311320
var c = xx.metadata["this_is_really_cool"] as! Metadata.Vector
312321
c.append(45678)
313-
322+
314323
let d = (xx.metadata["this_is_really_cool"] as? Metadata.Vector)?.description
315324
// c1.append(12345)
316325

317326
// xx.metadata["legal?"] = (3, 4)
318-
327+
319328
print(try! xx.toJSON())
320329
}
321330
*/
322-
331+
323332
func testD1() {
324333
let xx = Clip()
325-
334+
326335
if let a: Int64 = xx.metadata["abc"] {
327336
print("Yes, abc is: ", a)
328337
}
329338
xx.metadata["abc"] = 3.2498
330339
xx.metadata["nested_copy"] = xx.metadata["nested"]
331-
340+
332341
if let b: Double = xx.metadata["abc"] {
333342
print("[2] Yes, abc is now: ", b)
334343
}
335-
344+
336345
if let r1: RationalTime = (xx.metadata["nested"] as? Metadata.Dictionary)?["r1"] {
337346
print("Got r1: ", r1)
338347
}
@@ -342,8 +351,7 @@ class testSO: XCTestCase {
342351
catch {
343352
print("OOPS: ", error)
344353
}
345-
354+
346355
print(xx.metadata)
347356
}
348357
}
349-

0 commit comments

Comments
 (0)