Merge pull request #811 from pangeachat/fix-cutoff-popups
adjust oerlay offset on overflow
This commit is contained in:
commit
1fabeba1fb
2 changed files with 39 additions and 17 deletions
|
|
@ -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…
Add table
Reference in a new issue