blob: 09251fcf5013b41b41d6b9004f46ecd6690b7e1a [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 'package:flutter/material.dart';
import 'package:tiler/tiler.dart';
/// Widget for drag and drop target.
class DropTargetWidget extends StatefulWidget {
/// COnstructor for the widget.
const DropTargetWidget({
@required this.onAccept,
@required this.onWillAccept,
@required this.axis,
@required this.baseSize,
@required this.hoverSize,
});
/// Axis
final Axis axis;
/// On drop accept callback
final DragTargetAccept<TileModel> onAccept;
/// On drop will accept callback
final DragTargetWillAccept<TileModel> onWillAccept;
/// Base size
final double baseSize;
/// Hover size
final double hoverSize;
@override
_DropTargetWidgetState createState() => _DropTargetWidgetState();
}
class _DropTargetWidgetState extends State<DropTargetWidget>
with SingleTickerProviderStateMixin {
@override
Widget build(BuildContext context) {
return DragTarget<TileModel>(
builder: (context, candidateData, rejectedData) {
final hovering = candidateData.isNotEmpty;
final size = hovering ? widget.hoverSize : widget.baseSize;
final color = hovering ? Colors.purple : Colors.transparent;
return AnimatedSize(
duration: Duration(milliseconds: 200),
curve: Curves.ease,
vsync: this,
child: Container(
width: widget.axis == Axis.horizontal ? size : null,
height: widget.axis == Axis.vertical ? size : null,
child: Material(
elevation: 8,
color: color,
),
),
);
},
onWillAccept: widget.onWillAccept,
onAccept: widget.onAccept,
);
}
}