position message overlay directly over the underlying message
This commit is contained in:
parent
ea6d8f355c
commit
2e139be658
7 changed files with 78 additions and 27 deletions
|
|
@ -1588,6 +1588,8 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
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<ChatPageWithRoom>
|
|||
event: pangeaMessageEvent.event,
|
||||
pangeaMessageEvent: pangeaMessageEvent,
|
||||
textSelection: textSelection,
|
||||
nextEvent: nextEvent,
|
||||
prevEvent: prevEvent,
|
||||
);
|
||||
} catch (err) {
|
||||
debugger(when: kDebugMode);
|
||||
|
|
|
|||
|
|
@ -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#
|
||||
|
|
|
|||
|
|
@ -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: <Widget>[
|
||||
// #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,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<MessageToolbar> {
|
|||
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,
|
||||
|
|
|
|||
|
|
@ -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<PangeaRichText> {
|
|||
isOverlay: widget.isOverlay,
|
||||
pangeaMessageEvent: widget.pangeaMessageEvent,
|
||||
controller: widget.controller,
|
||||
nextEvent: widget.nextEvent,
|
||||
prevEvent: widget.prevEvent,
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
text: textSpan,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue