Skip to content

Commit ce59bfd

Browse files
committed
Merge pull request #47 from joshaber/parent
Support view-less Elements
2 parents e8b0f45 + 4da9de5 commit ce59bfd

18 files changed

+190
-155
lines changed

Few-Mac/Mac.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ internal func markNeedsDisplay(view: ViewType) {
2121
view.needsDisplay = true
2222
}
2323

24-
internal func configureViewToAutoresize(view: ViewType) {
25-
view.autoresizingMask = .ViewWidthSizable | .ViewHeightSizable
24+
internal func configureViewToAutoresize(view: ViewType?) {
25+
view?.autoresizingMask = .ViewWidthSizable | .ViewHeightSizable
2626
}

Few-Mac/QuickLook.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Foundation
1010

1111
extension Element {
1212
public func debugQuickLookObject() -> AnyObject? {
13-
let realizedSelf = realize()
13+
let realizedSelf = realize(nil)
1414
return realizedSelf.view
1515
}
1616

Few-Mac/ScrollView.swift

+11-5
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ private class FewScrollView: NSView {
4848
}
4949
}
5050

51+
private class RealizedScrollViewElement: RealizedElement {
52+
private override func addRealizedViewForChild(child: RealizedElement) {
53+
let scrollVew = view as! FewScrollView
54+
scrollVew.scrollView.documentView = child.view
55+
}
56+
}
57+
5158
private class ScrollViewElement: Element {
5259
private let didScroll: CGRect -> ()
5360

@@ -64,13 +71,12 @@ private class ScrollViewElement: Element {
6471
return view
6572
}
6673

67-
private override func addRealizedChildView(childView: ViewType, selfView: ViewType) {
68-
let scrollVew = selfView as! FewScrollView
69-
scrollVew.scrollView.documentView = childView
74+
private override func createRealizedElement(view: ViewType?, parent: RealizedElement?) -> RealizedElement {
75+
return RealizedScrollViewElement(element: self, view: view, parent: parent)
7076
}
7177

72-
private override func realize() -> RealizedElement {
73-
let realizedElement = super.realize()
78+
private override func realize(parent: RealizedElement?) -> RealizedElement {
79+
let realizedElement = super.realize(parent)
7480

7581
let scrollView = realizedElement.view as! FewScrollView
7682
let documentView = scrollView.scrollView.documentView as! NSView

Few-Mac/TableView.swift

+5-12
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,14 @@ private class FewListCell: NSTableCellView {
2121
if element.canDiff(realizedElement.element) {
2222
element.applyDiff(realizedElement.element, realizedSelf: realizedElement)
2323
} else {
24-
realizedElement.element.derealize()
25-
realizedElement.view.removeFromSuperview()
24+
realizedElement.remove()
2625

27-
let newRealizedElement = element.realize()
28-
newRealizedElement.view.autoresizingMask = .ViewWidthSizable | .ViewHeightSizable
29-
newRealizedElement.view.frame = bounds
30-
addSubview(newRealizedElement.view)
26+
let parent = RealizedElement(element: Element(), view: self, parent: nil)
27+
self.realizedElement = element.realize(parent)
3128
}
3229
} else {
33-
let newRealizedElement = element.realize()
34-
newRealizedElement.view.autoresizingMask = .ViewWidthSizable | .ViewHeightSizable
35-
newRealizedElement.view.frame = bounds
36-
addSubview(newRealizedElement.view)
37-
38-
realizedElement = newRealizedElement
30+
let parent = RealizedElement(element: Element(), view: self, parent: nil)
31+
realizedElement = element.realize(parent)
3932
}
4033
}
4134

Few-iOS/ScrollView.swift

+14-8
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ private class FewScrollView: UIScrollView, UIScrollViewDelegate {
2929
}
3030
}
3131

32+
private class RealizedScrollViewElement: RealizedElement {
33+
private override func addRealizedViewForChild(child: RealizedElement) {
34+
let scrollView = view as! FewScrollView
35+
scrollView.subviews.first?.removeFromSuperview()
36+
scrollView.addSubview <^> child.view
37+
}
38+
}
39+
3240
private class ScrollViewElement: Element {
3341
private let didScroll: CGRect -> ()
3442

@@ -41,15 +49,13 @@ private class ScrollViewElement: Element {
4149
private override func createView() -> ViewType {
4250
return FewScrollView(frame: frame, didScroll: didScroll)
4351
}
52+
53+
private override func createRealizedElement(view: ViewType?, parent: RealizedElement?) -> RealizedElement {
54+
return RealizedScrollViewElement(element: self, view: view, parent: parent)
55+
}
4456

45-
private override func addRealizedChildView(childView: ViewType, selfView: ViewType) {
46-
let scrollView = selfView as! FewScrollView
47-
scrollView.subviews.first?.removeFromSuperview()
48-
scrollView.addSubview(childView)
49-
}
50-
51-
private override func realize() -> RealizedElement {
52-
let realizedElement = super.realize()
57+
private override func realize(parent: RealizedElement?) -> RealizedElement {
58+
let realizedElement = super.realize(parent)
5359

5460
let scrollView = realizedElement.view as! FewScrollView
5561
if let element = children.first {

Few-iOS/TableView.swift

+6-11
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,14 @@ private class FewListCell: UITableViewCell {
2020
if element.canDiff(realizedElement.element) {
2121
element.applyDiff(realizedElement.element, realizedSelf: realizedElement)
2222
} else {
23-
realizedElement.element.derealize()
24-
realizedElement.view.removeFromSuperview()
25-
26-
let newRealizedElement = element.realize()
27-
newRealizedElement.view.frame = bounds
28-
addSubview(newRealizedElement.view)
23+
realizedElement.remove()
24+
25+
let parent = RealizedElement(element: Element(), view: self, parent: nil)
26+
self.realizedElement = element.realize(parent)
2927
}
3028
} else {
31-
let newRealizedElement = element.realize()
32-
newRealizedElement.view.frame = bounds
33-
addSubview(newRealizedElement.view)
34-
35-
realizedElement = newRealizedElement
29+
let parent = RealizedElement(element: Element(), view: self, parent: nil)
30+
realizedElement = element.realize(parent)
3631
}
3732
}
3833
}

Few-iOS/iOS.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ internal func compareAndSetAlpha(view: UIView, alpha: CGFloat) {
1717
}
1818
}
1919

20-
internal func configureViewToAutoresize(view: ViewType) {
21-
view.autoresizingMask = .FlexibleWidth | .FlexibleHeight
20+
internal func configureViewToAutoresize(view: ViewType?) {
21+
view?.autoresizingMask = .FlexibleWidth | .FlexibleHeight
2222
}

FewCore/Component.swift

+17-21
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public class Component<S>: Element {
4040
/// Is the component a root?
4141
private var root = false
4242

43+
private var parent: RealizedElement?
44+
4345
private var frameChangedTrampoline = TargetActionTrampoline()
4446

4547
/// Initializes the component with its initial state. The render function
@@ -80,11 +82,10 @@ public class Component<S>: Element {
8082
}
8183

8284
final private func realizeNewRoot(newRoot: Element) {
83-
let realized = newRoot.realize()
85+
let realized = newRoot.realize(parent)
8486

8587
configureViewToAutoresize(realized.view)
8688

87-
realizedRoot?.view.removeFromSuperview()
8889
realizedRoot = realized
8990
}
9091

@@ -93,7 +94,7 @@ public class Component<S>: Element {
9394
newRoot.frame = frame
9495

9596
let node = newRoot.assembleLayoutNode()
96-
var layout: Layout!
97+
let layout: Layout
9798
if root {
9899
layout = node.layout(maxWidth: frame.size.width)
99100
} else {
@@ -112,13 +113,8 @@ public class Component<S>: Element {
112113
if newRoot.canDiff(rootElement) {
113114
newRoot.applyDiff(rootElement, realizedSelf: realizedRoot)
114115
} else {
115-
let superview = realizedRoot!.view.superview!
116-
rootElement.derealize()
117-
116+
realizedRoot?.remove()
118117
realizeNewRoot(newRoot)
119-
superview.addSubview(realizedRoot!.view)
120-
121-
newRoot.elementDidRealize(realizedRoot!)
122118
}
123119

124120
componentDidRender()
@@ -169,14 +165,12 @@ public class Component<S>: Element {
169165
public func addToView(hostView: ViewType) {
170166
root = true
171167
frame = hostView.bounds
172-
performInitialRenderIfNeeded()
173-
realizeRootIfNeeded()
174-
hostView.addSubview(realizedRoot!.view)
175-
rootElement?.elementDidRealize(realizedRoot!)
168+
let parent = RealizedElement(element: self, view: hostView, parent: nil)
169+
realize(parent)
176170

177171
#if os(OSX)
178172
hostView.postsFrameChangedNotifications = true
179-
realizedRoot!.view.autoresizesSubviews = false
173+
realizedRoot!.view?.autoresizesSubviews = false
180174

181175
frameChangedTrampoline.action = { [weak self] in
182176
if let strongSelf = self {
@@ -289,9 +283,9 @@ public class Component<S>: Element {
289283
public override func applyDiff(old: Element, realizedSelf: RealizedElement?) {
290284
super.applyDiff(old, realizedSelf: realizedSelf)
291285

292-
// Use `unsafeBitCast` instead of `as` to avoid a runtime crash.
293-
let oldComponent = unsafeBitCast(old, Component.self)
286+
let oldComponent = old as! Component
294287

288+
parent = oldComponent.parent
295289
root = oldComponent.root
296290
state = oldComponent.state
297291
rootElement = oldComponent.rootElement
@@ -300,20 +294,22 @@ public class Component<S>: Element {
300294
renderNewRoot()
301295
}
302296

303-
public override func realize() -> RealizedElement {
297+
public override func realize(parent: RealizedElement?) -> RealizedElement {
298+
self.parent = parent
299+
304300
performInitialRenderIfNeeded()
305301
realizeRootIfNeeded()
306-
return RealizedElement(element: self, view: realizedRoot!.view)
302+
return super.realize(parent)
307303
}
308304

309305
public override func derealize() {
310306
componentWillDerealize()
311307

312-
rootElement?.derealize()
308+
realizedRoot?.remove()
309+
realizedRoot = nil
313310
rootElement = nil
314311

315-
realizedRoot?.view.removeFromSuperview()
316-
realizedRoot = nil
312+
parent = nil
317313

318314
componentDidDerealize()
319315
}

0 commit comments

Comments
 (0)