149 lines
3.5 KiB
Dart
149 lines
3.5 KiB
Dart
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<DynamicWidget> reject,
|
|
List<DynamicWidget> 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<DynamicWidget> 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<Map<String, dynamic>>(
|
|
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<String, dynamic> modifyAccept(Map<String, dynamic> 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;
|
|
}
|