adding packages
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
import 'util.dart';
|
||||
|
||||
class CommaList<T> {
|
||||
CommaList(this.templates) : assert(templates != null);
|
||||
|
||||
final List<T> templates;
|
||||
|
||||
@override
|
||||
String toString() =>
|
||||
templates.map((t) => t.toString()).where((s) => s.isNotEmpty).join(', ');
|
||||
}
|
||||
|
||||
class SurroundedCommaList<T> {
|
||||
SurroundedCommaList(this.prefix, this.suffix, this.templates)
|
||||
: assert(prefix != null),
|
||||
assert(suffix != null),
|
||||
assert(templates != null);
|
||||
|
||||
final String prefix;
|
||||
final String suffix;
|
||||
final List<T> templates;
|
||||
|
||||
@override
|
||||
String toString() => surroundNonEmpty(prefix, suffix, CommaList(templates));
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
class ParamTemplate {
|
||||
String name;
|
||||
String type;
|
||||
String defaultValue;
|
||||
bool hasRequiredAnnotation = false;
|
||||
|
||||
String get asArgument => name;
|
||||
|
||||
NamedArgTemplate get asNamedArgument => NamedArgTemplate()..name = name;
|
||||
|
||||
String get metadata => hasRequiredAnnotation ? '@required ' : '';
|
||||
|
||||
@override
|
||||
String toString() => defaultValue == null
|
||||
? '$metadata$type $name'
|
||||
: '$type $name = $defaultValue';
|
||||
}
|
||||
|
||||
class TypeParamTemplate {
|
||||
String name;
|
||||
String bound;
|
||||
|
||||
String get asArgument => name;
|
||||
|
||||
@override
|
||||
String toString() => bound == null ? name : '$name extends $bound';
|
||||
}
|
||||
|
||||
class NamedArgTemplate {
|
||||
String name;
|
||||
|
||||
@override
|
||||
String toString() => '$name: $name';
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
import 'impl.dart';
|
||||
|
||||
class BaseOptionTemplate extends SettingsImpl {
|
||||
String defaultValue;
|
||||
bool isPrivate;
|
||||
bool tryParse;
|
||||
|
||||
@override
|
||||
String name;
|
||||
|
||||
@override
|
||||
String key;
|
||||
|
||||
@override
|
||||
String propertyType;
|
||||
|
||||
@override
|
||||
String access() {
|
||||
final sb = StringBuffer();
|
||||
sb.writeln('$propertyType get ${name}Val {');
|
||||
sb.write("if (params[${name}Key] != null) ");
|
||||
sb.writeln('{');
|
||||
sb.write('return ');
|
||||
if (tryParse) {
|
||||
sb.write("$propertyType.tryParse(params[${name}Key].toString())");
|
||||
if (defaultValue != null) {
|
||||
sb.write(' ?? $defaultValue');
|
||||
}
|
||||
} else {
|
||||
sb.write('params[${name}Key] as $propertyType');
|
||||
}
|
||||
sb.writeln(';');
|
||||
sb.writeln('}');
|
||||
if (defaultValue != null) {
|
||||
if (propertyType == 'String') {
|
||||
sb.writeln("return '$defaultValue';");
|
||||
} else {
|
||||
sb.writeln("return $defaultValue;");
|
||||
}
|
||||
} else {
|
||||
sb.writeln("return null;");
|
||||
}
|
||||
sb.writeln('}');
|
||||
sb.writeln('set ${name}Val($propertyType val) {');
|
||||
sb.writeln('params[${name}Key] = val;');
|
||||
sb.writeln('widgetContext.onUpdate(id, widgetData);');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
import 'impl.dart';
|
||||
|
||||
class ColorOptionTemplate extends SettingsImpl {
|
||||
int defaultValue;
|
||||
bool isPrivate;
|
||||
|
||||
@override
|
||||
String name;
|
||||
|
||||
@override
|
||||
String key;
|
||||
|
||||
@override
|
||||
String propertyType;
|
||||
|
||||
@override
|
||||
String access() {
|
||||
final sb = StringBuffer();
|
||||
// Getter
|
||||
sb.writeln('$propertyType get ${name}Val {');
|
||||
sb.write("if (params[${name}Key] != null) ");
|
||||
sb.writeln('{');
|
||||
sb.writeln('int _value = $defaultValue;');
|
||||
sb.write("""
|
||||
String description = params[${name}Key].toString();
|
||||
if (description.startsWith('#')) {
|
||||
description = description.replaceAll('#$propertyType(', '').replaceAll(')', '');
|
||||
_value = int.tryParse(description);
|
||||
} else if (params[${name}Key] is Map) {
|
||||
if (params[${name}Key]['name'] == '$propertyType'
|
||||
&& params[${name}Key]['params'] != null
|
||||
&& params[${name}Key]['params']['0'] != null) {
|
||||
_value = int.tryParse(params[${name}Key]['params']['0']);
|
||||
}
|
||||
}
|
||||
""");
|
||||
sb.writeln('if (_value != null) {');
|
||||
sb.write('return $propertyType(_value);');
|
||||
sb.writeln('}');
|
||||
sb.writeln('}');
|
||||
if (defaultValue != null) {
|
||||
sb.writeln("return $propertyType($defaultValue);");
|
||||
} else {
|
||||
sb.writeln("return null;");
|
||||
}
|
||||
sb.writeln('}');
|
||||
// Setter
|
||||
sb.writeln('set ${name}Val($propertyType val) {');
|
||||
sb.write('params[${name}Key] = "');
|
||||
sb.write('#$propertyType(\${val.value})');
|
||||
sb.writeln('";');
|
||||
sb.writeln('widgetContext.onUpdate(id, widgetData);');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
import 'impl.dart';
|
||||
|
||||
class EdgeInsetsOptionTemplate extends SettingsImpl {
|
||||
bool isPrivate;
|
||||
double defaultValue;
|
||||
|
||||
@override
|
||||
String name;
|
||||
|
||||
@override
|
||||
String key;
|
||||
|
||||
@override
|
||||
String propertyType;
|
||||
|
||||
@override
|
||||
String access() {
|
||||
final sb = StringBuffer();
|
||||
sb.writeln('$propertyType get ${name}Val {');
|
||||
sb.writeln("""
|
||||
EdgeInsets _spacing = EdgeInsets.all(0.0);
|
||||
if (params[${name}Key] != null) {
|
||||
double top = 0;
|
||||
double bottom = 0;
|
||||
double left = 0;
|
||||
double right = 0;
|
||||
Map<String, dynamic> _spacingParams = params[${name}Key]['params'];
|
||||
top = _spacingParams['top'] ?? 0;
|
||||
bottom = _spacingParams['bottom'] ?? 0;
|
||||
left = _spacingParams['left'] ?? 0;
|
||||
right = _spacingParams['right'] ?? 0;
|
||||
_spacing = EdgeInsets.fromLTRB(left, top, right, bottom);
|
||||
}
|
||||
return _spacing;
|
||||
""");
|
||||
sb.writeln('}');
|
||||
sb.writeln('set ${name}Val($propertyType val) {');
|
||||
sb.write('''
|
||||
params[${name}Key] = {
|
||||
"name" : "EdgeInsets.only",
|
||||
"id" : "${name}KeyEdgeInsets",
|
||||
"params" : {
|
||||
"top" : val.top,
|
||||
"bottom" : val.bottom,
|
||||
"left" : val.left,
|
||||
"right" : val.right,
|
||||
}
|
||||
};
|
||||
''');
|
||||
sb.writeln('widgetContext.onUpdate(id, widgetData);');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
import 'impl.dart';
|
||||
|
||||
class EnumOptionTemplate extends SettingsImpl {
|
||||
String defaultValue;
|
||||
bool isPrivate;
|
||||
List values;
|
||||
|
||||
@override
|
||||
String name;
|
||||
|
||||
@override
|
||||
String key;
|
||||
|
||||
@override
|
||||
String propertyType;
|
||||
|
||||
@override
|
||||
String access() {
|
||||
final sb = StringBuffer();
|
||||
sb.writeln("List<$propertyType> get ${name}Values => [");
|
||||
for (final item in values) {
|
||||
sb.writeln("${_getEnumValueFromString(item)},");
|
||||
}
|
||||
sb.writeln("];");
|
||||
sb.writeln('');
|
||||
sb.writeln('$propertyType get ${name}Val {');
|
||||
sb.write("if (params[${name}Key] != null) ");
|
||||
sb.writeln('{');
|
||||
sb.write('final _value = ');
|
||||
sb.writeln("params[${name}Key].toString().replaceAll('#', '');");
|
||||
final _fallback =
|
||||
defaultValue == null ? null : _getEnumValueFromString(defaultValue);
|
||||
sb.writeln("""
|
||||
return ${name}Values.firstWhere(
|
||||
(element) => element.toString() == _value,
|
||||
orElse: () => $_fallback,
|
||||
)
|
||||
""");
|
||||
sb.writeln(';');
|
||||
sb.writeln('}');
|
||||
sb.writeln("return $_fallback;");
|
||||
sb.writeln('}');
|
||||
sb.writeln('set ${name}Val($propertyType val) {');
|
||||
sb.writeln('params[${name}Key] = "\$val";');
|
||||
sb.writeln('widgetContext.onUpdate(id, widgetData);');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
String _getEnumValueFromString(item) {
|
||||
if (item == null) return '';
|
||||
String description = item.toString().replaceAll('#', '');
|
||||
// if (!description.contains('(')) {
|
||||
// return "$propertyType." + describeEnum(item);
|
||||
// }
|
||||
return description;
|
||||
}
|
||||
}
|
||||
|
||||
T getEnum<T>(String val, {T fallback, List<T> values}) {
|
||||
if (val == null) return fallback;
|
||||
final _value = val.replaceAll('#', '');
|
||||
return values.firstWhere(
|
||||
(element) => element.toString() == _value,
|
||||
orElse: () => null,
|
||||
);
|
||||
}
|
||||
|
||||
String describeEnum(String enumEntry) {
|
||||
final String description = enumEntry.toString();
|
||||
if (!description.contains('.')) {
|
||||
return description;
|
||||
}
|
||||
final int indexOfDot = description.indexOf('.');
|
||||
assert(indexOfDot != -1 && indexOfDot < description.length - 1);
|
||||
return description.substring(indexOfDot + 1);
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
import 'impl.dart';
|
||||
|
||||
class FunctionOptionTemplate extends SettingsImpl {
|
||||
String defaultValue;
|
||||
bool isPrivate;
|
||||
|
||||
@override
|
||||
String name;
|
||||
|
||||
@override
|
||||
String key;
|
||||
|
||||
@override
|
||||
String propertyType;
|
||||
|
||||
@override
|
||||
String access() {
|
||||
final sb = StringBuffer();
|
||||
sb.writeln('String get ${name}Val {');
|
||||
sb.write("if (params[${name}Key] != null) ");
|
||||
sb.writeln('{');
|
||||
sb.write('return ');
|
||||
sb.write('params[${name}Key] as String');
|
||||
sb.writeln(';');
|
||||
sb.writeln('}');
|
||||
if (defaultValue != null) {
|
||||
sb.writeln("return $defaultValue;");
|
||||
} else {
|
||||
sb.writeln("return null;");
|
||||
}
|
||||
sb.writeln('}');
|
||||
sb.writeln('set ${name}Val(String val) {');
|
||||
sb.writeln('params[${name}Key] = val;');
|
||||
sb.writeln('widgetContext.onUpdate(id, widgetData);');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@override
|
||||
String constructor() {
|
||||
final sb = StringBuffer();
|
||||
sb.write(' ');
|
||||
if (key != null && int.tryParse(key) != null) {
|
||||
sb.write('');
|
||||
} else if (key != null) {
|
||||
sb.write("$key: ");
|
||||
} else {
|
||||
sb.write("$name: ");
|
||||
}
|
||||
sb.writeln("() => onAction(context, ${name}Val)");
|
||||
sb.writeln(',');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
abstract class SettingsImpl {
|
||||
@override
|
||||
String toString() {
|
||||
final sb = StringBuffer();
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
String access();
|
||||
|
||||
String constructor() {
|
||||
final sb = StringBuffer();
|
||||
sb.write(' ');
|
||||
if (key != null && int.tryParse(key) != null) {
|
||||
sb.write('${name}Val');
|
||||
} else if (key != null) {
|
||||
sb.write("$key: ${name}Val");
|
||||
} else {
|
||||
sb.write("$name: ${name}Val");
|
||||
}
|
||||
sb.writeln(',');
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
String keyValue() {
|
||||
final sb = StringBuffer();
|
||||
sb.write(' ');
|
||||
sb.writeln("String ${name}Key = '${key ?? name}';");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
String get name;
|
||||
|
||||
String get key;
|
||||
|
||||
String get propertyType;
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
import 'impl.dart';
|
||||
|
||||
class KeyOptionTemplate extends SettingsImpl {
|
||||
String defaultValue;
|
||||
bool isPrivate;
|
||||
|
||||
@override
|
||||
String name;
|
||||
|
||||
@override
|
||||
String key;
|
||||
|
||||
@override
|
||||
String propertyType;
|
||||
|
||||
@override
|
||||
String access() {
|
||||
final sb = StringBuffer();
|
||||
sb.writeln('$propertyType get ${name}Val {');
|
||||
sb.write("if (params[${name}Key] != null) ");
|
||||
sb.writeln('{');
|
||||
sb.write("""
|
||||
String _val = params[${name}Key].toString();
|
||||
if (_val.startsWith('#')) {
|
||||
_val = _val.substring(1);
|
||||
if (_val.startsWith('ValueKey')) {
|
||||
_val = _val.replaceAll('ValueKey', '');
|
||||
_val = _val.replaceAll('<String>', '');
|
||||
_val = _val.replaceAll('(', '');
|
||||
_val = _val.replaceAll(')', '');
|
||||
}
|
||||
}
|
||||
return ValueKey('\$_val')
|
||||
""");
|
||||
sb.writeln(';');
|
||||
sb.writeln('}');
|
||||
if (defaultValue != null) {
|
||||
sb.writeln("return ValueKey<String>('$defaultValue');");
|
||||
} else {
|
||||
sb.writeln("return null;");
|
||||
}
|
||||
sb.writeln('}');
|
||||
sb.writeln('set ${name}Val($propertyType val) {');
|
||||
sb.write("""
|
||||
if (val == null) {
|
||||
params[${name}Key] = null;
|
||||
} else {
|
||||
params[${name}Key] = "#ValueKey('\$val')";
|
||||
}
|
||||
""");
|
||||
sb.writeln('widgetContext.onUpdate(id, widgetData);');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
import 'impl.dart';
|
||||
|
||||
class ListWidgetOptionTemplate extends SettingsImpl {
|
||||
String fallback;
|
||||
bool isPrivate;
|
||||
bool empty;
|
||||
String acceptType;
|
||||
|
||||
@override
|
||||
String name;
|
||||
|
||||
@override
|
||||
String key;
|
||||
|
||||
@override
|
||||
String propertyType;
|
||||
|
||||
@override
|
||||
String access() {
|
||||
final sb = StringBuffer();
|
||||
sb.writeln('final _${name}Listen = ValueNotifier<bool>(false);');
|
||||
sb.writeln('List<WidgetBase> get ${name}Val {');
|
||||
sb.write("if (params[${name}Key] != null) ");
|
||||
sb.writeln('{');
|
||||
sb.write("""
|
||||
final _children = <WidgetBase>[];
|
||||
final _list = List.from(params[${name}Key]);
|
||||
for (final item in _list) {
|
||||
if (item is Map<String, dynamic>) {
|
||||
_children.add(widgetRender(widgetContext, item));
|
||||
}
|
||||
}
|
||||
return _children;
|
||||
""");
|
||||
sb.writeln('}');
|
||||
if (fallback != null) {
|
||||
final random = DateTime.now().millisecondsSinceEpoch.toString();
|
||||
sb.writeln("""
|
||||
return [
|
||||
widgetRender({
|
||||
'id': '$random',
|
||||
'name': '$fallback',
|
||||
'params': {},
|
||||
})
|
||||
];
|
||||
""");
|
||||
} else {
|
||||
sb.writeln("return null;");
|
||||
}
|
||||
sb.writeln('}');
|
||||
sb.writeln('void ${name}ValUpdate(Map<String, dynamic> val) {');
|
||||
sb.write("""
|
||||
if (params[${name}Key] == null) {
|
||||
params[${name}Key] = [];
|
||||
}
|
||||
params[${name}Key].add(val);
|
||||
""");
|
||||
sb.writeln('widgetContext.onUpdate(id, widgetData);');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@override
|
||||
String constructor() {
|
||||
final sb = StringBuffer();
|
||||
sb.write(' ');
|
||||
if (key != null && int.tryParse(key) != null) {
|
||||
sb.write('');
|
||||
} else if (key != null) {
|
||||
sb.write("$key: ");
|
||||
} else {
|
||||
sb.write("$name: ");
|
||||
}
|
||||
sb.write("""
|
||||
${name}Val == null && !widgetContext.isDragging ? ${empty ? '[]' : 'null'} : [
|
||||
if (${name}Val != null)
|
||||
for (final item in ${name}Val) item.build(context),
|
||||
""");
|
||||
if (acceptType != null && acceptType.isNotEmpty) {
|
||||
sb.write("""
|
||||
if (widgetContext.isDragging)
|
||||
DragTarget<$acceptType>(
|
||||
onAccept: (val) {
|
||||
_${name}Listen.value = false;
|
||||
if (val != null) {
|
||||
${name}ValUpdate(val?.data);
|
||||
}
|
||||
},
|
||||
onLeave: (val) {
|
||||
_${name}Listen.value = false;
|
||||
},
|
||||
onWillAccept: (val) {
|
||||
_${name}Listen.value = true;
|
||||
return _${name}Listen.value;
|
||||
},
|
||||
builder: (context, accepted, rejected) {
|
||||
return ValueListenableBuilder<bool>(
|
||||
valueListenable: _${name}Listen,
|
||||
builder: (context, _accepting, child) => SizedBox.fromSize(
|
||||
size: Size(${30}, ${30}),
|
||||
child: Placeholder(
|
||||
color: !_accepting ?
|
||||
Colors.grey :
|
||||
Theme.of(context).accentColor,
|
||||
),
|
||||
));
|
||||
},
|
||||
),
|
||||
""");
|
||||
}
|
||||
sb.writeln('],');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
import 'impl.dart';
|
||||
|
||||
class Matrix4OptionTemplate extends SettingsImpl {
|
||||
bool isPrivate;
|
||||
|
||||
@override
|
||||
String name;
|
||||
|
||||
@override
|
||||
String key;
|
||||
|
||||
@override
|
||||
String propertyType;
|
||||
|
||||
@override
|
||||
String access() {
|
||||
final sb = StringBuffer();
|
||||
sb.writeln('$propertyType get ${name}Val {');
|
||||
sb.writeln("""
|
||||
final _matrix = Matrix4.identity();
|
||||
if (params[${name}Key] != null) {
|
||||
if (params[${name}Key] is List) {
|
||||
final values = List.from(params[${name}Key]);
|
||||
_matrix.setValues(
|
||||
values[0],
|
||||
values[1],
|
||||
values[2],
|
||||
values[3],
|
||||
values[4],
|
||||
values[5],
|
||||
values[6],
|
||||
values[7],
|
||||
values[8],
|
||||
values[9],
|
||||
values[10],
|
||||
values[11],
|
||||
values[12],
|
||||
values[13],
|
||||
values[14],
|
||||
values[15],
|
||||
);
|
||||
} else if (params[${name}Key] is String) {
|
||||
final description = params[${name}Key].toString();
|
||||
final _entryMatches = 'setEntry('.allMatches(description).toList();
|
||||
final _rotateXMatches = 'rotateX('.allMatches(description).toList();
|
||||
final _rotateYMatches = 'rotateY('.allMatches(description).toList();
|
||||
final _rotateZMatches = 'rotateZ('.allMatches(description).toList();
|
||||
for (final idx in _entryMatches) {
|
||||
int start = idx.end;
|
||||
int end = description.indexOf(')', start);
|
||||
final _values = description
|
||||
.substring(start, end)
|
||||
.split(',')
|
||||
.map((e) => num.tryParse(e.trim()))
|
||||
.toList();
|
||||
_matrix.setEntry(
|
||||
_values[0].toInt(),
|
||||
_values[1].toInt(),
|
||||
_values[2].toDouble(),
|
||||
);
|
||||
}
|
||||
for (final idx in _rotateXMatches) {
|
||||
int start = idx.end;
|
||||
int end = description.indexOf(')', start);
|
||||
final _value = num.tryParse(description.substring(start, end).trim());
|
||||
_matrix.rotateX(_value.toDouble());
|
||||
}
|
||||
for (final idx in _rotateYMatches) {
|
||||
int start = idx.end;
|
||||
int end = description.indexOf(')', start);
|
||||
final _value = num.tryParse(description.substring(start, end).trim());
|
||||
_matrix.rotateY(_value.toDouble());
|
||||
}
|
||||
for (final idx in _rotateZMatches) {
|
||||
int start = idx.end;
|
||||
int end = description.indexOf(')', start);
|
||||
final _value = num.tryParse(description.substring(start, end).trim());
|
||||
_matrix.rotateZ(_value.toDouble());
|
||||
}
|
||||
}
|
||||
}
|
||||
return _matrix;
|
||||
""");
|
||||
sb.writeln('}');
|
||||
sb.writeln('set ${name}Val($propertyType val) {');
|
||||
sb.writeln('params[${name}Key] = val.storage.toList();');
|
||||
sb.writeln('widgetContext.onUpdate(id, widgetData);');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
import 'impl.dart';
|
||||
|
||||
class OffsetOptionTemplate extends SettingsImpl {
|
||||
bool isPrivate;
|
||||
|
||||
@override
|
||||
String name;
|
||||
|
||||
@override
|
||||
String key;
|
||||
|
||||
@override
|
||||
String propertyType;
|
||||
|
||||
@override
|
||||
String access() {
|
||||
final sb = StringBuffer();
|
||||
sb.writeln('$propertyType get ${name}Val {');
|
||||
sb.writeln("""
|
||||
Offset _offset = Offset(0.0, 0.0);
|
||||
if (params[${name}Key] != null) {
|
||||
double dx = 0;
|
||||
double dy = 0;
|
||||
Map<String, dynamic> _offsetParams = params[${name}Key]['params'];
|
||||
dx = _offsetParams['0'] ?? 0;
|
||||
dy = _offsetParams['1'] ?? 0;
|
||||
_offset = Offset(dx, dy);
|
||||
}
|
||||
return _offset;
|
||||
""");
|
||||
sb.writeln('}');
|
||||
sb.writeln('set ${name}Val($propertyType val) {');
|
||||
sb.write('''
|
||||
params[${name}Key] = {
|
||||
"name" : "Offset",
|
||||
"id" : "${name}KeyOffset",
|
||||
"params" : {
|
||||
"0" : val.dx,
|
||||
"1" : val.dy,
|
||||
}
|
||||
};
|
||||
''');
|
||||
sb.writeln('widgetContext.onUpdate(id, widgetData);');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
import 'impl.dart';
|
||||
|
||||
class SizeOptionTemplate extends SettingsImpl {
|
||||
bool isPrivate;
|
||||
|
||||
@override
|
||||
String name;
|
||||
|
||||
@override
|
||||
String key;
|
||||
|
||||
@override
|
||||
String propertyType;
|
||||
|
||||
@override
|
||||
String access() {
|
||||
final sb = StringBuffer();
|
||||
sb.writeln('$propertyType get ${name}Val {');
|
||||
sb.writeln("""
|
||||
Size _size = Size(0.0, 0.0);
|
||||
if (params[${name}Key] != null) {
|
||||
double width = 0;
|
||||
double height = 0;
|
||||
Map<String, dynamic> _sizeParams = params[${name}Key]['params'];
|
||||
width = _sizeParams['0'] ?? 0;
|
||||
height = _sizeParams['1'] ?? 0;
|
||||
_size = Size(width, height);
|
||||
}
|
||||
return _size;
|
||||
""");
|
||||
sb.writeln('}');
|
||||
sb.writeln('set ${name}Val($propertyType val) {');
|
||||
sb.write('''
|
||||
params[${name}Key] = {
|
||||
"name" : "Size",
|
||||
"id" : "${name}KeySize",
|
||||
"params" : {
|
||||
"0" : val.width,
|
||||
"1" : val.height,
|
||||
}
|
||||
};
|
||||
''');
|
||||
sb.writeln('widgetContext.onUpdate(id, widgetData);');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
import 'impl.dart';
|
||||
|
||||
class SupportedOptionTemplate extends SettingsImpl {
|
||||
bool isPrivate;
|
||||
|
||||
@override
|
||||
String name;
|
||||
|
||||
@override
|
||||
String key;
|
||||
|
||||
@override
|
||||
String propertyType;
|
||||
|
||||
@override
|
||||
String access() {
|
||||
final sb = StringBuffer();
|
||||
sb.writeln('$propertyType get ${name}Val {');
|
||||
sb.write("if (params[${name}Key] != null) ");
|
||||
sb.writeln('{');
|
||||
sb.write('return ');
|
||||
sb.write('$propertyType(params[${name}Key], widgetContext, widgetRender)');
|
||||
sb.writeln(';');
|
||||
sb.writeln('}');
|
||||
sb.writeln("return null;");
|
||||
sb.writeln('}');
|
||||
sb.writeln('set ${name}Val($propertyType val) {');
|
||||
sb.writeln('params[${name}Key] = val;');
|
||||
sb.writeln('widgetContext.onUpdate(id, widgetData);');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@override
|
||||
String constructor() {
|
||||
final sb = StringBuffer();
|
||||
sb.write(' ');
|
||||
if (key != null && int.tryParse(key) != null) {
|
||||
sb.write('');
|
||||
} else if (key != null) {
|
||||
sb.write("$key: ");
|
||||
} else {
|
||||
sb.write("$name: ");
|
||||
}
|
||||
sb.writeln("${name}Val?.build(context)");
|
||||
sb.writeln(',');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
import 'impl.dart';
|
||||
|
||||
import 'package:shortid/shortid.dart';
|
||||
|
||||
class WidgetOptionTemplate extends SettingsImpl {
|
||||
String fallback;
|
||||
bool isPrivate;
|
||||
String acceptType;
|
||||
double acceptWidth;
|
||||
double acceptHeight;
|
||||
|
||||
@override
|
||||
String name;
|
||||
|
||||
@override
|
||||
String key;
|
||||
|
||||
@override
|
||||
String propertyType;
|
||||
|
||||
@override
|
||||
String access() {
|
||||
final sb = StringBuffer();
|
||||
if (acceptType != null) {
|
||||
sb.writeln('final _${name}Listen = ValueNotifier<bool>(false);');
|
||||
}
|
||||
sb.writeln('WidgetBase get ${name}Val {');
|
||||
sb.write("if (params[${name}Key] != null) ");
|
||||
sb.writeln('{');
|
||||
sb.write('return ');
|
||||
sb.write('widgetRender(widgetContext, params[${name}Key])');
|
||||
sb.writeln(';');
|
||||
sb.writeln('}');
|
||||
sb.writeln("return null;");
|
||||
sb.writeln('}');
|
||||
sb.writeln('void ${name}ValUpdate(Map<String, dynamic> val) {');
|
||||
sb.write("""
|
||||
final _data = val;
|
||||
_data['id'] = '${shortid.generate()}';
|
||||
if (_data['name'] == 'Text') {
|
||||
_data['params']['style']['id'] = '${shortid.generate()}';
|
||||
}
|
||||
if (_data['name'] == 'Icon') {
|
||||
_data['params']['0']['id'] = '${shortid.generate()}';
|
||||
}
|
||||
""");
|
||||
sb.writeln('params[${name}Key] = _data;');
|
||||
sb.writeln('widgetContext.onUpdate(id, widgetData);');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@override
|
||||
String constructor() {
|
||||
final sb = StringBuffer();
|
||||
sb.write(' ');
|
||||
if (key != null && int.tryParse(key) != null) {
|
||||
sb.write('');
|
||||
} else if (key != null) {
|
||||
sb.write("$key: ");
|
||||
} else {
|
||||
sb.write("$name: ");
|
||||
}
|
||||
if (acceptType == null) {
|
||||
sb.writeln('${name}Val?.build(context)');
|
||||
} else {
|
||||
sb.write("""
|
||||
!widgetContext.isDragging || (widgetContext.isDragging && ${name}Val?.build(context) != null) ?
|
||||
(
|
||||
${name}Val?.build(context)
|
||||
|
||||
""");
|
||||
if (fallback != null) {
|
||||
sb.write("""
|
||||
?? (widgetRender(widgetContext, json.decode(json.encode({
|
||||
'id': '${shortid.generate()}',
|
||||
'name': '$fallback',
|
||||
'params': {},
|
||||
})))).build(context)
|
||||
""");
|
||||
}
|
||||
sb.write("""
|
||||
)
|
||||
""");
|
||||
sb.write("""
|
||||
:
|
||||
PreferredSize(
|
||||
preferredSize: Size(${acceptWidth ?? 30}, ${acceptHeight ?? 30}),
|
||||
child: DragTarget<$acceptType>(
|
||||
onAccept: (val) {
|
||||
_${name}Listen.value = false;
|
||||
if (val != null) {
|
||||
${name}ValUpdate(val?.data);
|
||||
}
|
||||
},
|
||||
onLeave: (val) {
|
||||
_${name}Listen.value = false;
|
||||
},
|
||||
onWillAccept: (val) {
|
||||
_${name}Listen.value = true;
|
||||
return _${name}Listen.value;
|
||||
},
|
||||
builder: (context, accepted, rejected) {
|
||||
return ValueListenableBuilder<bool>(
|
||||
valueListenable: _${name}Listen,
|
||||
builder: (context, _accepting, child) => SizedBox.fromSize(
|
||||
size: Size(${acceptWidth ?? 30}, ${acceptHeight ?? 30}),
|
||||
child: Placeholder(
|
||||
color: !_accepting ?
|
||||
Colors.grey :
|
||||
Theme.of(context).accentColor,
|
||||
),
|
||||
));
|
||||
},
|
||||
),
|
||||
)
|
||||
""");
|
||||
}
|
||||
sb.writeln(',');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
class Rows<T> {
|
||||
final List<T> _templates = [];
|
||||
|
||||
void add(T template) => _templates.add(template);
|
||||
|
||||
bool get isEmpty => _templates.isEmpty;
|
||||
List get templates => _templates;
|
||||
|
||||
@override
|
||||
String toString() =>
|
||||
_templates.map((t) => t.toString()).where((s) => s.isNotEmpty).join('\n');
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
const _analyzerIgnores =
|
||||
'// ignore_for_file: non_constant_identifier_names, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic, avoid_init_to_null';
|
||||
|
||||
class StoreFileTemplate {
|
||||
Iterable<String> storeSources;
|
||||
|
||||
@override
|
||||
String toString() => storeSources.isEmpty
|
||||
? ''
|
||||
: '''
|
||||
$_analyzerIgnores
|
||||
|
||||
${storeSources.join('\n\n')}
|
||||
''';
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
import 'package:analyzer/dart/element/element.dart';
|
||||
import 'package:source_gen/source_gen.dart';
|
||||
|
||||
import '../type_names.dart';
|
||||
import 'params.dart';
|
||||
|
||||
// ignore: avoid_annotating_with_dynamic
|
||||
String surroundNonEmpty(String prefix, String suffix, dynamic content) {
|
||||
final contentStr = content.toString();
|
||||
return contentStr.isEmpty ? '' : '$prefix$contentStr$suffix';
|
||||
}
|
||||
|
||||
const _streamChecker = TypeChecker.fromRuntime(Stream);
|
||||
|
||||
class AsyncMethodChecker {
|
||||
AsyncMethodChecker([TypeChecker checkStream]) {
|
||||
_checkStream = checkStream ?? _streamChecker;
|
||||
}
|
||||
|
||||
TypeChecker _checkStream;
|
||||
|
||||
bool returnsFuture(MethodElement method) =>
|
||||
method.returnType.isDartAsyncFuture ||
|
||||
(method.isAsynchronous &&
|
||||
!method.isGenerator &&
|
||||
method.returnType.isDynamic);
|
||||
|
||||
bool returnsStream(MethodElement method) =>
|
||||
_checkStream.isAssignableFromType(method.returnType) ||
|
||||
(method.isAsynchronous &&
|
||||
method.isGenerator &&
|
||||
method.returnType.isDynamic);
|
||||
}
|
||||
|
||||
TypeParamTemplate typeParamTemplate(
|
||||
TypeParameterElement param,
|
||||
LibraryScopedNameFinder typeNameFinder,
|
||||
) =>
|
||||
TypeParamTemplate()
|
||||
..name = param.name
|
||||
..bound = param.bound != null
|
||||
? typeNameFinder.findTypeParameterBoundsTypeName(param)
|
||||
: null;
|
||||
@@ -0,0 +1,106 @@
|
||||
import 'comma_list.dart';
|
||||
import 'params.dart';
|
||||
import 'properties/impl.dart';
|
||||
|
||||
class MixinStoreTemplate extends StoreTemplate {
|
||||
final String extendsClass;
|
||||
double width, height;
|
||||
|
||||
MixinStoreTemplate(this.extendsClass);
|
||||
String get typeName => '_\$$publicTypeName';
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
final sb = StringBuffer();
|
||||
sb.writeln('abstract class $typeName$typeParams extends $extendsClass {');
|
||||
for (final setting in settings) {
|
||||
sb.write(setting.keyValue());
|
||||
}
|
||||
sb.writeln('');
|
||||
final _hasPreferredSize = width != null || height != null;
|
||||
if (_hasPreferredSize) {
|
||||
sb.writeln('@override');
|
||||
sb.write('Size get preferredSize => ');
|
||||
if (width != null && height != null) {
|
||||
sb.write('Size($width, $height)');
|
||||
} else if (width != null) {
|
||||
sb.write('Size.fromWidth($width)');
|
||||
} else if (height != null) {
|
||||
sb.write('Size.fromHeight($height)');
|
||||
}
|
||||
sb.writeln(';');
|
||||
}
|
||||
sb.writeln('');
|
||||
sb.writeln('@override');
|
||||
sb.writeln('Map<String, String> get properties => {');
|
||||
for (final setting in settings) {
|
||||
sb.write("'${setting?.key ?? setting.name}'");
|
||||
sb.write(':');
|
||||
sb.write("'${setting.propertyType}'");
|
||||
sb.writeln(',');
|
||||
}
|
||||
sb.writeln('};');
|
||||
sb.writeln('');
|
||||
for (final setting in settings) {
|
||||
sb.writeln(setting.access());
|
||||
}
|
||||
sb.writeln('');
|
||||
sb.writeln('@override');
|
||||
sb.writeln('Object build(BuildContext context) {');
|
||||
sb.write(' return ');
|
||||
if (allowTap) {
|
||||
if (_hasPreferredSize) {
|
||||
sb.writeln('PreferredSize(');
|
||||
sb.writeln('preferredSize: preferredSize,');
|
||||
sb.writeln('child: ');
|
||||
}
|
||||
sb.writeln('GestureDetector(');
|
||||
sb.writeln("onTap: () => widgetContext.onTap(id, widgetData),");
|
||||
sb.writeln('child: ');
|
||||
}
|
||||
if (isAnimated) {
|
||||
sb.write('Animated');
|
||||
}
|
||||
sb.writeln('$widgetName(');
|
||||
settings.sort((a, b) => (a?.key ?? a.name).compareTo((b?.key ?? b.name)));
|
||||
if (isAnimated) {
|
||||
sb.writeln(
|
||||
'duration: const Duration(milliseconds: $animatedDurationMilliseconds),');
|
||||
}
|
||||
for (final setting in settings) {
|
||||
sb.writeln(setting.constructor());
|
||||
}
|
||||
sb.writeln(')');
|
||||
if (allowTap) {
|
||||
if (_hasPreferredSize) {
|
||||
sb.write(',');
|
||||
sb.writeln(')');
|
||||
}
|
||||
sb.write(',');
|
||||
sb.writeln(')');
|
||||
}
|
||||
sb.write(';');
|
||||
sb.writeln('}');
|
||||
sb.writeln('');
|
||||
sb.writeln('}');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
abstract class StoreTemplate {
|
||||
final SurroundedCommaList<TypeParamTemplate> typeParams =
|
||||
SurroundedCommaList('<', '>', []);
|
||||
final SurroundedCommaList<String> typeArgs =
|
||||
SurroundedCommaList('<', '>', []);
|
||||
String publicTypeName;
|
||||
String parentTypeName;
|
||||
String widgetName;
|
||||
bool isAnimated;
|
||||
int animatedDurationMilliseconds;
|
||||
bool allowTap;
|
||||
|
||||
final List<SettingsImpl> settings = [];
|
||||
|
||||
@override
|
||||
String toString();
|
||||
}
|
||||
Reference in New Issue
Block a user