blob: 973b8950f6c32b9dfb077bf1fc3014a3283ad073 [file] [log] [blame]
// Copyright 2015 The Vanadium 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/widgets.dart' as widgets;
import 'package:vector_math/vector_math.dart' as vector_math;
class Draggable<T extends widgets.Widget> extends widgets.StatefulComponent {
widgets.DragController dragController;
widgets.Offset displacement = widgets.Offset.zero;
T child;
Draggable(this.child);
void syncConstructorArguments(Draggable other) {
child = other.child;
}
widgets.Widget build() {
return new widgets.Listener(
onPointerDown: _startDrag,
onPointerMove: _updateDrag,
onPointerCancel: _cancelDrag,
onPointerUp: _drop,
child: new widgets.Transform(
transform: new vector_math.Matrix4.identity()
.translate(0.0, 0.0), // displacement.dx, displacement.dy),
child: new widgets.Opacity(
child: child,
opacity: displacement != widgets.Offset.zero ? 0.5 : 1.0)));
}
widgets.EventDisposition _startDrag(sky.PointerEvent event) {
print("Drag Start");
setState(() {
dragController = new widgets.DragController(this.child);
dragController.update(new widgets.Point(event.x, event.y));
displacement = widgets.Offset.zero;
});
return widgets.EventDisposition.consumed;
}
widgets.EventDisposition _updateDrag(sky.PointerEvent event) {
setState(() {
dragController.update(new widgets.Point(event.x, event.y));
displacement += new widgets.Offset(event.dx, event.dy);
});
return widgets.EventDisposition.consumed;
}
widgets.EventDisposition _cancelDrag(sky.PointerEvent event) {
print("Drag Cancel");
setState(() {
dragController.cancel();
dragController = null;
});
return widgets.EventDisposition.consumed;
}
widgets.EventDisposition _drop(sky.PointerEvent event) {
print("Drag Drop");
setState(() {
dragController.update(new widgets.Point(event.x, event.y));
dragController.drop();
dragController = null;
displacement = widgets.Offset.zero;
});
return widgets.EventDisposition.consumed;
}
}