From 0c9be47e17bd51f56d936e2541f830beec3a2fae Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Fri, 10 Jun 2022 12:10:17 -0700 Subject: [PATCH] Click to scroll on Quoted Message / Shorten Text --- lib/models/contact.dart | 2 ++ lib/models/messages/quotedmessage.dart | 4 ---- lib/models/messages/textmessage.dart | 4 +++- lib/views/contactsview.dart | 5 +++-- lib/views/messageview.dart | 7 ++++++- lib/widgets/messagelist.dart | 4 ++-- lib/widgets/quotedmessage.dart | 27 ++++++++++++++++++-------- 7 files changed, 35 insertions(+), 18 deletions(-) diff --git a/lib/models/contact.dart b/lib/models/contact.dart index 8c7004cf..9006ff40 100644 --- a/lib/models/contact.dart +++ b/lib/models/contact.dart @@ -1,6 +1,7 @@ import 'package:cwtch/widgets/messagerow.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'message.dart'; import 'messagecache.dart'; @@ -44,6 +45,7 @@ class ContactInfoState extends ChangeNotifier { late Map> keys; int _newMarkerMsgIndex = -1; late MessageCache messageCache; + ItemScrollController messageScrollController = new ItemScrollController(); // todo: a nicer way to model contacts, groups and other "entities" late bool _isGroup; diff --git a/lib/models/messages/quotedmessage.dart b/lib/models/messages/quotedmessage.dart index 35cd21a9..3fefee0b 100644 --- a/lib/models/messages/quotedmessage.dart +++ b/lib/models/messages/quotedmessage.dart @@ -8,10 +8,6 @@ import 'package:cwtch/widgets/quotedmessage.dart'; import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; -import '../../main.dart'; -import '../messagecache.dart'; -import '../profile.dart'; - class QuotedMessageStructure { final String quotedHash; final String body; diff --git a/lib/models/messages/textmessage.dart b/lib/models/messages/textmessage.dart index cb160319..01a51048 100644 --- a/lib/models/messages/textmessage.dart +++ b/lib/models/messages/textmessage.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:cwtch/models/message.dart'; import 'package:cwtch/models/messages/malformedmessage.dart'; import 'package:cwtch/widgets/malformedbubble.dart'; @@ -19,7 +21,7 @@ class TextMessage extends Message { return ChangeNotifierProvider.value( value: this.metadata, builder: (bcontext, child) { - return SelectableText(this.content); + return Text(this.content.substring(0, min(this.content.length, 50))); }); } diff --git a/lib/views/contactsview.dart b/lib/views/contactsview.dart index 719336cd..4ceeb3ad 100644 --- a/lib/views/contactsview.dart +++ b/lib/views/contactsview.dart @@ -29,20 +29,21 @@ class ContactsView extends StatefulWidget { // selectConversation can be called from anywhere to set the active conversation void selectConversation(BuildContext context, int handle) { // requery instead of using contactinfostate directly because sometimes listview gets confused about data that resorts - var initialIndex = Provider.of(context, listen: false).contactList.getContact(handle)!.unreadMessages; var previouslySelected = Provider.of(context, listen: false).selectedConversation; if (previouslySelected != null) { Provider.of(context, listen: false).contactList.getContact(previouslySelected)!.unselected(); } Provider.of(context, listen: false).contactList.getContact(handle)!.selected(); // triggers update in Double/TripleColumnView - Provider.of(context, listen: false).initialScrollIndex = initialIndex; + var unread = Provider.of(context, listen: false).contactList.getContact(handle)!.unreadMessages; + Provider.of(context, listen: false).initialScrollIndex = unread; Provider.of(context, listen: false).selectedConversation = handle; Provider.of(context, listen: false).selectedIndex = null; Provider.of(context, listen: false).hoveredIndex = -1; // if in singlepane mode, push to the stack var isLandscape = Provider.of(context, listen: false).isLandscape(context); if (Provider.of(context, listen: false).uiColumns(isLandscape).length == 1) _pushMessageView(context, handle); + // Set last message seen time in backend Provider.of(context, listen: false) .cwtch diff --git a/lib/views/messageview.dart b/lib/views/messageview.dart index e1281651..2936d321 100644 --- a/lib/views/messageview.dart +++ b/lib/views/messageview.dart @@ -169,7 +169,12 @@ class _MessageViewState extends State { ]), actions: appBarButtons, ), - body: Padding(padding: EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 108.0), child: MessageList(scrollController, scrollListener)), + body: Padding( + padding: EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 108.0), + child: MessageList( + scrollController, + scrollListener, + )), bottomSheet: _buildComposeBox(), )); } diff --git a/lib/widgets/messagelist.dart b/lib/widgets/messagelist.dart index 6e5583e5..75cce760 100644 --- a/lib/widgets/messagelist.dart +++ b/lib/widgets/messagelist.dart @@ -30,8 +30,8 @@ class _MessageListState extends State { MessageCache? cache = Provider.of(outerContext, listen: false).contactList.getContact(conversationId)?.messageCache; ByIndex(0).loadUnsynced(Provider.of(context, listen: false).cwtch, Provider.of(outerContext, listen: false).selectedProfile!, conversationId, cache!); } - var initi = Provider.of(outerContext, listen: false).initialScrollIndex; + bool isP2P = !Provider.of(context).isGroup; bool isGroupAndSyncing = Provider.of(context).isGroup == true && Provider.of(context).status == "Authenticated"; bool isGroupAndSynced = Provider.of(context).isGroup && Provider.of(context).status == "Synced"; @@ -82,7 +82,7 @@ class _MessageListState extends State { child: loadMessages ? ScrollablePositionedList.builder( itemPositionsListener: widget.scrollListener, - itemScrollController: widget.scrollController, + itemScrollController: Provider.of(outerContext).messageScrollController, initialScrollIndex: initi > 4 ? initi - 4 : 0, itemCount: Provider.of(outerContext).totalMessages, reverse: true, // NOTE: There seems to be a bug in flutter that corrects the mouse wheel scroll, but not the drag direction... diff --git a/lib/widgets/quotedmessage.dart b/lib/widgets/quotedmessage.dart index 24010544..a29f9066 100644 --- a/lib/widgets/quotedmessage.dart +++ b/lib/widgets/quotedmessage.dart @@ -1,6 +1,8 @@ +import 'package:cwtch/models/appstate.dart'; import 'package:cwtch/models/contact.dart'; import 'package:cwtch/models/message.dart'; import 'package:cwtch/models/profile.dart'; +import 'package:cwtch/views/contactsview.dart'; import 'package:cwtch/widgets/malformedbubble.dart'; import 'package:cwtch/widgets/messageloadingbubble.dart'; import 'package:flutter/material.dart'; @@ -61,14 +63,23 @@ class QuotedMessageBubbleState extends State { var qMessage = (snapshot.data! as Message); // Swap the background color for quoted tweets.. var qTextColor = fromMe ? Provider.of(context).theme.messageFromOtherTextColor : Provider.of(context).theme.messageFromMeTextColor; - return Container( - margin: EdgeInsets.all(5), - padding: EdgeInsets.all(5), - color: fromMe ? Provider.of(context).theme.messageFromOtherBackgroundColor : Provider.of(context).theme.messageFromMeBackgroundColor, - child: Wrap(runAlignment: WrapAlignment.spaceEvenly, alignment: WrapAlignment.spaceEvenly, runSpacing: 1.0, crossAxisAlignment: WrapCrossAlignment.center, children: [ - Center(widthFactor: 1, child: Padding(padding: EdgeInsets.all(10.0), child: Icon(Icons.reply, size: 32, color: qTextColor))), - Center(widthFactor: 1.0, child: DefaultTextStyle(child: qMessage.getPreviewWidget(context), style: TextStyle(color: qTextColor))) - ])); + return MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + var index = Provider.of(context, listen: false).messageCache.cacheByHash[qMessage.getMetadata().contenthash]; + var totalMessages = Provider.of(context, listen: false).totalMessages; + // we have to reverse here because the list itself is reversed... + Provider.of(context).messageScrollController.scrollTo(index: totalMessages - index!, duration: Duration(milliseconds: 100)); + }, + child: Container( + margin: EdgeInsets.all(5), + padding: EdgeInsets.all(5), + color: fromMe ? Provider.of(context).theme.messageFromOtherBackgroundColor : Provider.of(context).theme.messageFromMeBackgroundColor, + child: Wrap(runAlignment: WrapAlignment.spaceEvenly, alignment: WrapAlignment.spaceEvenly, runSpacing: 1.0, crossAxisAlignment: WrapCrossAlignment.center, children: [ + Center(widthFactor: 1, child: Padding(padding: EdgeInsets.all(10.0), child: Icon(Icons.reply, size: 32, color: qTextColor))), + Center(widthFactor: 1.0, child: DefaultTextStyle(child: qMessage.getPreviewWidget(context), style: TextStyle(color: qTextColor))) + ])))); } catch (e) { print(e); return MalformedBubble();