blob: 6d23330c9dc82f78a3e07f7ed5dc8e832d8aaf37 [file] [log] [blame]
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;
}
}