Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Unified Diff: sky/examples/fn/lib/node.dart

Issue 975863003: Don't hardcode the list of events types in fn (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: More careful event syncing Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/examples/fn/lib/fn.dart ('k') | sky/examples/fn/widgets/button.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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]) {
« no previous file with comments | « sky/examples/fn/lib/fn.dart ('k') | sky/examples/fn/widgets/button.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698