| 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 'dart:sky' as sky; | 5 import 'dart:sky' as sky; |
| 6 | 6 |
| 7 import '../base/scheduler.dart' as scheduler; | 7 import '../base/scheduler.dart' as scheduler; |
| 8 import '../base/hit_test.dart'; | 8 import '../base/hit_test.dart'; |
| 9 import 'box.dart'; | 9 import 'box.dart'; |
| 10 import 'object.dart'; | 10 import 'object.dart'; |
| 11 | 11 |
| 12 int _hammingWeight(int value) { |
| 13 if (value == 0) |
| 14 return 0; |
| 15 int weight = 0; |
| 16 for (int i = 0; i < value.bitLength; ++i) { |
| 17 if (value & (1 << i) != 0) |
| 18 ++weight; |
| 19 } |
| 20 return weight; |
| 21 } |
| 22 |
| 12 class PointerState { | 23 class PointerState { |
| 13 PointerState({ this.result, this.lastPosition }); | 24 PointerState({ this.result, this.lastPosition }); |
| 14 HitTestResult result; | 25 HitTestResult result; |
| 15 Point lastPosition; | 26 Point lastPosition; |
| 16 } | 27 } |
| 17 | 28 |
| 18 typedef void EventListener(sky.Event event); | 29 typedef void EventListener(sky.Event event); |
| 19 | 30 |
| 20 class SkyBinding { | 31 class SkyBinding { |
| 21 | 32 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 Point position = new Point(event.x, event.y); | 108 Point position = new Point(event.x, event.y); |
| 98 | 109 |
| 99 PointerState state; | 110 PointerState state; |
| 100 switch(event.type) { | 111 switch(event.type) { |
| 101 case 'pointerdown': | 112 case 'pointerdown': |
| 102 state = _createStateForPointer(event, position); | 113 state = _createStateForPointer(event, position); |
| 103 break; | 114 break; |
| 104 case 'pointerup': | 115 case 'pointerup': |
| 105 case 'pointercancel': | 116 case 'pointercancel': |
| 106 state = _stateForPointer[event.pointer]; | 117 state = _stateForPointer[event.pointer]; |
| 107 _stateForPointer.remove(event.pointer); | 118 if (_hammingWeight(event.buttons) <= 1) |
| 119 _stateForPointer.remove(event.pointer); |
| 108 break; | 120 break; |
| 109 case 'pointermove': | 121 case 'pointermove': |
| 110 state = _stateForPointer[event.pointer]; | 122 state = _stateForPointer[event.pointer]; |
| 111 // In the case of mouse hover we won't already have a cached down. | 123 // In the case of mouse hover we won't already have a cached down. |
| 112 if (state == null) | 124 if (state == null) |
| 113 state = _createStateForPointer(event, position); | 125 state = _createStateForPointer(event, position); |
| 114 break; | 126 break; |
| 115 } | 127 } |
| 116 event.dx = position.x - state.lastPosition.x; | 128 event.dx = position.x - state.lastPosition.x; |
| 117 event.dy = position.y - state.lastPosition.y; | 129 event.dy = position.y - state.lastPosition.y; |
| 118 state.lastPosition = position; | 130 state.lastPosition = position; |
| 119 | 131 |
| 120 dispatchEvent(event, state.result); | 132 dispatchEvent(event, state.result); |
| 121 } | 133 } |
| 122 | 134 |
| 123 void dispatchEvent(sky.Event event, HitTestResult result) { | 135 void dispatchEvent(sky.Event event, HitTestResult result) { |
| 124 assert(result != null); | 136 assert(result != null); |
| 125 for (HitTestEntry entry in result.path.reversed) | 137 for (HitTestEntry entry in result.path.reversed) |
| 126 entry.target.handleEvent(event, entry); | 138 entry.target.handleEvent(event, entry); |
| 127 } | 139 } |
| 128 | 140 |
| 129 String toString() => 'Render Tree:\n${_renderView}'; | 141 String toString() => 'Render Tree:\n${_renderView}'; |
| 130 | 142 |
| 131 void debugDumpRenderTree() { | 143 void debugDumpRenderTree() { |
| 132 toString().split('\n').forEach(print); | 144 toString().split('\n').forEach(print); |
| 133 } | 145 } |
| 134 | 146 |
| 135 } | 147 } |
| OLD | NEW |