mind_map_end_float_location.dart 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import 'dart:math' as math;
  2. import 'package:flutter/material.dart';
  3. class MindMapFloatingActionButtonLocation extends FloatingActionButtonLocation {
  4. const MindMapFloatingActionButtonLocation();
  5. @override
  6. Offset getOffset(ScaffoldPrelayoutGeometry scaffoldGeometry) {
  7. // Compute the x-axis offset.
  8. final double fabX = _endOffset(scaffoldGeometry);
  9. // Compute the y-axis offset.
  10. final double contentBottom = scaffoldGeometry.contentBottom;
  11. final double bottomSheetHeight = scaffoldGeometry.bottomSheetSize.height;
  12. final double fabHeight = scaffoldGeometry.floatingActionButtonSize.height;
  13. final double snackBarHeight = scaffoldGeometry.snackBarSize.height;
  14. double fabY = contentBottom - fabHeight - kFloatingActionButtonMargin;
  15. if (snackBarHeight > 0.0) {
  16. fabY = math.min(
  17. fabY,
  18. contentBottom -
  19. snackBarHeight -
  20. fabHeight -
  21. kFloatingActionButtonMargin);
  22. }
  23. if (bottomSheetHeight > 0.0) {
  24. fabY =
  25. math.min(fabY, contentBottom - bottomSheetHeight - fabHeight / 2.0);
  26. }
  27. return Offset(fabX, fabY - 32);
  28. }
  29. double _endOffset(ScaffoldPrelayoutGeometry scaffoldGeometry,
  30. {double offset = 0.0}) {
  31. switch (scaffoldGeometry.textDirection) {
  32. case TextDirection.rtl:
  33. return _leftOffset(scaffoldGeometry, offset: offset);
  34. case TextDirection.ltr:
  35. return _rightOffset(scaffoldGeometry, offset: offset);
  36. }
  37. }
  38. double _leftOffset(ScaffoldPrelayoutGeometry scaffoldGeometry,
  39. {double offset = 0.0}) {
  40. return kFloatingActionButtonMargin +
  41. scaffoldGeometry.minInsets.left -
  42. offset;
  43. }
  44. double _rightOffset(ScaffoldPrelayoutGeometry scaffoldGeometry,
  45. {double offset = 0.0}) {
  46. return scaffoldGeometry.scaffoldSize.width -
  47. kFloatingActionButtonMargin -
  48. scaffoldGeometry.minInsets.right -
  49. scaffoldGeometry.floatingActionButtonSize.width +
  50. offset;
  51. }
  52. }