Get rid of scrollcontroller chain
This commit is contained in:
parent
e7167631d0
commit
19987c75a7
7 changed files with 44 additions and 66 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
],
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue