Index: sky/examples/fn/lib/node.dart |
diff --git a/sky/examples/fn/lib/node.dart b/sky/examples/fn/lib/node.dart |
index 1339e204eacadb4b1d8cce2c1d42bbd7778e2616..54853b3e83278efc6a1a4aac8e60968ba2ce74e9 100644 |
--- a/sky/examples/fn/lib/node.dart |
+++ b/sky/examples/fn/lib/node.dart |
@@ -18,6 +18,10 @@ abstract class Node { |
String _key = null; |
sky.Node _root = null; |
+ // TODO(abarth): Both Elements and Components have |events| but |Text| |
+ // doesn't. Should we add a common base class to contain |events|? |
+ final EventMap events = new EventMap(); |
+ |
Node({ Object key }) { |
_key = key == null ? "$runtimeType" : "$runtimeType-$key"; |
} |
@@ -65,19 +69,6 @@ abstract class Element extends Node { |
String inlineStyle; |
- sky.EventListener onClick; |
- sky.EventListener onFlingCancel; |
- sky.EventListener onFlingStart; |
- sky.EventListener onGestureTap; |
- sky.EventListener onPointerCancel; |
- sky.EventListener onPointerDown; |
- sky.EventListener onPointerMove; |
- sky.EventListener onPointerUp; |
- sky.EventListener onScrollEnd; |
- sky.EventListener onScrollStart; |
- sky.EventListener onScrollUpdate; |
- sky.EventListener onWheel; |
- |
List<Node> _children = null; |
String _className = ''; |
@@ -86,21 +77,7 @@ abstract class Element extends Node { |
List<Node> children, |
Style style, |
- this.inlineStyle, |
- |
- // Events |
- this.onClick, |
- this.onFlingCancel, |
- this.onFlingStart, |
- this.onGestureTap, |
- this.onPointerCancel, |
- this.onPointerDown, |
- this.onPointerMove, |
- this.onPointerUp, |
- this.onScrollEnd, |
- this.onScrollStart, |
- this.onScrollUpdate, |
- this.onWheel |
+ this.inlineStyle |
}) : super(key:key) { |
_className = style == null ? '': style._className; |
@@ -135,34 +112,48 @@ abstract class Element extends Node { |
} |
} |
- void _syncEvent(String eventName, sky.EventListener listener, |
- sky.EventListener oldListener) { |
- sky.Element root = _root as sky.Element; |
- if (listener == oldListener) |
- return; |
+ void _syncEvents([Element old]) { |
+ List<EventHandler> newHandlers = events._handlers; |
+ int newStartIndex = 0; |
+ int newEndIndex = newHandlers.length; |
+ |
+ List<EventHandler> oldHandlers = old.events._handlers; |
+ int oldStartIndex = 0; |
+ int oldEndIndex = oldHandlers.length; |
+ |
+ // Skip over leading handlers that match. |
+ while (newStartIndex < newEndIndex && oldStartIndex < oldEndIndex) { |
+ EventHandler newHander = newHandlers[newStartIndex]; |
+ EventHandler oldHandler = oldHandlers[oldStartIndex]; |
+ if (newHander.type != oldHandler.type |
+ || newHander.listener != oldHandler.listener) |
+ break; |
+ ++newStartIndex; |
+ ++oldStartIndex; |
+ } |
- if (oldListener != null) { |
- root.removeEventListener(eventName, oldListener); |
+ // Skip over trailing handlers that match. |
+ while (newStartIndex < newEndIndex && oldStartIndex < oldEndIndex) { |
+ EventHandler newHander = newHandlers[newEndIndex - 1]; |
+ EventHandler oldHandler = oldHandlers[oldEndIndex - 1]; |
+ if (newHander.type != oldHandler.type |
+ || newHander.listener != oldHandler.listener) |
+ break; |
+ --newEndIndex; |
+ --oldEndIndex; |
} |
- if (listener != null) { |
- root.addEventListener(eventName, listener); |
+ sky.Element root = _root as sky.Element; |
+ |
+ for (int i = oldStartIndex; i < oldEndIndex; ++i) { |
+ EventHandler oldHandler = oldHandlers[i]; |
+ root.removeEventListener(oldHandler.type, oldHandler.listener); |
} |
- } |
- void _syncEvents([Element old]) { |
- _syncEvent('click', onClick, old.onClick); |
- _syncEvent('gestureflingcancel', onFlingCancel, old.onFlingCancel); |
- _syncEvent('gestureflingstart', onFlingStart, old.onFlingStart); |
- _syncEvent('gesturescrollend', onScrollEnd, old.onScrollEnd); |
- _syncEvent('gesturescrollstart', onScrollStart, old.onScrollStart); |
- _syncEvent('gesturescrollupdate', onScrollUpdate, old.onScrollUpdate); |
- _syncEvent('gesturetap', onGestureTap, old.onGestureTap); |
- _syncEvent('pointercancel', onPointerCancel, old.onPointerCancel); |
- _syncEvent('pointerdown', onPointerDown, old.onPointerDown); |
- _syncEvent('pointermove', onPointerMove, old.onPointerMove); |
- _syncEvent('pointerup', onPointerUp, old.onPointerUp); |
- _syncEvent('wheel', onWheel, old.onWheel); |
+ for (int i = newStartIndex; i < newEndIndex; ++i) { |
+ EventHandler newHander = newHandlers[i]; |
+ root.addEventListener(newHander.type, newHander.listener); |
+ } |
} |
void _syncNode([Element old]) { |
@@ -356,36 +347,12 @@ class Container extends Element { |
Object key, |
List<Node> children, |
Style style, |
- String inlineStyle, |
- sky.EventListener onClick, |
- sky.EventListener onFlingCancel, |
- sky.EventListener onFlingStart, |
- sky.EventListener onGestureTap, |
- sky.EventListener onPointerCancel, |
- sky.EventListener onPointerDown, |
- sky.EventListener onPointerMove, |
- sky.EventListener onPointerUp, |
- sky.EventListener onScrollEnd, |
- sky.EventListener onScrollStart, |
- sky.EventListener onScrollUpdate, |
- sky.EventListener onWheel |
+ String inlineStyle |
}) : super( |
key: key, |
children: children, |
style: style, |
- inlineStyle: inlineStyle, |
- onClick: onClick, |
- onFlingCancel: onFlingCancel, |
- onFlingStart: onFlingStart, |
- onGestureTap: onGestureTap, |
- onPointerCancel: onPointerCancel, |
- onPointerDown: onPointerDown, |
- onPointerMove: onPointerMove, |
- onPointerUp: onPointerUp, |
- onScrollEnd: onScrollEnd, |
- onScrollStart: onScrollStart, |
- onScrollUpdate: onScrollUpdate, |
- onWheel: onWheel |
+ inlineStyle: inlineStyle |
); |
} |
@@ -405,18 +372,6 @@ class Image extends Element { |
List<Node> children, |
Style style, |
String inlineStyle, |
- sky.EventListener onClick, |
- sky.EventListener onFlingCancel, |
- sky.EventListener onFlingStart, |
- sky.EventListener onGestureTap, |
- sky.EventListener onPointerCancel, |
- sky.EventListener onPointerDown, |
- sky.EventListener onPointerMove, |
- sky.EventListener onPointerUp, |
- sky.EventListener onScrollEnd, |
- sky.EventListener onScrollStart, |
- sky.EventListener onScrollUpdate, |
- sky.EventListener onWheel, |
this.width, |
this.height, |
this.src |
@@ -424,19 +379,7 @@ class Image extends Element { |
key: key, |
children: children, |
style: style, |
- inlineStyle: inlineStyle, |
- onClick: onClick, |
- onFlingCancel: onFlingCancel, |
- onFlingStart: onFlingStart, |
- onGestureTap: onGestureTap, |
- onPointerCancel: onPointerCancel, |
- onPointerDown: onPointerDown, |
- onPointerMove: onPointerMove, |
- onPointerUp: onPointerUp, |
- onScrollEnd: onScrollEnd, |
- onScrollStart: onScrollStart, |
- onScrollUpdate: onScrollUpdate, |
- onWheel: onWheel |
+ inlineStyle: inlineStyle |
); |
void _syncNode([Element old]) { |
@@ -470,18 +413,6 @@ class Anchor extends Element { |
List<Node> children, |
Style style, |
String inlineStyle, |
- sky.EventListener onClick, |
- sky.EventListener onFlingCancel, |
- sky.EventListener onFlingStart, |
- sky.EventListener onGestureTap, |
- sky.EventListener onPointerCancel, |
- sky.EventListener onPointerDown, |
- sky.EventListener onPointerMove, |
- sky.EventListener onPointerUp, |
- sky.EventListener onScrollEnd, |
- sky.EventListener onScrollStart, |
- sky.EventListener onScrollUpdate, |
- sky.EventListener onWheel, |
this.width, |
this.height, |
this.href |
@@ -489,19 +420,7 @@ class Anchor extends Element { |
key: key, |
children: children, |
style: style, |
- inlineStyle: inlineStyle, |
- onClick: onClick, |
- onFlingCancel: onFlingCancel, |
- onFlingStart: onFlingStart, |
- onGestureTap: onGestureTap, |
- onPointerCancel: onPointerCancel, |
- onPointerDown: onPointerDown, |
- onPointerMove: onPointerMove, |
- onPointerUp: onPointerUp, |
- onScrollEnd: onScrollEnd, |
- onScrollStart: onScrollStart, |
- onScrollUpdate: onScrollUpdate, |
- onWheel: onWheel |
+ inlineStyle: inlineStyle |
); |
void _syncNode([Element old]) { |