OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 import '../fn2.dart'; | 5 import '../fn2.dart'; |
| 6 import '../rendering/flex.dart'; |
6 import 'dart:collection'; | 7 import 'dart:collection'; |
7 import 'dart:sky' as sky; | 8 import 'dart:sky' as sky; |
8 import 'ink_splash.dart'; | 9 // import 'ink_splash.dart'; |
9 import 'scrollable.dart'; | 10 import 'scrollable.dart'; |
10 | 11 |
11 class InkWell extends Component implements ScrollClient { | 12 class InkWell extends Component implements ScrollClient { |
12 static final Style _containmentStyleHack = new Style(''' | 13 // static final Style _containmentStyleHack = new Style(''' |
13 align-items: center; | 14 // align-items: center; |
14 transform: translateX(0);'''); | 15 // transform: translateX(0);'''); |
15 | 16 |
16 LinkedHashSet<SplashController> _splashes; | 17 // LinkedHashSet<SplashController> _splashes; |
17 | 18 |
18 String inlineStyle; | |
19 List<UINode> children; | 19 List<UINode> children; |
20 | 20 |
21 InkWell({ Object key, this.inlineStyle, this.children }) | 21 // InkWell({ Object key, this.inlineStyle, this.children }) |
22 : super(key: key) { | 22 // : super(key: key) { |
23 onDidUnmount(() { | 23 // onDidUnmount(() { |
24 _cancelSplashes(null); | 24 // _cancelSplashes(null); |
25 }); | 25 // }); |
| 26 // } |
| 27 |
| 28 InkWell({ Object key, this.children }) : super(key: key); |
| 29 |
| 30 UINode build() { |
| 31 return new FlexContainer(direction: FlexDirection.Horizontal, children: chil
dren); |
| 32 // List<UINode> childrenIncludingSplashes = []; |
| 33 |
| 34 // if (_splashes != null) { |
| 35 // childrenIncludingSplashes.addAll( |
| 36 // _splashes.map((s) => new InkSplash(s.onStyleChanged))); |
| 37 // } |
| 38 |
| 39 // if (children != null) |
| 40 // childrenIncludingSplashes.addAll(children); |
| 41 |
| 42 // return new EventListenerNode( |
| 43 // new FlexContainer( |
| 44 // direction: FlexDirection.Row, |
| 45 // style: _containmentStyleHack, |
| 46 // inlineStyle: inlineStyle, |
| 47 // children: childrenIncludingSplashes), |
| 48 // onGestureTapDown: _startSplash, |
| 49 // onGestureTap: _confirmSplash |
| 50 // ); |
26 } | 51 } |
27 | 52 |
28 UINode build() { | 53 // void _startSplash(sky.GestureEvent event) { |
29 List<UINode> childrenIncludingSplashes = []; | 54 // setState(() { |
| 55 // if (_splashes == null) |
| 56 // _splashes = new LinkedHashSet<SplashController>(); |
| 57 // var splash; |
| 58 // var root = getRoot(); |
| 59 // splash = new SplashController(root.rect, event.x, event.y, |
| 60 // pointer: event.primaryPointer, |
| 61 // onDone: () { _splashDone(splash); }); |
| 62 // _splashes.add(splash); |
| 63 // UINode node = parent; |
| 64 // while (node != null) { |
| 65 // if (node is Scrollable) |
| 66 // node.registerScrollClient(this); |
| 67 // node = node.parent; |
| 68 // } |
| 69 // }); |
| 70 // } |
30 | 71 |
31 if (_splashes != null) { | 72 // bool ancestorScrolled(Scrollable ancestor) { |
32 childrenIncludingSplashes.addAll( | 73 // _abortSplashes(); |
33 _splashes.map((s) => new InkSplash(s.onStyleChanged))); | 74 // return false; |
34 } | 75 // } |
35 | 76 |
36 if (children != null) | 77 // void handleRemoved() { |
37 childrenIncludingSplashes.addAll(children); | 78 // UINode node = parent; |
| 79 // while (node != null) { |
| 80 // if (node is Scrollable) |
| 81 // node.unregisterScrollClient(this); |
| 82 // node = node.parent; |
| 83 // } |
| 84 // super.handleRemoved(); |
| 85 // } |
38 | 86 |
39 return new EventListenerNode( | 87 // void _confirmSplash(sky.GestureEvent event) { |
40 new FlexContainer( | 88 // if (_splashes == null) |
41 direction: FlexDirection.Row, | 89 // return; |
42 style: _containmentStyleHack, | 90 // _splashes.where((splash) => splash.pointer == event.primaryPointer) |
43 inlineStyle: inlineStyle, | 91 // .forEach((splash) { splash.confirm(); }); |
44 children: childrenIncludingSplashes), | 92 // } |
45 onGestureTapDown: _startSplash, | |
46 onGestureTap: _confirmSplash | |
47 ); | |
48 } | |
49 | 93 |
50 void _startSplash(sky.GestureEvent event) { | 94 // void _abortSplashes() { |
51 setState(() { | 95 // if (_splashes == null) |
52 if (_splashes == null) | 96 // return; |
53 _splashes = new LinkedHashSet<SplashController>(); | 97 // setState(() { |
54 var splash; | 98 // _splashes.forEach((s) { s.abort(); }); |
55 var root = getRoot(); | 99 // }); |
56 splash = new SplashController(root.rect, event.x, event.y, | 100 // } |
57 pointer: event.primaryPointer, | |
58 onDone: () { _splashDone(splash); }); | |
59 _splashes.add(splash); | |
60 UINode node = parent; | |
61 while (node != null) { | |
62 if (node is Scrollable) | |
63 node.registerScrollClient(this); | |
64 node = node.parent; | |
65 } | |
66 }); | |
67 } | |
68 | 101 |
69 bool ancestorScrolled(Scrollable ancestor) { | 102 // void _cancelSplashes(sky.Event event) { |
70 _abortSplashes(); | 103 // if (_splashes == null) |
71 return false; | 104 // return; |
72 } | 105 // setState(() { |
| 106 // var splashes = _splashes; |
| 107 // _splashes = null; |
| 108 // splashes.forEach((s) { s.cancel(); }); |
| 109 // }); |
| 110 // } |
73 | 111 |
74 void handleRemoved() { | 112 // void _splashDone(SplashController splash) { |
75 UINode node = parent; | 113 // if (_splashes == null) |
76 while (node != null) { | 114 // return; |
77 if (node is Scrollable) | 115 // setState(() { |
78 node.unregisterScrollClient(this); | 116 // _splashes.remove(splash); |
79 node = node.parent; | 117 // if (_splashes.length == 0) |
80 } | 118 // _splashes = null; |
81 super.handleRemoved(); | 119 // }); |
82 } | 120 // } |
83 | |
84 void _confirmSplash(sky.GestureEvent event) { | |
85 if (_splashes == null) | |
86 return; | |
87 _splashes.where((splash) => splash.pointer == event.primaryPointer) | |
88 .forEach((splash) { splash.confirm(); }); | |
89 } | |
90 | |
91 void _abortSplashes() { | |
92 if (_splashes == null) | |
93 return; | |
94 setState(() { | |
95 _splashes.forEach((s) { s.abort(); }); | |
96 }); | |
97 } | |
98 | |
99 void _cancelSplashes(sky.Event event) { | |
100 if (_splashes == null) | |
101 return; | |
102 setState(() { | |
103 var splashes = _splashes; | |
104 _splashes = null; | |
105 splashes.forEach((s) { s.cancel(); }); | |
106 }); | |
107 } | |
108 | |
109 void _splashDone(SplashController splash) { | |
110 if (_splashes == null) | |
111 return; | |
112 setState(() { | |
113 _splashes.remove(splash); | |
114 if (_splashes.length == 0) | |
115 _splashes = null; | |
116 }); | |
117 } | |
118 } | 121 } |
OLD | NEW |