Get rid of scrollcontroller chain

This commit is contained in:
Kelrap 2024-07-16 16:07:42 -04:00
parent e7167631d0
commit 19987c75a7
7 changed files with 44 additions and 66 deletions

View file

@ -168,7 +168,6 @@ class ChatEventList extends StatelessWidget {
onSelect: controller.onSelectMessage,
scrollToEventId: (String eventId) =>
controller.scrollToEventId(eventId),
scrollController: controller.scrollController,
longPressSelect: controller.selectedEvents.isNotEmpty,
// #Pangea
selectedDisplayLang:

View file

@ -43,7 +43,6 @@ class Message extends StatelessWidget {
final bool immersionMode;
final bool definitions;
final ChatController controller;
final ScrollController scrollController;
// Pangea#
final Color? avatarPresenceBackgroundColor;
@ -69,7 +68,6 @@ class Message extends StatelessWidget {
required this.immersionMode,
required this.definitions,
required this.controller,
required this.scrollController,
// Pangea#
super.key,
});
@ -321,10 +319,9 @@ class Message extends StatelessWidget {
// #Pangea
onTap: () => toolbarController?.showToolbar(
context,
scrollController,
),
onDoubleTap: () => toolbarController
?.showToolbar(context, scrollController),
onDoubleTap: () =>
toolbarController?.showToolbar(context),
// Pangea#
onLongPress: longPressSelect
? null
@ -447,8 +444,6 @@ class Message extends StatelessWidget {
immersionMode: immersionMode,
toolbarController:
toolbarController,
scrollController:
scrollController,
// Pangea#
),
if (event.hasAggregatedEvents(
@ -595,8 +590,8 @@ class Message extends StatelessWidget {
children: [
if (pangeaMessageEvent?.showMessageButtons ?? false)
MessageButtons(
toolbarController: toolbarController,
scrollController: scrollController),
toolbarController: toolbarController,
),
MessageReactions(event, timeline),
],
),

View file

@ -39,7 +39,6 @@ class MessageContent extends StatelessWidget {
final bool immersionMode;
final ToolbarDisplayController? toolbarController;
final bool isOverlay;
final ScrollController scrollController;
// Pangea#
const MessageContent(
@ -53,7 +52,6 @@ class MessageContent extends StatelessWidget {
required this.immersionMode,
required this.toolbarController,
this.isOverlay = false,
required this.scrollController,
// Pangea#
required this.borderRadius,
});
@ -301,7 +299,6 @@ class MessageContent extends StatelessWidget {
style: messageTextStyle,
pangeaMessageEvent: pangeaMessageEvent!,
immersionMode: immersionMode,
scrollController: scrollController,
toolbarController: toolbarController,
);
} else if (pangeaMessageEvent != null) {
@ -325,8 +322,7 @@ class MessageContent extends StatelessWidget {
toolbarController?.toolbar?.textSelection
.onTextSelection(selection);
},
onTap: () =>
toolbarController?.showToolbar(context, scrollController),
onTap: () => toolbarController?.showToolbar(context),
contextMenuBuilder: (context, state) =>
(toolbarController?.highlighted ?? false)
? const SizedBox.shrink()
@ -335,12 +331,10 @@ class MessageContent extends StatelessWidget {
textSelection: state,
onDefine: () => toolbarController?.showToolbar(
context,
scrollController,
mode: MessageMode.definition,
),
onListen: () => toolbarController?.showToolbar(
context,
scrollController,
mode: MessageMode.textToSpeech,
),
),

View file

@ -4,18 +4,15 @@ import 'package:flutter/material.dart';
class MessageButtons extends StatelessWidget {
final ToolbarDisplayController? toolbarController;
final ScrollController scrollController;
const MessageButtons({
super.key,
required this.scrollController,
this.toolbarController,
});
void showActivity(BuildContext context) {
toolbarController?.showToolbar(
context,
scrollController,
mode: MessageMode.practiceActivity,
);
}

View file

@ -59,8 +59,7 @@ class ToolbarDisplayController {
}
void showToolbar(
BuildContext context,
ScrollController scrollController, {
BuildContext context, {
MessageMode? mode,
}) {
bool toolbarUp = true;
@ -82,46 +81,49 @@ class ToolbarDisplayController {
final Size transformTargetSize = (targetRenderBox as RenderBox).size;
messageWidth = transformTargetSize.width;
final Offset targetOffset = (targetRenderBox).localToGlobal(Offset.zero);
// final double screenHeight = MediaQuery.of(context).size.height;
// If message is too close to top, make space for toolbar
// If there is enough space above, procede as normal
// Else if there is enough space below, show toolbar underneath
if (targetOffset.dy < 320) {
// If chat can scroll up, do so
var scrollTo = scrollController.offset - targetOffset.dy + 320;
if (scrollTo >= scrollController.position.minScrollExtent &&
scrollTo <= scrollController.position.maxScrollExtent) {
scrollController.animateTo(
scrollTo,
final spaceBeneath = MediaQuery.of(context).size.height -
(targetOffset.dy + transformTargetSize.height);
if (spaceBeneath >= 320) {
toolbarUp = false;
}
// See if it's possible to scroll up to make space
else if (controller.scrollController.offset - targetOffset.dy + 320 >=
controller.scrollController.position.minScrollExtent &&
controller.scrollController.offset - targetOffset.dy + 320 <=
controller.scrollController.position.maxScrollExtent) {
controller.scrollController.animateTo(
controller.scrollController.offset - targetOffset.dy + 320,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
);
}
// If cannot scroll up enough, show toolbar underneath instead
else {
// See if it's possible to scroll down to make space
else if (controller.scrollController.offset + spaceBeneath - 320 >=
controller.scrollController.position.minScrollExtent &&
controller.scrollController.offset + spaceBeneath - 320 <=
controller.scrollController.position.maxScrollExtent) {
controller.scrollController.animateTo(
controller.scrollController.offset + spaceBeneath - 320,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
);
toolbarUp = false;
// Scroll down if need more space beneath message
final spaceBeneath = MediaQuery.of(context).size.height -
targetOffset.dy -
transformTargetSize.height;
if (spaceBeneath < 320) {
scrollTo = scrollController.offset + spaceBeneath - 320;
if (scrollTo >= scrollController.position.minScrollExtent &&
scrollTo <= scrollController.position.maxScrollExtent) {
scrollController.animateTo(
scrollTo,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
);
}
// If can't scroll down enough, scroll up as much as possible and show toolbar above
else {
scrollController.animateTo(
scrollController.position.minScrollExtent,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
);
toolbarUp = true;
}
}
}
// If message is too big and can't scroll either way
// Scroll up as much as possible, and show toolbar above
else {
controller.scrollController.animateTo(
controller.scrollController.position.minScrollExtent,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
);
}
}
}
@ -132,7 +134,6 @@ class ToolbarDisplayController {
immersionMode: immersionMode,
ownMessage: pangeaMessageEvent.ownMessage,
toolbarController: this,
scrollController: scrollController,
width: messageWidth,
nextEvent: nextEvent,
previousEvent: previousEvent,

View file

@ -21,7 +21,6 @@ class OverlayMessage extends StatelessWidget {
final bool ownMessage;
final ToolbarDisplayController toolbarController;
final double? width;
final ScrollController scrollController;
const OverlayMessage(
this.event, {
@ -32,7 +31,6 @@ class OverlayMessage extends StatelessWidget {
required this.immersionMode,
required this.ownMessage,
required this.toolbarController,
required this.scrollController,
this.width,
super.key,
});
@ -153,7 +151,6 @@ class OverlayMessage extends StatelessWidget {
pangeaMessageEvent: pangeaMessageEvent,
immersionMode: immersionMode,
toolbarController: toolbarController,
scrollController: scrollController,
isOverlay: true,
),
if (event.hasAggregatedEvents(

View file

@ -21,14 +21,12 @@ class PangeaRichText extends StatefulWidget {
final bool immersionMode;
final ToolbarDisplayController? toolbarController;
final TextStyle? style;
final ScrollController scrollController;
const PangeaRichText({
super.key,
required this.pangeaMessageEvent,
required this.immersionMode,
required this.toolbarController,
required this.scrollController,
this.style,
});
@ -153,8 +151,7 @@ class PangeaRichTextState extends State<PangeaRichText> {
widget.toolbarController?.toolbar?.textSelection
.onTextSelection(selection);
},
onTap: () => widget.toolbarController
?.showToolbar(context, widget.scrollController),
onTap: () => widget.toolbarController?.showToolbar(context),
enableInteractiveSelection:
widget.toolbarController?.highlighted ?? false,
contextMenuBuilder: (context, state) =>
@ -165,12 +162,10 @@ class PangeaRichTextState extends State<PangeaRichText> {
textSelection: state,
onDefine: () => widget.toolbarController?.showToolbar(
context,
widget.scrollController,
mode: MessageMode.definition,
),
onListen: () => widget.toolbarController?.showToolbar(
context,
widget.scrollController,
mode: MessageMode.textToSpeech,
),
),