diff --git a/lib/helpers/link_handler.dart b/lib/helpers/link_handler.dart index c2eae294..b1c97855 100644 --- a/lib/helpers/link_handler.dart +++ b/lib/helpers/link_handler.dart @@ -20,6 +20,7 @@ class LinkHandler { required String text, required TextStyle style, TextStyle? linkStyle, + VoidCallback? onSecondaryTap, }) { final effectiveLinkStyle = linkStyle ?? defaultLinkStyle(context, style); const options = LinkifyOptions(humanize: false, defaultToHttps: false); @@ -27,7 +28,7 @@ class LinkHandler { void onOpen(LinkableElement link) => handleLinkTap(context, link.url); if (PlatformInfo.isDesktop) { - return SelectableLinkify( + final linkify = SelectableLinkify( text: text, style: style, linkStyle: effectiveLinkStyle, @@ -35,6 +36,14 @@ class LinkHandler { linkifiers: linkifiers, onOpen: onOpen, ); + if (onSecondaryTap == null) return linkify; + return Listener( + onPointerDown: (event) { + if (event.buttons == 2) onSecondaryTap(); + }, + behavior: HitTestBehavior.translucent, + child: linkify, + ); } return Linkify( text: text, diff --git a/lib/screens/channel_chat_screen.dart b/lib/screens/channel_chat_screen.dart index 94101ef3..7722c069 100644 --- a/lib/screens/channel_chat_screen.dart +++ b/lib/screens/channel_chat_screen.dart @@ -646,6 +646,9 @@ class _ChannelChatScreenState extends State { fontStyle: FontStyle.italic, color: textColor.withValues(alpha: 0.72), ), + onSecondaryTap: PlatformInfo.isDesktop + ? () => _showMessageActions(message) + : null, ), ), ], diff --git a/lib/screens/chat_screen.dart b/lib/screens/chat_screen.dart index 5bdd0fdc..7eca042b 100644 --- a/lib/screens/chat_screen.dart +++ b/lib/screens/chat_screen.dart @@ -1435,6 +1435,9 @@ class _MessageBubble extends StatelessWidget { color: textColor.withValues(alpha: 0.72), fontSize: bodyFontSize * textScale, ), + onSecondaryTap: PlatformInfo.isDesktop + ? onLongPress + : null, ), ), ], diff --git a/lib/widgets/translated_message_content.dart b/lib/widgets/translated_message_content.dart index 3495897d..a40bacf8 100644 --- a/lib/widgets/translated_message_content.dart +++ b/lib/widgets/translated_message_content.dart @@ -8,6 +8,7 @@ class TranslatedMessageContent extends StatelessWidget { final TextStyle style; final TextStyle? originalStyle; final bool showOriginalFirst; + final VoidCallback? onSecondaryTap; const TranslatedMessageContent({ super.key, @@ -16,6 +17,7 @@ class TranslatedMessageContent extends StatelessWidget { this.originalText, this.originalStyle, this.showOriginalFirst = true, + this.onSecondaryTap, }); @override @@ -36,12 +38,14 @@ class TranslatedMessageContent extends StatelessWidget { fontStyle: FontStyle.italic, fontSize: style.fontSize, ), + onSecondaryTap: onSecondaryTap, ) : null; final translatedWidget = LinkHandler.buildLinkifyText( context: context, text: trimmedDisplay, style: style, + onSecondaryTap: onSecondaryTap, ); if (!shouldShowOriginal) {