/
modifier.dart
64 lines (53 loc) · 1.92 KB
/
modifier.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import 'package:graphic/graphic.dart';
import 'package:graphic/src/common/modifier.dart' as common;
import 'package:graphic/src/dataflow/operator.dart';
import 'package:graphic/src/dataflow/tuple.dart';
import 'package:graphic/src/scale/scale.dart';
import '../../aes/position.dart';
import '../../algebra/varset.dart';
import '../../coord/coord.dart';
/// The specification of a collision modifier.
///
/// A collision modifier defines a method to modify the position of element items,
/// avoiding visual overlapping.
abstract class Modifier {
@override
bool operator ==(Object other) => other is Modifier;
GeomModifierOp<GeomModifier> toGeomModifierOp(ToGeomModifierOpParams params);
}
/// The only use of this class to pass parameters to [Modifier.toGeomModifierOp].
/// A class is used, instead of named arguments, to avoid breaking changes when
/// adding new fields to these parameters.
class ToGeomModifierOpParams {
final AlgForm? form;
final ScaleConvOp scales;
final Operator<AesGroups> groups;
final OriginOp origin;
final CoordConvOp coord;
ToGeomModifierOpParams({
required this.form,
required this.scales,
required this.groups,
required this.origin,
required this.coord,
});
}
/// The base class of geometry modifiers.
///
/// A geometry modifier executes a corresponding [Modifier].
abstract class GeomModifier extends common.Modifier<AesGroups> {}
/// The operator to create a geometry modifier.
abstract class GeomModifierOp<M extends GeomModifier> extends Operator<M> {
GeomModifierOp(Map<String, dynamic> params) : super(params);
}
/// The operator to modify aeses with a geometry modifier.
class ModifyOp extends Operator<AesGroups> {
ModifyOp(Map<String, dynamic> params) : super(params);
@override
AesGroups evaluate() {
final groups = params['groups'] as AesGroups;
final modifier = params['modifier'] as GeomModifier;
modifier.modify(groups);
return groups;
}
}