You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
fluffychat/lib/pangea/widgets/igc/pangea_rich_text.dart

143 lines
4.3 KiB
Dart

2 years ago
import 'dart:ui';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/constants/language_keys.dart';
import 'package:fluffychat/pangea/controllers/pangea_controller.dart';
import 'package:fluffychat/pangea/models/pangea_message_event.dart';
2 years ago
import 'package:fluffychat/pangea/models/pangea_representation_event.dart';
2 years ago
import 'package:fluffychat/pangea/utils/error_handler.dart';
2 years ago
import 'package:fluffychat/pangea/widgets/chat/message_context_menu.dart';
import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart';
2 years ago
import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/material.dart';
2 years ago
import '../../models/pangea_match_model.dart';
class PangeaRichText extends StatefulWidget {
final PangeaMessageEvent pangeaMessageEvent;
final bool immersionMode;
2 years ago
final ToolbarDisplayController toolbarController;
final TextStyle? style;
2 years ago
const PangeaRichText({
2 years ago
super.key,
2 years ago
required this.pangeaMessageEvent,
required this.immersionMode,
2 years ago
required this.toolbarController,
this.style,
2 years ago
});
2 years ago
@override
PangeaRichTextState createState() => PangeaRichTextState();
}
class PangeaRichTextState extends State<PangeaRichText> {
final PangeaController pangeaController = MatrixState.pangeaController;
2 years ago
RepresentationEvent? repEvent;
2 years ago
bool _fetchingRepresentation = false;
double get blur => _fetchingRepresentation && widget.immersionMode ? 5 : 0;
2 years ago
@override
void initState() {
super.initState();
2 years ago
setTextSpan();
}
2 years ago
Future<void> setTextSpan() async {
setState(() => _fetchingRepresentation = true);
try {
await widget.pangeaMessageEvent.getDisplayRepresentation(context);
} catch (err) {
ErrorHandler.logError(e: err);
}
setState(() => _fetchingRepresentation = false);
2 years ago
widget.toolbarController.toolbar?.textSelection.setMessageText(
widget.pangeaMessageEvent.displayMessageText,
);
2 years ago
}
@override
Widget build(BuildContext context) {
//TODO - take out of build function of every message
2 years ago
final Widget richText = SelectableText.rich(
onSelectionChanged: (selection, cause) => widget
.toolbarController.toolbar?.textSelection
.onTextSelection(selection),
onTap: () => widget.toolbarController.showToolbar(context),
focusNode: widget.toolbarController.focusNode,
contextMenuBuilder: (context, state) =>
MessageContextMenu.contextMenuOverride(
context: context,
textSelection: state,
onDefine: () => widget.toolbarController.showToolbar(
context,
mode: MessageMode.definition,
),
onListen: () => widget.toolbarController.showToolbar(
context,
mode: MessageMode.play,
),
),
TextSpan(
text: widget.pangeaMessageEvent.displayMessageText,
style: widget.style,
children: [
if (_fetchingRepresentation)
const WidgetSpan(
child: Padding(
padding: EdgeInsets.only(left: 5.0),
child: SizedBox(
height: 14,
width: 14,
child: CircularProgressIndicator(
strokeWidth: 2.0,
color: AppConfig.secondaryColor,
),
2 years ago
),
),
2 years ago
),
2 years ago
],
),
);
2 years ago
return blur > 0
? ImageFiltered(
imageFilter: ImageFilter.blur(sigmaX: blur, sigmaY: blur),
child: richText,
)
: richText;
}
bool get areLanguagesSet =>
userL2LangCode != null && userL2LangCode != LanguageKeys.unknownLanguage;
String? get userL2LangCode =>
pangeaController.languageController.activeL2Code(
roomID: widget.pangeaMessageEvent.room.id,
);
String? get userL1LangCode =>
pangeaController.languageController.activeL1Code(
roomID: widget.pangeaMessageEvent.room.id,
);
Future<void> onIgnore() async {
debugPrint("PTODO implement onIgnore");
}
Future<void> onITStart() async {
debugPrint("PTODO implement onITStart");
}
Future<void> onReplacementSelect(
PangeaMatch pangeaMatch,
String replacement,
) async {
2 years ago
debugPrint("PTODO implement onReplacementSelect");
}
Future<void> onSentenceRewrite(String sentenceRewrite) async {
debugPrint("PTODO implement onSentenceRewrite");
}
}