Skip to content

Commit 274b624

Browse files
authored
Layer migration support (#90)
1 parent 5bd47f2 commit 274b624

20 files changed

Lines changed: 434 additions & 111 deletions

Sources/StitchSchemaKit/SchemaVersions.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public typealias CurrentLayerInputDataEntity = LayerInputDataEntity_V22
9393
public typealias CurrentCanvasItemId = CanvasItemId_V22
9494
public typealias CurrentLayerInputCoordinate = LayerInputCoordinate_V22
9595
public typealias CurrentLayerOutputCoordinate = LayerOutputCoordinate_V22
96-
public typealias CurrentPinToId = PinToId_V22
96+
//public typealias CurrentPinToId = PinToId_V22
9797

9898
// MARK: - end
9999

@@ -183,7 +183,7 @@ public typealias LayerInputDataEntity = CurrentLayerInputDataEntity.LayerInputDa
183183
public typealias CanvasItemId = CurrentCanvasItemId.CanvasItemId
184184
public typealias LayerInputCoordinate = CurrentLayerInputCoordinate.LayerInputCoordinate
185185
public typealias LayerOutputCoordinate = CurrentLayerOutputCoordinate.LayerOutputCoordinate
186-
public typealias PinToId = CurrentPinToId.PinToId
186+
//public typealias PinToId = CurrentPinToId.PinToId
187187

188188
public enum StitchSchemaVersion: Int, VersionType {
189189
case _V1 = 1

Sources/StitchSchemaKit/V22/CommentBoxData_V22.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ extension CommentBoxData_V22.CommentBoxData: StitchVersionedCodable {
6262
title: previousInstance.title,
6363
color: previousInstance.color,
6464

65-
// MARK: just needed for V22, should point to property in future versions
65+
// MARK: just needed for v21, should point to property in future versions
6666
nodes: .init(),
6767

6868
position: previousInstance.position,

Sources/StitchSchemaKit/V22/Document/StitchDocument_V22.swift

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,22 @@ public enum StitchDocument_V22: StitchSchemaVersionable {
7676

7777
extension StitchDocument_V22.StitchDocument {
7878
public init(previousInstance: StitchDocument_V22.PreviousInstance) {
79+
let nodes = StitchDocument_V22.NodeEntitySchemas(previousElements: previousInstance.nodes)
80+
81+
// Using migrated node data, find connected layer inputs lacking a canvas item.
82+
// Create the item and locate it near its upstream node
83+
let adjustedNodes = nodes.map { node in
84+
switch node.nodeTypeEntity {
85+
case .layer(var layerNode):
86+
var node = node
87+
layerNode.createConnectedCanvasItems(nodes: nodes)
88+
node.nodeTypeEntity = .layer(layerNode)
89+
return node
90+
default:
91+
return node
92+
}
93+
}
94+
7995
self.init(
8096
projectId: previousInstance.projectId,
8197
name: previousInstance.name,
@@ -84,7 +100,7 @@ extension StitchDocument_V22.StitchDocument {
84100
previewWindowBackgroundColor: previousInstance.previewWindowBackgroundColor,
85101
localPosition: previousInstance.localPosition,
86102
zoomData: previousInstance.zoomData,
87-
nodes: StitchDocument_V22.NodeEntitySchemas(previousElements: previousInstance.nodes),
103+
nodes: adjustedNodes,
88104
orderedSidebarLayers: StitchDocument_V22.SidebarLayerDataList(previousElements: previousInstance.orderedSidebarLayers),
89105
commentBoxes: StitchDocument_V22.CommentBoxes(previousElements: previousInstance.commentBoxes),
90106
cameraSettings: StitchDocument_V22.CameraSettings(previousInstance: previousInstance.cameraSettings)

Sources/StitchSchemaKit/V22/Node/CanvasItemId_V22.swift

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Foundation
1010
public enum CanvasItemId_V22: StitchSchemaVersionable {
1111
// MARK: - ensure versions are correct
1212
static var version: StitchSchemaVersion = StitchSchemaVersion._V22
13-
public typealias PreviousInstance = CanvasItemId_V21.CanvasItemId
13+
public typealias PreviousInstance = Self.CanvasItemId
1414
public typealias LayerInputCoordinate = LayerInputCoordinate_V22.LayerInputCoordinate
1515
public typealias LayerOutputCoordinate = LayerOutputCoordinate_V22.LayerOutputCoordinate
1616
// MARK: - endif
@@ -25,13 +25,6 @@ public enum CanvasItemId_V22: StitchSchemaVersionable {
2525

2626
extension CanvasItemId_V22.CanvasItemId: StitchVersionedCodable {
2727
public init(previousInstance: CanvasItemId_V22.PreviousInstance) {
28-
switch previousInstance {
29-
case .node(let x):
30-
self = .node(x)
31-
case .layerInput(let x):
32-
self = .layerInput(.init(previousInstance: x))
33-
case .layerOutput(let x):
34-
self = .layerOutput(.init(previousInstance: x))
35-
}
28+
fatalError()
3629
}
3730
}

Sources/StitchSchemaKit/V22/Node/CanvasNodeEntity_V22.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ public enum CanvasNodeEntity_V22: StitchSchemaVersionable {
3535

3636
extension CanvasNodeEntity_V22.CanvasNodeEntity: StitchVersionedCodable {
3737
public init(previousInstance: CanvasNodeEntity_V22.PreviousInstance) {
38-
self.position = previousInstance.position
39-
self.zIndex = previousInstance.zIndex
40-
self.parentGroupNodeId = previousInstance.parentGroupNodeId
38+
self.init(position: previousInstance.position,
39+
zIndex: previousInstance.zIndex,
40+
parentGroupNodeId: previousInstance.parentGroupNodeId)
4141
}
4242
}
4343

Sources/StitchSchemaKit/V22/Node/Group/GroupNodeID_V22.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Foundation
1010
public enum GroupNodeID_V22: StitchSchemaVersionable {
1111
// MARK: - ensure versions are correct
1212
static var version: StitchSchemaVersion = StitchSchemaVersion._V22
13-
public typealias PreviousInstance = GroupNodeID_V21.GroupNodeId
13+
public typealias PreviousInstance = Self.GroupNodeId
1414
// MARK: - endif
1515

1616
public struct GroupNodeId: Equatable, Hashable, Identifiable {

Sources/StitchSchemaKit/V22/Node/Layer/LayerInputCoordinate_V22.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Foundation
1010
public enum LayerInputCoordinate_V22: StitchSchemaVersionable {
1111
// MARK: - ensure versions are correct
1212
static var version: StitchSchemaVersion = StitchSchemaVersion._V22
13-
public typealias PreviousInstance = LayerInputCoordinate_V21.LayerInputCoordinate
13+
public typealias PreviousInstance = Self.LayerInputCoordinate
1414
public typealias LayerInputType = LayerInputType_V22.LayerInputType
1515
// MARK: - endif
1616

@@ -28,7 +28,6 @@ public enum LayerInputCoordinate_V22: StitchSchemaVersionable {
2828

2929
extension LayerInputCoordinate_V22.LayerInputCoordinate: StitchVersionedCodable {
3030
public init(previousInstance: LayerInputCoordinate_V22.PreviousInstance) {
31-
self.node = previousInstance.node
32-
self.keyPath = .init(previousInstance: previousInstance.keyPath)
31+
fatalError()
3332
}
3433
}

Sources/StitchSchemaKit/V22/Node/Layer/LayerInputDataEntity_V22.swift

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,65 @@ public enum LayerInputDataEntity_V22: StitchSchemaVersionable {
3131

3232
extension LayerInputDataEntity_V22.LayerInputDataEntity: StitchVersionedCodable {
3333
public init(previousInstance: LayerInputDataEntity_V22.PreviousInstance) {
34-
self.inputPort = .init(previousInstance: previousInstance.inputPort)
35-
self.canvasItem = .init(previousInstance: previousInstance.canvasItem)
34+
self.init(
35+
inputPort: .init(previousInstance: previousInstance.inputPort),
36+
// TODO: fix canvas migration after v22, for v22 it needs to be nil to reset previous position port hack
37+
canvasItem: nil
38+
)
39+
}
40+
41+
// TODO: don't forget about outputs
42+
// MARK: delete this after v22
43+
mutating func createConnectedCanvas(nodes: [NodeEntity_V22.NodeEntity]) {
44+
switch self.inputPort {
45+
case .upstreamConnection(let connection):
46+
guard let upstreamNode = nodes.first(where: { $0.id == connection.nodeId }),
47+
let upstreamCanvas = upstreamNode.getCanvas() else {
48+
#if DEBUG
49+
fatalError()
50+
#endif
51+
52+
// If failure use zero position
53+
self.canvasItem = .init(position: .zero,
54+
zIndex: .zero,
55+
parentGroupNodeId: nil)
56+
return
57+
}
58+
59+
var layerInputCanvas = upstreamCanvas
60+
layerInputCanvas.zIndex += 1
61+
62+
// Create staggered location
63+
layerInputCanvas.position = CGPoint(x: upstreamCanvas.position.x + 450,
64+
y: upstreamCanvas.position.y)
65+
66+
// Change parent group if upstream connected node is output splitter
67+
switch upstreamNode.nodeTypeEntity {
68+
case .patch(let patchNode):
69+
if patchNode.splitterNode?.type == .output {
70+
guard let groupNodeId = upstreamCanvas.parentGroupNodeId,
71+
let groupNode = nodes.first(where: { $0.id == groupNodeId }),
72+
let groupCanvas = groupNode.getCanvas() else {
73+
#if DEBUG
74+
fatalError()
75+
#endif
76+
self.canvasItem = layerInputCanvas
77+
return
78+
}
79+
80+
layerInputCanvas.parentGroupNodeId = groupCanvas.parentGroupNodeId
81+
layerInputCanvas.position = CGPoint(x: groupCanvas.position.x + 450,
82+
y: groupCanvas.position.y)
83+
}
84+
85+
default:
86+
break
87+
}
88+
89+
self.canvasItem = layerInputCanvas
90+
91+
default:
92+
return
93+
}
3694
}
3795
}

0 commit comments

Comments
 (0)