[go: nahoru, domu]

Skip to content

Commit

Permalink
Add HostingController
Browse files Browse the repository at this point in the history
  • Loading branch information
Cosmo committed Nov 1, 2019
1 parent 28a87c0 commit e3be732
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 2 deletions.
9 changes: 9 additions & 0 deletions Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,15 @@
"revision": "350f295221ff9d192d4a4e3db5d8b18b9dbf87f9",
"version": null
}
},
{
"package": "Pixels",
"repositoryURL": "https://github.com/Cosmo/Pixels.git",
"state": {
"branch": "master",
"revision": "b00e384d65906cdcc43a004210ee37f94c2ef0a5",
"version": null
}
}
]
},
Expand Down
5 changes: 3 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@ let package = Package(
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
.package(url: "https://github.com/Cosmo/OpenSwiftUI.git", .branch("master")),
.package(url: "https://github.com/Cosmo/Nodes.git", .branch("master"))
.package(url: "https://github.com/Cosmo/Nodes.git", .branch("master")),
.package(url: "https://github.com/Cosmo/Pixels.git", .branch("master"))
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "SwiftUIEmbedded",
dependencies: ["OpenSwiftUI", "Nodes"]),
dependencies: ["OpenSwiftUI", "Nodes", "Pixels"]),
.testTarget(
name: "SwiftUIEmbeddedTests",
dependencies: ["SwiftUIEmbedded"]),
Expand Down
80 changes: 80 additions & 0 deletions Sources/SwiftUIEmbedded/HostingController.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import OpenSwiftUI
import Pixels
#if canImport(AppKit)
import AppKit
#endif

public class HostingController<Content: View> {
public typealias ColorDepth = UInt32
public typealias ColorDepthProtocol = FixedWidthInteger & UnsignedInteger
var pixelBuffer = Pixels<ColorDepth>(width: 640, height: 640)

public var rootView: Content
public var tree: ViewNode
public init(rootView: Content) {
self.rootView = rootView

self.tree = ViewNode(value: RootDrawable())
(rootView.body as? ViewBuildable)?.buildDebugTree(tree: &tree, parent: tree)
}

public func calculateTreeSizes() {
let displaySize = Size(width: pixelBuffer.canvasWidth, height: pixelBuffer.canvasHeight)
tree.calculateSize(givenWidth: displaySize.width)
tree.value.size = displaySize
}

public func createTree() {
calculateTreeSizes()
print(tree.lineBasedDescription)
}

func drawElement(node: ViewNode) {
if node.value.size.width == Size.zero.width {
return
}

let x = node.ancestors.reduce(0, { $0 + $1.value.origin.x }) + node.value.origin.x
let y = node.ancestors.reduce(0, { $0 + $1.value.origin.y }) + node.value.origin.y

let width = node.value.size.width
let height = node.value.size.height

pixelBuffer.drawBox(x: x,
y: y,
width: width,
height: node.value.size.height,
color: (0x00000000..<0xFFFFFF00).randomElement()!, brushSize: 3)

if let textNode = node.value as? TextDrawable {
pixelBuffer.drawBitmapText(text: textNode.text,
x: x,
y: y,
width: width,
height: height,
alignment: .left,
size: 2)
}

if let _ = node.value as? CircleDrawable {
pixelBuffer.drawCircle(xm: x + (width / 2), ym: y + (width / 2), radius: width / 2)
}

if node.children.count > 0 {
for child in node.children {
drawElement(node: child)
}
}
}

#if canImport(AppKit)
public func createPixelBuffer() -> NSImage? {
calculateTreeSizes()
print(tree.lineBasedDescription)

drawElement(node: tree)

return pixelBuffer.image()
}
#endif
}

0 comments on commit e3be732

Please sign in to comment.