calculateInteractiveButtonScaleRotate method

dynamic calculateInteractiveButtonScaleRotate({
  1. required double editorScaleFactor,
  2. required Offset editorScaleOffset,
  3. required ProImageEditorConfigs configs,
  4. required ScaleUpdateDetails details,
  5. required Layer activeLayer,
  6. required Size editorSize,
  7. required bool configEnabledHitVibration,
  8. required ThemeLayerInteraction layerTheme,
})

Calculates scaling and rotation based on user interactions.

Implementation

calculateInteractiveButtonScaleRotate({
  required double editorScaleFactor,
  required Offset editorScaleOffset,
  required ProImageEditorConfigs configs,
  required ScaleUpdateDetails details,
  required Layer activeLayer,
  required Size editorSize,
  required bool configEnabledHitVibration,
  required ThemeLayerInteraction layerTheme,
}) {
  Offset layerOffset = Offset(
    activeLayer.offset.dx,
    activeLayer.offset.dy,
  );
  Size activeSize = rotateScaleLayerSizeHelper!;

  double realDx =
      (details.focalPoint.dx - editorScaleOffset.dx) / editorScaleFactor;

  double realDy =
      (details.focalPoint.dy - editorScaleOffset.dy) / editorScaleFactor;

  Offset touchPositionFromCenter = Offset(
        realDx - editorSize.width / 2,
        realDy - editorSize.height / 2,
      ) -
      layerOffset;

  touchPositionFromCenter = Offset(
    touchPositionFromCenter.dx * (activeLayer.flipX ? -1 : 1),
    touchPositionFromCenter.dy * (activeLayer.flipY ? -1 : 1),
  );

  double newDistance = touchPositionFromCenter.distance;

  double margin = layerTheme.buttonRadius + layerTheme.strokeWidth * 2;
  var realSize = Offset(
        activeSize.width / 2 - margin,
        activeSize.height / 2 - margin,
      ) /
      rotateScaleLayerScaleHelper!;

  activeLayer.scale = newDistance / realSize.distance;
  _setMinMaxScaleFactor(configs, activeLayer);
  activeLayer.rotation =
      touchPositionFromCenter.direction - atan(1 / activeSize.aspectRatio);

  if (editorScaleFactor > 1) return;
  checkRotationLine(
    activeLayer: activeLayer,
    editorSize: editorSize,
    configEnabledHitVibration: configEnabledHitVibration,
  );
}