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, key: AddRoomType.subspace,
// #Pangea // #Pangea
// label: L10n.of(context)!.createNewSpace, // label: L10n.of(context)!.createNewSpace,
label: L10n.of(context)!.newChat, label: L10n.of(context)!.newSpace,
// Pangea# // Pangea#
), ),
AlertDialogAction( AlertDialogAction(
key: AddRoomType.chat, key: AddRoomType.chat,
// #Pangea // #Pangea
// label: L10n.of(context)!.createGroup, // label: L10n.of(context)!.createGroup,
label: L10n.of(context)!.createChat, label: L10n.of(context)!.newChat,
// Pangea# // Pangea#
), ),
], ],

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

Loading…
Cancel
Save