import 'package:flutter/material.dart'; import 'base.dart'; import 'string_gen.dart'; import 'widget_config.dart'; typedef AcceptWidgetCallback = void Function( BuildContext context, dynamic data); Widget widgetAccept({ Widget child, @required WidgetContext scope, @required AcceptWidgetCallback onAccept, Size size, @required String id, bool sizeOnlyDragging, List reject, List accept, Widget fallback, }) { if (child == null && !scope.isDragging) { return fallback; } return _WidgetAccept( id: id, scope: scope, child: child, onAccept: onAccept, size: size, sizeOnlyDragging: sizeOnlyDragging, reject: reject, accept: accept, ); } class _WidgetAccept extends StatefulWidget { const _WidgetAccept({ Key key, @required this.scope, @required this.id, @required this.onAccept, this.child, this.size, this.sizeOnlyDragging = false, this.accept, this.reject, }) : super(key: key); final List reject, accept; final Widget child; final String id; final AcceptWidgetCallback onAccept; final WidgetContext scope; final Size size; final bool sizeOnlyDragging; @override __WidgetAcceptState createState() => __WidgetAcceptState(); } class __WidgetAcceptState extends State<_WidgetAccept> { bool _accepting = false; @override void didUpdateWidget(_WidgetAccept oldWidget) { if (widget.id != oldWidget.id) { if (mounted) setState(() {}); } if (widget.scope != oldWidget.scope) { if (mounted) setState(() {}); } super.didUpdateWidget(oldWidget); } @override Widget build(BuildContext context) { return widget.child; if (!widget.scope.isDragging) { return SizedBox.fromSize( size: widget.sizeOnlyDragging ? null : widget.size, child: Container(), ); } return SizedBox( height: widget.size.height, width: widget.size.width, child: DragTarget>( onAcceptWithDetails: (val) { if (mounted) { setState(() { _accepting = false; }); } final _data = val; _data['id'] = StringGen.id; if (_data['name'] == 'Text') { _data['params']['style']['id'] = StringGen.id; } if (_data['name'] == 'Icon') { _data['params']['0']['id'] = StringGen.id; } widget.onAccept(context, _data); }, onLeave: (val) { if (mounted) { setState(() { _accepting = false; }); } }, onWillAcceptWithDetails: (val) { if (mounted) { setState(() { _accepting = true; }); } return _accepting; }, builder: (context, accepted, rejected) { return Center( child: Container( width: widget.size.width, height: widget.size.height, child: Placeholder( color: !_accepting ? Colors.grey : Theme.of(context).colorScheme.secondary, ), ), ); }, ), ); } } Map modifyAccept(Map val, {double width, double height}) { final _data = val; _data['id'] = StringGen.id; switch (_data['name']) { case 'Container': _data['params']['height'] = height; _data['params']['width'] = width; break; default: } return _data; }