Merge branch 'main' into prevent-empty-chats

pull/1183/head
ggurdin 2 years ago
commit 46aca69e8b

@ -38,6 +38,7 @@ class MessageContent extends StatelessWidget {
//further down in the chain is also using pangeaController so its not constant //further down in the chain is also using pangeaController so its not constant
final bool immersionMode; final bool immersionMode;
final ToolbarDisplayController? toolbarController; final ToolbarDisplayController? toolbarController;
final bool isOverlay;
// Pangea# // Pangea#
const MessageContent( const MessageContent(
@ -50,6 +51,7 @@ class MessageContent extends StatelessWidget {
this.pangeaMessageEvent, this.pangeaMessageEvent,
required this.immersionMode, required this.immersionMode,
required this.toolbarController, required this.toolbarController,
this.isOverlay = false,
// Pangea# // Pangea#
required this.borderRadius, required this.borderRadius,
}); });
@ -203,7 +205,8 @@ class MessageContent extends StatelessWidget {
&& &&
!(pangeaMessageEvent?.showRichText( !(pangeaMessageEvent?.showRichText(
selected, selected,
toolbarController?.highlighted ?? false, isOverlay: isOverlay,
highlighted: toolbarController?.highlighted ?? false,
) ?? ) ??
false) false)
// Pangea# // Pangea#
@ -305,7 +308,8 @@ class MessageContent extends StatelessWidget {
); );
if (pangeaMessageEvent?.showRichText( if (pangeaMessageEvent?.showRichText(
selected, selected,
toolbarController?.highlighted ?? false, isOverlay: isOverlay,
highlighted: toolbarController?.highlighted ?? false,
) ?? ) ??
false) { false) {
return PangeaRichText( return PangeaRichText(

@ -80,18 +80,26 @@ class PangeaMessageEvent {
return _latestEdit; return _latestEdit;
} }
bool showRichText(bool selected, bool highlighted) { bool showRichText(
bool selected, {
bool highlighted = false,
bool isOverlay = false,
}) {
if (!_isValidPangeaMessageEvent) { if (!_isValidPangeaMessageEvent) {
return false; return false;
} }
// if (URLFinder.getMatches(event.body).isNotEmpty) {
// return false;
// }
if ([EventStatus.error, EventStatus.sending].contains(_event.status)) { if ([EventStatus.error, EventStatus.sending].contains(_event.status)) {
return false; return false;
} }
if (ownMessage && !selected && !highlighted) return false;
if (isOverlay) return true;
// if ownMessage, don't show rich text if not selected or highlighted
// and don't show is the message is not an overlay
if (ownMessage && ((!selected && !highlighted) || !isOverlay)) {
return false;
}
return true; return true;
} }

@ -1,9 +1,8 @@
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart';
import 'package:fluffychat/pangea/widgets/igc/word_data_card.dart'; import 'package:fluffychat/pangea/widgets/igc/word_data_card.dart';
import 'package:flutter/foundation.dart';
class WordData { class WordData {
final String word; final String word;
@ -102,10 +101,11 @@ class WordData {
}) => }) =>
word == w && userL1 == l1 && userL2 == l2 && fullText == f; word == w && userL1 == l1 && userL2 == l2 && fullText == f;
String formattedPartOfSpeech(LanguageType languageType) { String? formattedPartOfSpeech(LanguageType languageType) {
final String pos = languageType == LanguageType.base final String pos = languageType == LanguageType.base
? basePartOfSpeech ? basePartOfSpeech
: targetPartOfSpeech; : targetPartOfSpeech;
if (pos.isEmpty) return null;
return pos[0].toUpperCase() + pos.substring(1); return pos[0].toUpperCase() + pos.substring(1);
} }

@ -134,8 +134,11 @@ class ToolbarDisplayController {
}); });
} }
bool get highlighted => bool get highlighted {
MatrixState.pAnyState.overlay.hashCode.toString() == overlayId; if (overlayId == null) return false;
if (MatrixState.pAnyState.overlay == null) overlayId = null;
return MatrixState.pAnyState.overlay.hashCode.toString() == overlayId;
}
} }
class MessageToolbar extends StatefulWidget { class MessageToolbar extends StatefulWidget {

@ -141,6 +141,7 @@ class OverlayMessage extends StatelessWidget {
pangeaMessageEvent: pangeaMessageEvent, pangeaMessageEvent: pangeaMessageEvent,
immersionMode: immersionMode, immersionMode: immersionMode,
toolbarController: toolbarController, toolbarController: toolbarController,
isOverlay: true,
), ),
if (event.hasAggregatedEvents( if (event.hasAggregatedEvents(
timeline, timeline,

@ -48,28 +48,33 @@ class PangeaRichTextState extends State<PangeaRichText> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
updateTextSpan(); setTextSpan();
}
void updateTextSpan() {
setState(() {
textSpan = getTextSpan();
});
} }
@override @override
void didUpdateWidget(PangeaRichText oldWidget) { void didUpdateWidget(PangeaRichText oldWidget) {
super.didUpdateWidget(oldWidget); super.didUpdateWidget(oldWidget);
updateTextSpan(); setTextSpan();
}
void _setTextSpan(String newTextSpan) {
widget.toolbarController?.toolbar?.textSelection.setMessageText(
newTextSpan,
);
setState(() {
textSpan = newTextSpan;
});
} }
String getTextSpan() { void setTextSpan() {
if (_fetchingRepresentation == true) { if (_fetchingRepresentation == true) {
return widget.pangeaMessageEvent.body; _setTextSpan(textSpan = widget.pangeaMessageEvent.body);
return;
} }
if (repEvent != null) { if (repEvent != null) {
return repEvent!.text; _setTextSpan(repEvent!.text);
return;
} }
if (widget.pangeaMessageEvent.eventId.contains("webdebug")) { if (widget.pangeaMessageEvent.eventId.contains("webdebug")) {
@ -84,7 +89,6 @@ class PangeaRichTextState extends State<PangeaRichText> {
if (repEvent == null) { if (repEvent == null) {
setState(() => _fetchingRepresentation = true); setState(() => _fetchingRepresentation = true);
widget.pangeaMessageEvent widget.pangeaMessageEvent
.representationByLanguageGlobal( .representationByLanguageGlobal(
langCode: widget.pangeaMessageEvent.messageDisplayLangCode, langCode: widget.pangeaMessageEvent.messageDisplayLangCode,
@ -95,23 +99,17 @@ class PangeaRichTextState extends State<PangeaRichText> {
) )
.then((event) { .then((event) {
repEvent = event; repEvent = event;
widget.toolbarController?.toolbar?.textSelection.setMessageText( _setTextSpan(repEvent?.text ?? widget.pangeaMessageEvent.body);
repEvent?.text ?? widget.pangeaMessageEvent.body,
);
}).whenComplete(() { }).whenComplete(() {
if (mounted) { if (mounted) {
setState(() => _fetchingRepresentation = false); setState(() => _fetchingRepresentation = false);
} }
}); });
return widget.pangeaMessageEvent.body;
_setTextSpan(widget.pangeaMessageEvent.body);
} else { } else {
widget.toolbarController?.toolbar?.textSelection.setMessageText( _setTextSpan(repEvent!.text);
repEvent!.text,
);
setState(() {});
} }
return repEvent!.text;
} }
@override @override
@ -190,7 +188,10 @@ class PangeaRichTextState extends State<PangeaRichText> {
return blur > 0 return blur > 0
? ImageFiltered( ? ImageFiltered(
imageFilter: ImageFilter.blur(sigmaX: blur, sigmaY: blur), imageFilter: ImageFilter.blur(
sigmaX: blur,
sigmaY: blur,
),
child: richText, child: richText,
) )
: richText; : richText;

@ -314,6 +314,23 @@ class PartOfSpeechBlock extends StatelessWidget {
required this.languageType, required this.languageType,
}); });
String get exampleSentence => languageType == LanguageType.target
? wordData.targetExampleSentence
: wordData.baseExampleSentence;
String get definition => languageType == LanguageType.target
? wordData.targetDefinition
: wordData.baseDefinition;
String formattedTitle(BuildContext context) {
final String word = languageType == LanguageType.target
? wordData.targetWord
: wordData.baseWord;
String? pos = wordData.formattedPartOfSpeech(languageType);
if (pos == null || pos.isEmpty) pos = L10n.of(context)!.unkDisplayName;
return "$word (${wordData.formattedPartOfSpeech(languageType)})";
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
@ -324,9 +341,7 @@ class PartOfSpeechBlock extends StatelessWidget {
Align( Align(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Text( child: Text(
languageType == LanguageType.target formattedTitle(context),
? "${wordData.targetWord} (${wordData.formattedPartOfSpeech(languageType)})"
: "${wordData.baseWord} (${wordData.formattedPartOfSpeech(languageType)})",
style: BotStyle.text(context, italics: true, bold: false), style: BotStyle.text(context, italics: true, bold: false),
), ),
), ),
@ -337,6 +352,7 @@ class PartOfSpeechBlock extends StatelessWidget {
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Column( child: Column(
children: [ children: [
if (definition.isNotEmpty)
RichText( RichText(
text: TextSpan( text: TextSpan(
style: BotStyle.text( style: BotStyle.text(
@ -349,15 +365,12 @@ class PartOfSpeechBlock extends StatelessWidget {
text: "${L10n.of(context)!.definition}: ", text: "${L10n.of(context)!.definition}: ",
style: const TextStyle(fontWeight: FontWeight.bold), style: const TextStyle(fontWeight: FontWeight.bold),
), ),
TextSpan( TextSpan(text: definition),
text: languageType == LanguageType.target
? wordData.targetDefinition
: wordData.baseDefinition,
),
], ],
), ),
), ),
const SizedBox(height: 10), const SizedBox(height: 10),
if (exampleSentence.isNotEmpty)
RichText( RichText(
text: TextSpan( text: TextSpan(
style: BotStyle.text( style: BotStyle.text(
@ -368,13 +381,11 @@ class PartOfSpeechBlock extends StatelessWidget {
children: <TextSpan>[ children: <TextSpan>[
TextSpan( TextSpan(
text: "${L10n.of(context)!.exampleSentence}: ", text: "${L10n.of(context)!.exampleSentence}: ",
style: const TextStyle(fontWeight: FontWeight.bold), style: const TextStyle(
fontWeight: FontWeight.bold,
), ),
TextSpan(
text: languageType == LanguageType.target
? wordData.targetExampleSentence
: wordData.baseExampleSentence,
), ),
TextSpan(text: exampleSentence),
], ],
), ),
), ),

Loading…
Cancel
Save