Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Image implementation, bump JSKit to 0.9.0 #155

Merged
merged 11 commits into from
Dec 4, 2020
4 changes: 2 additions & 2 deletions Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
"repositoryURL": "https://github.com/swiftwasm/JavaScriptKit.git",
"state": {
"branch": null,
"revision": "8ba4135d5fd6a734c3771ef3fac66896bbcb0214",
"version": "0.8.0"
"revision": "b7a02434c6e973c08c3fd5069105ef44dd82b891",
"version": "0.9.0"
}
},
{
Expand Down
5 changes: 3 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ let package = Package(
// .package(url: /* package url */, from: "1.0.0"),
.package(
url: "https://github.com/swiftwasm/JavaScriptKit.git",
.upToNextMinor(from: "0.8.0")
.upToNextMinor(from: "0.9.0")
),
.package(url: "https://github.com/MaxDesiatov/Runtime.git", from: "2.1.2"),
.package(url: "https://github.com/TokamakUI/OpenCombine.git", from: "0.12.0-alpha2"),
Expand Down Expand Up @@ -95,7 +95,8 @@ let package = Package(
package: "JavaScriptKit",
condition: .when(platforms: [.wasi])
),
]
],
resources: [.copy("logo-header.png")]
),
.target(
name: "TokamakStaticDemo",
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<img alt="Tokamak logo" src="docs/logo-header.png" width="640px"/>
<img alt="Tokamak logo" src="Sources/TokamakDemo/logo-header.png" width="640px"/>

## SwiftUI-compatible framework for building browser apps with WebAssembly

Expand Down
57 changes: 57 additions & 0 deletions Sources/TokamakCore/Views/Image.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// Copyright 2018-2020 Tokamak contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Created by Jed Fox on 07/01/2020.
//

import Foundation

public struct Image: View {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think to match some of SwiftUI's Image modifiers we'll need to implement the internal storage as an AnyTokenBox. Then once we add support for things like template images we can access the environment to render them.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for highlighting this, I've created #312 to track it.

let label: Text?
let name: String
let bundle: Bundle?

public init(_ name: String, bundle: Bundle? = nil) {
label = Text(name)
self.name = name
self.bundle = bundle
}

public init(_ name: String, bundle: Bundle? = nil, label: Text) {
self.label = label
self.name = name
self.bundle = bundle
}

public init(decorative name: String, bundle: Bundle? = nil) {
label = nil
self.name = name
self.bundle = bundle
}

public var body: Never {
neverBody("Image")
}
}

/// This is a helper class that works around absence of "package private" access control in Swift
public struct _ImageProxy {
public let subject: Image

public init(_ subject: Image) { self.subject = subject }

public var labelString: String? { subject.label?.storage.rawText }
public var name: String { subject.name }
public var path: String? { subject.bundle?.path(forResource: subject.name, ofType: nil) }
}
1 change: 1 addition & 0 deletions Sources/TokamakDOM/Core.swift
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ public typealias GeometryReader = TokamakCore.GeometryReader
public typealias GridItem = TokamakCore.GridItem
public typealias Group = TokamakCore.Group
public typealias HStack = TokamakCore.HStack
public typealias Image = TokamakCore.Image
public typealias LazyHGrid = TokamakCore.LazyHGrid
public typealias LazyVGrid = TokamakCore.LazyVGrid
public typealias List = TokamakCore.List
Expand Down
2 changes: 1 addition & 1 deletion Sources/TokamakDOM/DOMRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ final class DOMRenderer: Renderer {
) {
defer { completion() }

guard let html = mapAnyView(host.view, transform: { (html: AnyHTML) in html })
guard mapAnyView(host.view, transform: { (html: AnyHTML) in html }) != nil
else { return }

_ = parent.ref.removeChild!(target.ref)
Expand Down
3 changes: 3 additions & 0 deletions Sources/TokamakDemo/TokamakDemo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ struct TokamakDemoView: View {
NavigationView { () -> AnyView in
let list = title(
List {
Image("logo-header.png", label: Text("Tokamak Demo"))
.frame(height: 50)
.padding(.bottom, 20)
Section(header: Text("Buttons")) {
NavItem(
"Counter",
Expand Down
File renamed without changes
40 changes: 40 additions & 0 deletions Sources/TokamakStaticHTML/Views/Images/Image.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright 2020 Tokamak contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Created by Max Desiatov on 11/04/2020.
//

import TokamakCore

public typealias Image = TokamakCore.Image

extension Image: ViewDeferredToRenderer {
public var deferredBody: AnyView {
AnyView(_HTMLImage(proxy: _ImageProxy(self)))
}
}

struct _HTMLImage: View {
let proxy: _ImageProxy
public var body: some View {
var attributes: [HTMLAttribute: String] = [
"src": proxy.path ?? proxy.name,
"style": "max-width: 100%; max-height: 100%",
]
if let label = proxy.labelString {
attributes["alt"] = label
}
return AnyView(HTML("img", attributes))
}
}
2 changes: 1 addition & 1 deletion docs/progress.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Table columns:

| | | |
| --- | ---------------------------------------------------------------- | :-: |
| | [Image](https://developer.apple.com/documentation/swiftui/image) | |
| 🚧 | [Image](https://developer.apple.com/documentation/swiftui/image) | |

### Buttons

Expand Down