resolveResizeBounds method

DiagramRect resolveResizeBounds({
  1. required DiagramRect bounds,
  2. required DiagramPoint pointer,
  3. required double axisX,
  4. required double axisY,
  5. required Iterable<FramedElement> members,
  6. bool preserveAspectRatio = false,
  7. bool fromCenter = false,
  8. 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,
  );
}