blob: 89b5fed7684ec624275101d751acaad4dfcd4cfc [file] [log] [blame]
// 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 'rendering/render_box.dart';
import 'rendering/render_node.dart';
import 'scheduler.dart' as scheduler;
class AppView {
AppView(RenderBox root) {
sky.view.setEventCallback(_handleEvent);
scheduler.init();
scheduler.addPersistentFrameCallback(_beginFrame);
_renderView = new RenderView(child: root);
_renderView.attach();
_renderView.layout(new ViewConstraints(width: sky.view.width,
height: sky.view.height));
scheduler.ensureVisualUpdate();
}
RenderView _renderView;
Map<int, HitTestResult> _hitTestResultForPointer = new Map<int, HitTestResult>();
RenderBox get root => _renderView.child;
void set root(RenderBox value) {
_renderView.child = value;
}
void _beginFrame(double timeStamp) {
RenderNode.flushLayout();
_renderView.paintFrame();
}
void _handleEvent(sky.Event event) {
if (event is sky.PointerEvent)
_handlePointerEvent(event);
}
void _handlePointerEvent(sky.PointerEvent event) {
HitTestResult result;
switch(event.type) {
case 'pointerdown':
result = new HitTestResult();
_renderView.hitTest(result, position: new sky.Point(event.x, event.y));
_hitTestResultForPointer[event.pointer] = result;
break;
case 'pointerup':
case 'pointercancel':
result = _hitTestResultForPointer[event.pointer];
_hitTestResultForPointer.remove(event.pointer);
break;
case 'pointermove':
result = _hitTestResultForPointer[event.pointer];
// In the case of mouse hover we won't already have a cached down.
if (result == null) {
result = new HitTestResult();
_renderView.hitTest(result, position: new sky.Point(event.x, event.y));
}
break;
}
dispatchPointerEvent(event, result);
}
void dispatchPointerEvent(sky.PointerEvent event, HitTestResult result) {
assert(result != null);
for (RenderNode node in result.path.reversed)
node.handlePointer(event);
}
}