adjust oerlay offset on overflow

pull/1428/head
ggurdin 1 year ago
parent 04b3fd6840
commit 7b2defab02
No known key found for this signature in database
GPG Key ID: A01CB41737CBB478

@ -317,14 +317,14 @@ class _SpaceViewState extends State<SpaceView> {
key: AddRoomType.subspace,
// #Pangea
// label: L10n.of(context)!.createNewSpace,
label: L10n.of(context)!.newChat,
label: L10n.of(context)!.newSpace,
// Pangea#
),
AlertDialogAction(
key: AddRoomType.chat,
// #Pangea
// label: L10n.of(context)!.createGroup,
label: L10n.of(context)!.createChat,
label: L10n.of(context)!.newChat,
// Pangea#
),
],

@ -20,17 +20,14 @@ class OverlayUtil {
required BuildContext context,
required Widget child,
required String transformTargetId,
double? width,
double? height,
backDropToDismiss = true,
blurBackground = false,
Color? borderColor,
Color? backgroundColor,
Alignment? targetAnchor,
Alignment? followerAnchor,
bool closePrevOverlay = true,
Function? onDismiss,
OverlayPositionEnum position = OverlayPositionEnum.transform,
Offset? offset,
}) {
try {
if (closePrevOverlay) {
@ -54,18 +51,16 @@ class OverlayUtil {
right: (position == OverlayPositionEnum.centered) ? 0 : null,
left: (position == OverlayPositionEnum.centered) ? 0 : null,
bottom: (position == OverlayPositionEnum.centered) ? 0 : null,
width: width,
height: height,
child: (position != OverlayPositionEnum.transform)
? child
: CompositedTransformFollower(
targetAnchor: targetAnchor ?? Alignment.topCenter,
followerAnchor:
followerAnchor ?? Alignment.bottomCenter,
targetAnchor: Alignment.topCenter,
followerAnchor: Alignment.bottomCenter,
link: MatrixState.pAnyState
.layerLinkAndKey(transformTargetId)
.link,
showWhenUnlinked: false,
offset: offset ?? Offset.zero,
child: child,
),
),
@ -100,6 +95,32 @@ class OverlayUtil {
return;
}
Offset offset = Offset.zero;
final RenderBox? targetRenderBox =
layerLinkAndKey.key.currentContext!.findRenderObject() as RenderBox?;
if (targetRenderBox != null && targetRenderBox.hasSize) {
final Offset transformTargetOffset =
(targetRenderBox).localToGlobal(Offset.zero);
final Size transformTargetSize = targetRenderBox.size;
final horizontalMidpoint =
transformTargetOffset.dx + (transformTargetSize.width / 2);
final halfMaxWidth = maxWidth / 2;
final hasLeftOverflow = (horizontalMidpoint - halfMaxWidth) < 0;
final hasRightOverflow = (horizontalMidpoint + halfMaxWidth) >
MediaQuery.of(context).size.width;
double xOffset = 0;
MediaQuery.of(context).size.width - (horizontalMidpoint + halfMaxWidth);
if (hasLeftOverflow) {
xOffset = (transformTargetOffset.dx - halfMaxWidth) * -1;
} else if (hasRightOverflow) {
xOffset = MediaQuery.of(context).size.width -
(horizontalMidpoint + halfMaxWidth);
}
offset = Offset(xOffset, 0);
}
final Widget child = Material(
borderOnForeground: false,
color: Colors.transparent,
@ -119,6 +140,7 @@ class OverlayUtil {
backDropToDismiss: backDropToDismiss,
borderColor: borderColor,
closePrevOverlay: closePrevOverlay,
offset: offset,
);
} catch (err, stack) {
debugger(when: kDebugMode);
@ -138,12 +160,12 @@ class OverlayUtil {
// final OverlayConstraints constraints =
// ChatViewConstraints(transformTargetContext);
// final RenderObject? targetRenderBox =
// transformTargetContext.findRenderObject();
// if (targetRenderBox == null) return Offset.zero;
// final Offset transformTargetOffset =
// (targetRenderBox as RenderBox).localToGlobal(Offset.zero);
// final Size transformTargetSize = targetRenderBox.size;
// final RenderObject? targetRenderBox =
// transformTargetContext.findRenderObject();
// if (targetRenderBox == null) return Offset.zero;
// final Offset transformTargetOffset =
// (targetRenderBox as RenderBox).localToGlobal(Offset.zero);
// final Size transformTargetSize = targetRenderBox.size;
// // ideally horizontally centered on target
// double dx = transformTargetSize.width / 2 - cardSize.width / 2;

Loading…
Cancel
Save