resolveResizeBounds method
DiagramRect
resolveResizeBounds({
- required DiagramRect bounds,
- required DiagramPoint pointer,
- required double axisX,
- required double axisY,
- required Iterable<
FramedElement> members, - bool preserveAspectRatio = false,
- bool fromCenter = false,
- String? defaultFontFamily,
Implementation
DiagramRect resolveResizeBounds({
required DiagramRect bounds,
required DiagramPoint pointer,
required double axisX,
required double axisY,
required Iterable<FramedElement> members,
bool preserveAspectRatio = false,
bool fromCenter = false,
String? defaultFontFamily,
}) {
final sources = members.toList();
DiagramSize declared(FramedElement e) => switch (e) {
ShapeElement() => registry.require(e.type).minimumSize,
TextElement() => registry.requireText(e.type).minimumSize,
};
var minimum = DiagramResizeGeometry.minimumFor(
bounds: bounds,
members: [
for (final e in sources) (frame: e.frame, minimum: declared(e)),
],
);
final engine = defaultFontFamily == null
? textLayout
: DefaultFontTextLayout(textLayout, defaultFontFamily);
var result = bounds;
for (var pass = 0; pass < 8; pass++) {
result = DiagramResizeGeometry.resolve(
bounds: bounds,
pointer: pointer,
axisX: axisX,
axisY: axisY,
minimumSize: minimum,
preserveAspectRatio: preserveAspectRatio,
fromCenter: fromCenter,
);
final constraints = <({DiagramRect frame, DiagramSize minimum})>[];
for (final element in sources) {
final base = declared(element);
final probeFrame = DiagramRect.fromLTWH(
element.frame.left,
element.frame.top,
math.max(
base.width,
element.frame.width * result.width / bounds.width,
),
base.height,
);
final mode = axisX != 0
? DiagramTextSizingMode.fixedWidth
: switch (element) {
ShapeElement() => element.textSizingMode,
TextElement() => element.textSizingMode,
};
final fitted = switch (element) {
ShapeElement() => _resizeShapeFrame(
element.copyWith(frame: probeFrame, textSizingMode: mode),
engine,
),
TextElement() => _resizeTextFrame(
element.copyWith(frame: probeFrame, textSizingMode: mode),
engine,
),
};
constraints.add((
frame: element.frame,
minimum: DiagramSize(
math.max(base.width, fitted.width),
math.max(base.height, fitted.height),
),
));
}
final measured = DiagramResizeGeometry.minimumFor(
bounds: bounds,
members: constraints,
);
final next = DiagramSize(
math.max(minimum.width, measured.width),
math.max(minimum.height, measured.height),
);
if (next.width <= result.width + .001 &&
next.height <= result.height + .001) {
return result;
}
minimum = next;
}
return DiagramResizeGeometry.resolve(
bounds: bounds,
pointer: pointer,
axisX: axisX,
axisY: axisY,
minimumSize: minimum,
preserveAspectRatio: preserveAspectRatio,
fromCenter: fromCenter,
);
}