import 'package:fl_clash/enum/enum.dart'; import 'package:flutter/material.dart'; import 'package:emoji_regex/emoji_regex.dart'; import '../state.dart'; class TooltipText extends StatelessWidget { final Text text; const TooltipText({ super.key, required this.text, }); @override Widget build(BuildContext context) { return LayoutBuilder( builder: (context, container) { final maxWidth = container.maxWidth; final size = globalState.measure.computeTextSize( text, ); if (maxWidth < size.width) { return Tooltip( preferBelow: false, message: text.data, child: text, ); } return text; }, ); } } class EmojiText extends StatelessWidget { final String text; final TextStyle? style; final int? maxLines; final TextOverflow? overflow; const EmojiText( this.text, { super.key, this.maxLines, this.overflow, this.style, }); List _buildTextSpans(String emojis) { final List spans = []; final matches = emojiRegex().allMatches(text); int lastMatchEnd = 0; for (final match in matches) { if (match.start > lastMatchEnd) { spans.add( TextSpan( text: text.substring(lastMatchEnd, match.start), style: style), ); } spans.add( TextSpan( text: match.group(0), style: style?.copyWith( fontFamily: FontFamily.twEmoji.value, ), ), ); lastMatchEnd = match.end; } if (lastMatchEnd < text.length) { spans.add( TextSpan( text: text.substring(lastMatchEnd), style: style, ), ); } return spans; } @override Widget build(BuildContext context) { return RichText( maxLines: maxLines, overflow: overflow ?? TextOverflow.clip, text: TextSpan( children: _buildTextSpans(text), ), ); } }