Commit 2994e47c authored by Adam Barth's avatar Adam Barth

Merge pull request #899 from abarth/pointer_router

Add PointerRouter
parents e30b436d 45f2c589
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:sky' as sky;
import 'package:sky/base/hit_test.dart';
typedef void _Route(sky.PointerEvent event);
class PointerRouter extends HitTestTarget {
final Map<int, List<_Route>> _routeMap = new Map<int, List<_Route>>();
void addRoute(int pointer, _Route route) {
List<_Route> routes = _routeMap.putIfAbsent(pointer, () => new List<_Route>());
assert(!routes.contains(route));
routes.add(route);
}
void removeRoute(int pointer, _Route route) {
assert(_routeMap.containsKey(pointer));
List<_Route> routes = _routeMap[pointer];
assert(routes.contains(route));
routes.remove(route);
if (routes.isEmpty)
_routeMap.remove(pointer);
}
EventDisposition handleEvent(sky.Event e, HitTestEntry entry) {
if (e is! sky.PointerEvent)
return EventDisposition.ignored;
sky.PointerEvent event = e;
List<_Route> routes = _routeMap[event.pointer];
if (routes == null)
return EventDisposition.ignored;
for (_Route route in new List<_Route>.from(routes))
route(event);
return EventDisposition.processed;
}
}
......@@ -4,6 +4,7 @@
import 'dart:sky' as sky;
import 'package:sky/base/pointer_router.dart';
import 'package:sky/base/hit_test.dart';
import 'package:sky/base/scheduler.dart' as scheduler;
import 'package:sky/rendering/box.dart';
......@@ -92,6 +93,8 @@ class SkyBinding {
}
}
final PointerRouter pointerRouter = new PointerRouter();
Map<int, PointerState> _stateForPointer = new Map<int, PointerState>();
PointerState _createStateForPointer(sky.PointerEvent event, Point position) {
......@@ -127,6 +130,7 @@ class SkyBinding {
HitTestResult hitTest(Point position) {
HitTestResult result = new HitTestResult();
result.add(new HitTestEntry(pointerRouter));
_renderView.hitTest(result, position: position);
return result;
}
......
......@@ -5,6 +5,7 @@
import 'dart:collection';
import 'package:sky/base/hit_test.dart';
import 'package:sky/rendering/object.dart';
import 'package:sky/rendering/sky_binding.dart';
import 'package:sky/widgets/basic.dart';
import 'package:sky/widgets/framework.dart';
......@@ -80,6 +81,8 @@ class DragController {
DragTarget _getDragTarget(List<HitTestEntry> path) {
for (HitTestEntry entry in path.reversed) {
if (entry.target is! RenderObject)
continue;
for (Widget widget in RenderObjectWrapper.getWidgetsForRenderObject(entry.target)) {
if (widget is DragTarget)
return widget;
......
......@@ -1282,6 +1282,8 @@ class WidgetSkyBinding extends SkyBinding {
if (disposition == EventDisposition.consumed)
return EventDisposition.consumed;
for (HitTestEntry entry in result.path.reversed) {
if (entry.target is! RenderObject)
continue;
for (Widget target in RenderObjectWrapper.getWidgetsForRenderObject(entry.target)) {
if (target is Listener) {
EventDisposition targetDisposition = target._handleEvent(event);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment