position message overlay directly over the underlying message

pull/1384/head
ggurdin 1 year ago
parent ea6d8f355c
commit 2e139be658
No known key found for this signature in database
GPG Key ID: A01CB41737CBB478

@ -1588,6 +1588,8 @@ class ChatController extends State<ChatPageWithRoom>
void showToolbar( void showToolbar(
PangeaMessageEvent pangeaMessageEvent, { PangeaMessageEvent pangeaMessageEvent, {
MessageMode? mode, MessageMode? mode,
Event? nextEvent,
Event? prevEvent,
}) { }) {
// Close keyboard, if open // Close keyboard, if open
if (inputFocus.hasFocus && PlatformInfos.isMobile) { if (inputFocus.hasFocus && PlatformInfos.isMobile) {
@ -1610,6 +1612,8 @@ class ChatController extends State<ChatPageWithRoom>
event: pangeaMessageEvent.event, event: pangeaMessageEvent.event,
pangeaMessageEvent: pangeaMessageEvent, pangeaMessageEvent: pangeaMessageEvent,
textSelection: textSelection, textSelection: textSelection,
nextEvent: nextEvent,
prevEvent: prevEvent,
); );
} catch (err) { } catch (err) {
debugger(when: kDebugMode); debugger(when: kDebugMode);

@ -25,6 +25,8 @@ class HtmlMessage extends StatelessWidget {
final bool isOverlay; final bool isOverlay;
final PangeaMessageEvent? pangeaMessageEvent; final PangeaMessageEvent? pangeaMessageEvent;
final ChatController controller; final ChatController controller;
final Event? nextEvent;
final Event? prevEvent;
// Pangea# // Pangea#
const HtmlMessage({ const HtmlMessage({
@ -36,6 +38,8 @@ class HtmlMessage extends StatelessWidget {
required this.isOverlay, required this.isOverlay,
this.pangeaMessageEvent, this.pangeaMessageEvent,
required this.controller, required this.controller,
this.nextEvent,
this.prevEvent,
// Pangea# // Pangea#
}); });
@ -99,7 +103,11 @@ class HtmlMessage extends StatelessWidget {
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
if (pangeaMessageEvent != null && !isOverlay) { if (pangeaMessageEvent != null && !isOverlay) {
controller.showToolbar(pangeaMessageEvent!); controller.showToolbar(
pangeaMessageEvent!,
nextEvent: nextEvent,
prevEvent: prevEvent,
);
} }
}, },
// Pangea# // Pangea#

@ -71,7 +71,11 @@ class Message extends StatelessWidget {
// #Pangea // #Pangea
void showToolbar(PangeaMessageEvent? pangeaMessageEvent) { void showToolbar(PangeaMessageEvent? pangeaMessageEvent) {
if (pangeaMessageEvent != null && !isOverlay) { if (pangeaMessageEvent != null && !isOverlay) {
controller.showToolbar(pangeaMessageEvent); controller.showToolbar(
pangeaMessageEvent,
nextEvent: nextEvent,
prevEvent: previousEvent,
);
} }
} }
// Pangea# // Pangea#
@ -445,12 +449,13 @@ class Message extends StatelessWidget {
onInfoTab: onInfoTab, onInfoTab: onInfoTab,
borderRadius: borderRadius, borderRadius: borderRadius,
// #Pangea // #Pangea
selected: selected,
pangeaMessageEvent: pangeaMessageEvent:
pangeaMessageEvent, pangeaMessageEvent,
immersionMode: immersionMode, immersionMode: immersionMode,
isOverlay: isOverlay, isOverlay: isOverlay,
controller: controller, controller: controller,
nextEvent: nextEvent,
prevEvent: previousEvent,
// Pangea# // Pangea#
), ),
if (event.hasAggregatedEvents( if (event.hasAggregatedEvents(
@ -535,21 +540,18 @@ class Message extends StatelessWidget {
event.hasAggregatedEvents(timeline, RelationshipTypes.reaction); event.hasAggregatedEvents(timeline, RelationshipTypes.reaction);
// #Pangea // #Pangea
// if (showReceiptsRow || displayTime || selected || displayReadMarker) { // if (showReceiptsRow || displayTime || selected || displayReadMarker) {
if (showReceiptsRow || if (!isOverlay &&
displayTime || (showReceiptsRow ||
selected || displayTime ||
displayReadMarker || displayReadMarker ||
(pangeaMessageEvent?.showMessageButtons ?? false)) { (pangeaMessageEvent?.showMessageButtons ?? false))) {
// Pangea# // Pangea#
container = Column( container = Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: crossAxisAlignment:
ownMessage ? CrossAxisAlignment.end : CrossAxisAlignment.start, ownMessage ? CrossAxisAlignment.end : CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
// #Pangea if (displayTime || selected)
// if (displayTime || selected)
if ((displayTime || selected) && !isOverlay)
// Pangea#
Padding( Padding(
padding: displayTime padding: displayTime
? const EdgeInsets.symmetric(vertical: 8.0) ? const EdgeInsets.symmetric(vertical: 8.0)
@ -581,8 +583,9 @@ class Message extends StatelessWidget {
duration: FluffyThemes.animationDuration, duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve, curve: FluffyThemes.animationCurve,
// #Pangea // #Pangea
child: !showReceiptsRow && child: isOverlay ||
!(pangeaMessageEvent?.showMessageButtons ?? false) (!showReceiptsRow &&
!(pangeaMessageEvent?.showMessageButtons ?? false))
// child: !showReceiptsRow // child: !showReceiptsRow
// Pangea# // Pangea#
? const SizedBox.shrink() ? const SizedBox.shrink()
@ -602,11 +605,10 @@ class Message extends StatelessWidget {
MessageButtons( MessageButtons(
controller: controller, controller: controller,
pangeaMessageEvent: pangeaMessageEvent!, pangeaMessageEvent: pangeaMessageEvent!,
nextEvent: nextEvent,
prevEvent: previousEvent,
), ),
// #Pangea MessageReactions(event, timeline),
if (!isOverlay)
// Pangea#
MessageReactions(event, timeline),
], ],
), ),
// child: MessageReactions(event, timeline), // child: MessageReactions(event, timeline),
@ -673,7 +675,15 @@ class Message extends StatelessWidget {
left: 8.0, left: 8.0,
right: 8.0, right: 8.0,
top: nextEventSameSender ? 1.0 : 4.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, child: container,
), ),

@ -30,7 +30,6 @@ class MessageContent extends StatelessWidget {
final void Function(Event)? onInfoTab; final void Function(Event)? onInfoTab;
final BorderRadius borderRadius; final BorderRadius borderRadius;
// #Pangea // #Pangea
final bool selected;
final PangeaMessageEvent? pangeaMessageEvent; final PangeaMessageEvent? pangeaMessageEvent;
//question: are there any performance benefits to using booleans //question: are there any performance benefits to using booleans
//here rather than passing the choreographer? pangea rich text, a widget //here rather than passing the choreographer? pangea rich text, a widget
@ -38,6 +37,8 @@ class MessageContent extends StatelessWidget {
final bool immersionMode; final bool immersionMode;
final bool isOverlay; final bool isOverlay;
final ChatController controller; final ChatController controller;
final Event? nextEvent;
final Event? prevEvent;
// Pangea# // Pangea#
const MessageContent( const MessageContent(
@ -46,11 +47,12 @@ class MessageContent extends StatelessWidget {
super.key, super.key,
required this.textColor, required this.textColor,
// #Pangea // #Pangea
required this.selected,
this.pangeaMessageEvent, this.pangeaMessageEvent,
required this.immersionMode, required this.immersionMode,
this.isOverlay = false, this.isOverlay = false,
required this.controller, required this.controller,
this.nextEvent,
this.prevEvent,
// Pangea# // Pangea#
required this.borderRadius, required this.borderRadius,
}); });
@ -209,6 +211,8 @@ class MessageContent extends StatelessWidget {
isOverlay: isOverlay, isOverlay: isOverlay,
controller: controller, controller: controller,
pangeaMessageEvent: pangeaMessageEvent, pangeaMessageEvent: pangeaMessageEvent,
nextEvent: nextEvent,
prevEvent: prevEvent,
// Pangea# // Pangea#
); );
} }
@ -327,6 +331,8 @@ class MessageContent extends StatelessWidget {
controller: controller, controller: controller,
pangeaMessageEvent: pangeaMessageEvent, pangeaMessageEvent: pangeaMessageEvent,
isOverlay: isOverlay, isOverlay: isOverlay,
nextEvent: nextEvent,
prevEvent: prevEvent,
child: child:
// Pangea# // Pangea#
Linkify( Linkify(

@ -2,21 +2,28 @@ import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/pangea/enum/message_mode_enum.dart'; import 'package:fluffychat/pangea/enum/message_mode_enum.dart';
import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';
class MessageButtons extends StatelessWidget { class MessageButtons extends StatelessWidget {
final ChatController controller; final ChatController controller;
final PangeaMessageEvent pangeaMessageEvent; final PangeaMessageEvent pangeaMessageEvent;
final Event? nextEvent;
final Event? prevEvent;
const MessageButtons({ const MessageButtons({
super.key, super.key,
required this.controller, required this.controller,
required this.pangeaMessageEvent, required this.pangeaMessageEvent,
this.nextEvent,
this.prevEvent,
}); });
void showActivity(BuildContext context) { void showActivity(BuildContext context) {
controller.showToolbar( controller.showToolbar(
pangeaMessageEvent, pangeaMessageEvent,
mode: MessageMode.practiceActivity, mode: MessageMode.practiceActivity,
nextEvent: nextEvent,
prevEvent: prevEvent,
); );
} }

@ -15,6 +15,7 @@ import 'package:fluffychat/pangea/widgets/practice_activity/practice_activity_ca
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:matrix/matrix.dart';
class MessageToolbar extends StatefulWidget { class MessageToolbar extends StatefulWidget {
final MessageTextSelection textSelection; final MessageTextSelection textSelection;
@ -22,14 +23,11 @@ class MessageToolbar extends StatefulWidget {
final ChatController controller; final ChatController controller;
final MessageMode? initialMode; final MessageMode? initialMode;
final StreamController completeAnimationStream;
const MessageToolbar({ const MessageToolbar({
super.key, super.key,
required this.textSelection, required this.textSelection,
required this.pangeaMessageEvent, required this.pangeaMessageEvent,
required this.controller, required this.controller,
required this.completeAnimationStream,
this.initialMode, this.initialMode,
}); });
@ -267,7 +265,6 @@ class MessageToolbarState extends State<MessageToolbar> {
child: AnimatedSize( child: AnimatedSize(
duration: FluffyThemes.animationDuration, duration: FluffyThemes.animationDuration,
child: toolbarContent, child: toolbarContent,
onEnd: () => widget.completeAnimationStream.add(null),
), ),
), ),
), ),
@ -284,12 +281,16 @@ class ToolbarSelectionArea extends StatelessWidget {
final PangeaMessageEvent? pangeaMessageEvent; final PangeaMessageEvent? pangeaMessageEvent;
final bool isOverlay; final bool isOverlay;
final Widget child; final Widget child;
final Event? nextEvent;
final Event? prevEvent;
const ToolbarSelectionArea({ const ToolbarSelectionArea({
required this.controller, required this.controller,
this.pangeaMessageEvent, this.pangeaMessageEvent,
this.isOverlay = false, this.isOverlay = false,
required this.child, required this.child,
this.nextEvent,
this.prevEvent,
super.key, super.key,
}); });
@ -302,12 +303,20 @@ class ToolbarSelectionArea extends StatelessWidget {
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
if (pangeaMessageEvent != null && !isOverlay) { if (pangeaMessageEvent != null && !isOverlay) {
controller.showToolbar(pangeaMessageEvent!); controller.showToolbar(
pangeaMessageEvent!,
nextEvent: nextEvent,
prevEvent: prevEvent,
);
} }
}, },
onLongPress: () { onLongPress: () {
if (pangeaMessageEvent != null && !isOverlay) { if (pangeaMessageEvent != null && !isOverlay) {
controller.showToolbar(pangeaMessageEvent!); controller.showToolbar(
pangeaMessageEvent!,
nextEvent: nextEvent,
prevEvent: prevEvent,
);
} }
}, },
child: child, child: child,

@ -12,6 +12,7 @@ import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';
import '../../models/pangea_match_model.dart'; import '../../models/pangea_match_model.dart';
@ -21,6 +22,8 @@ class PangeaRichText extends StatefulWidget {
final TextStyle? style; final TextStyle? style;
final bool isOverlay; final bool isOverlay;
final ChatController controller; final ChatController controller;
final Event? nextEvent;
final Event? prevEvent;
const PangeaRichText({ const PangeaRichText({
super.key, super.key,
@ -28,6 +31,8 @@ class PangeaRichText extends StatefulWidget {
required this.immersionMode, required this.immersionMode,
required this.isOverlay, required this.isOverlay,
required this.controller, required this.controller,
this.nextEvent,
this.prevEvent,
this.style, this.style,
}); });
@ -139,6 +144,8 @@ class PangeaRichTextState extends State<PangeaRichText> {
isOverlay: widget.isOverlay, isOverlay: widget.isOverlay,
pangeaMessageEvent: widget.pangeaMessageEvent, pangeaMessageEvent: widget.pangeaMessageEvent,
controller: widget.controller, controller: widget.controller,
nextEvent: widget.nextEvent,
prevEvent: widget.prevEvent,
child: RichText( child: RichText(
text: TextSpan( text: TextSpan(
text: textSpan, text: textSpan,

Loading…
Cancel
Save