From 2e139be658c5e7e148503c964d75b4a84d3e45c7 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Wed, 11 Sep 2024 12:13:39 -0400 Subject: [PATCH] position message overlay directly over the underlying message --- lib/pages/chat/chat.dart | 4 ++ lib/pages/chat/events/html_message.dart | 10 ++++- lib/pages/chat/events/message.dart | 46 ++++++++++++-------- lib/pages/chat/events/message_content.dart | 10 ++++- lib/pangea/widgets/chat/message_buttons.dart | 7 +++ lib/pangea/widgets/chat/message_toolbar.dart | 21 ++++++--- lib/pangea/widgets/igc/pangea_rich_text.dart | 7 +++ 7 files changed, 78 insertions(+), 27 deletions(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 5cee67baf..3370910e7 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -1588,6 +1588,8 @@ class ChatController extends State void showToolbar( PangeaMessageEvent pangeaMessageEvent, { MessageMode? mode, + Event? nextEvent, + Event? prevEvent, }) { // Close keyboard, if open if (inputFocus.hasFocus && PlatformInfos.isMobile) { @@ -1610,6 +1612,8 @@ class ChatController extends State event: pangeaMessageEvent.event, pangeaMessageEvent: pangeaMessageEvent, textSelection: textSelection, + nextEvent: nextEvent, + prevEvent: prevEvent, ); } catch (err) { debugger(when: kDebugMode); diff --git a/lib/pages/chat/events/html_message.dart b/lib/pages/chat/events/html_message.dart index 803869a75..4bdb0fe35 100644 --- a/lib/pages/chat/events/html_message.dart +++ b/lib/pages/chat/events/html_message.dart @@ -25,6 +25,8 @@ class HtmlMessage extends StatelessWidget { final bool isOverlay; final PangeaMessageEvent? pangeaMessageEvent; final ChatController controller; + final Event? nextEvent; + final Event? prevEvent; // Pangea# const HtmlMessage({ @@ -36,6 +38,8 @@ class HtmlMessage extends StatelessWidget { required this.isOverlay, this.pangeaMessageEvent, required this.controller, + this.nextEvent, + this.prevEvent, // Pangea# }); @@ -99,7 +103,11 @@ class HtmlMessage extends StatelessWidget { child: GestureDetector( onTap: () { if (pangeaMessageEvent != null && !isOverlay) { - controller.showToolbar(pangeaMessageEvent!); + controller.showToolbar( + pangeaMessageEvent!, + nextEvent: nextEvent, + prevEvent: prevEvent, + ); } }, // Pangea# diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index b39f907ee..4c009e3f4 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -71,7 +71,11 @@ class Message extends StatelessWidget { // #Pangea void showToolbar(PangeaMessageEvent? pangeaMessageEvent) { if (pangeaMessageEvent != null && !isOverlay) { - controller.showToolbar(pangeaMessageEvent); + controller.showToolbar( + pangeaMessageEvent, + nextEvent: nextEvent, + prevEvent: previousEvent, + ); } } // Pangea# @@ -445,12 +449,13 @@ class Message extends StatelessWidget { onInfoTab: onInfoTab, borderRadius: borderRadius, // #Pangea - selected: selected, pangeaMessageEvent: pangeaMessageEvent, immersionMode: immersionMode, isOverlay: isOverlay, controller: controller, + nextEvent: nextEvent, + prevEvent: previousEvent, // Pangea# ), if (event.hasAggregatedEvents( @@ -535,21 +540,18 @@ class Message extends StatelessWidget { event.hasAggregatedEvents(timeline, RelationshipTypes.reaction); // #Pangea // if (showReceiptsRow || displayTime || selected || displayReadMarker) { - if (showReceiptsRow || - displayTime || - selected || - displayReadMarker || - (pangeaMessageEvent?.showMessageButtons ?? false)) { + if (!isOverlay && + (showReceiptsRow || + displayTime || + displayReadMarker || + (pangeaMessageEvent?.showMessageButtons ?? false))) { // Pangea# container = Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: ownMessage ? CrossAxisAlignment.end : CrossAxisAlignment.start, children: [ - // #Pangea - // if (displayTime || selected) - if ((displayTime || selected) && !isOverlay) - // Pangea# + if (displayTime || selected) Padding( padding: displayTime ? const EdgeInsets.symmetric(vertical: 8.0) @@ -581,8 +583,9 @@ class Message extends StatelessWidget { duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, // #Pangea - child: !showReceiptsRow && - !(pangeaMessageEvent?.showMessageButtons ?? false) + child: isOverlay || + (!showReceiptsRow && + !(pangeaMessageEvent?.showMessageButtons ?? false)) // child: !showReceiptsRow // Pangea# ? const SizedBox.shrink() @@ -602,11 +605,10 @@ class Message extends StatelessWidget { MessageButtons( controller: controller, pangeaMessageEvent: pangeaMessageEvent!, + nextEvent: nextEvent, + prevEvent: previousEvent, ), - // #Pangea - if (!isOverlay) - // Pangea# - MessageReactions(event, timeline), + MessageReactions(event, timeline), ], ), // child: MessageReactions(event, timeline), @@ -673,7 +675,15 @@ class Message extends StatelessWidget { left: 8.0, right: 8.0, top: nextEventSameSender ? 1.0 : 4.0, - bottom: previousEventSameSender ? 1.0 : 4.0, + bottom: + // #Pangea + isOverlay + ? 0 + : + // Pangea# + previousEventSameSender + ? 1.0 + : 4.0, ), child: container, ), diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index 92bde721b..f0057289d 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -30,7 +30,6 @@ class MessageContent extends StatelessWidget { final void Function(Event)? onInfoTab; final BorderRadius borderRadius; // #Pangea - final bool selected; final PangeaMessageEvent? pangeaMessageEvent; //question: are there any performance benefits to using booleans //here rather than passing the choreographer? pangea rich text, a widget @@ -38,6 +37,8 @@ class MessageContent extends StatelessWidget { final bool immersionMode; final bool isOverlay; final ChatController controller; + final Event? nextEvent; + final Event? prevEvent; // Pangea# const MessageContent( @@ -46,11 +47,12 @@ class MessageContent extends StatelessWidget { super.key, required this.textColor, // #Pangea - required this.selected, this.pangeaMessageEvent, required this.immersionMode, this.isOverlay = false, required this.controller, + this.nextEvent, + this.prevEvent, // Pangea# required this.borderRadius, }); @@ -209,6 +211,8 @@ class MessageContent extends StatelessWidget { isOverlay: isOverlay, controller: controller, pangeaMessageEvent: pangeaMessageEvent, + nextEvent: nextEvent, + prevEvent: prevEvent, // Pangea# ); } @@ -327,6 +331,8 @@ class MessageContent extends StatelessWidget { controller: controller, pangeaMessageEvent: pangeaMessageEvent, isOverlay: isOverlay, + nextEvent: nextEvent, + prevEvent: prevEvent, child: // Pangea# Linkify( diff --git a/lib/pangea/widgets/chat/message_buttons.dart b/lib/pangea/widgets/chat/message_buttons.dart index 43dbfc95a..528b11fb2 100644 --- a/lib/pangea/widgets/chat/message_buttons.dart +++ b/lib/pangea/widgets/chat/message_buttons.dart @@ -2,21 +2,28 @@ import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/pangea/enum/message_mode_enum.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class MessageButtons extends StatelessWidget { final ChatController controller; final PangeaMessageEvent pangeaMessageEvent; + final Event? nextEvent; + final Event? prevEvent; const MessageButtons({ super.key, required this.controller, required this.pangeaMessageEvent, + this.nextEvent, + this.prevEvent, }); void showActivity(BuildContext context) { controller.showToolbar( pangeaMessageEvent, mode: MessageMode.practiceActivity, + nextEvent: nextEvent, + prevEvent: prevEvent, ); } diff --git a/lib/pangea/widgets/chat/message_toolbar.dart b/lib/pangea/widgets/chat/message_toolbar.dart index 2cbfe63a3..021bbe20a 100644 --- a/lib/pangea/widgets/chat/message_toolbar.dart +++ b/lib/pangea/widgets/chat/message_toolbar.dart @@ -15,6 +15,7 @@ import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_ca import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; +import 'package:matrix/matrix.dart'; class MessageToolbar extends StatefulWidget { final MessageTextSelection textSelection; @@ -22,14 +23,11 @@ class MessageToolbar extends StatefulWidget { final ChatController controller; final MessageMode? initialMode; - final StreamController completeAnimationStream; - const MessageToolbar({ super.key, required this.textSelection, required this.pangeaMessageEvent, required this.controller, - required this.completeAnimationStream, this.initialMode, }); @@ -267,7 +265,6 @@ class MessageToolbarState extends State { child: AnimatedSize( duration: FluffyThemes.animationDuration, child: toolbarContent, - onEnd: () => widget.completeAnimationStream.add(null), ), ), ), @@ -284,12 +281,16 @@ class ToolbarSelectionArea extends StatelessWidget { final PangeaMessageEvent? pangeaMessageEvent; final bool isOverlay; final Widget child; + final Event? nextEvent; + final Event? prevEvent; const ToolbarSelectionArea({ required this.controller, this.pangeaMessageEvent, this.isOverlay = false, required this.child, + this.nextEvent, + this.prevEvent, super.key, }); @@ -302,12 +303,20 @@ class ToolbarSelectionArea extends StatelessWidget { child: GestureDetector( onTap: () { if (pangeaMessageEvent != null && !isOverlay) { - controller.showToolbar(pangeaMessageEvent!); + controller.showToolbar( + pangeaMessageEvent!, + nextEvent: nextEvent, + prevEvent: prevEvent, + ); } }, onLongPress: () { if (pangeaMessageEvent != null && !isOverlay) { - controller.showToolbar(pangeaMessageEvent!); + controller.showToolbar( + pangeaMessageEvent!, + nextEvent: nextEvent, + prevEvent: prevEvent, + ); } }, child: child, diff --git a/lib/pangea/widgets/igc/pangea_rich_text.dart b/lib/pangea/widgets/igc/pangea_rich_text.dart index 0115f2f6c..cdb102414 100644 --- a/lib/pangea/widgets/igc/pangea_rich_text.dart +++ b/lib/pangea/widgets/igc/pangea_rich_text.dart @@ -12,6 +12,7 @@ import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; import '../../models/pangea_match_model.dart'; @@ -21,6 +22,8 @@ class PangeaRichText extends StatefulWidget { final TextStyle? style; final bool isOverlay; final ChatController controller; + final Event? nextEvent; + final Event? prevEvent; const PangeaRichText({ super.key, @@ -28,6 +31,8 @@ class PangeaRichText extends StatefulWidget { required this.immersionMode, required this.isOverlay, required this.controller, + this.nextEvent, + this.prevEvent, this.style, }); @@ -139,6 +144,8 @@ class PangeaRichTextState extends State { isOverlay: widget.isOverlay, pangeaMessageEvent: widget.pangeaMessageEvent, controller: widget.controller, + nextEvent: widget.nextEvent, + prevEvent: widget.prevEvent, child: RichText( text: TextSpan( text: textSpan,