From 605e9c08c605d35e7570b72c3b8b537f1e322497 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Mon, 17 Apr 2023 13:05:26 -0700 Subject: [PATCH] Improve Message Row Highlight/Performance Rendering --- lib/models/appstate.dart | 10 ---------- lib/models/contact.dart | 10 ++++++++++ lib/views/contactsview.dart | 2 +- lib/views/messageview.dart | 2 -- lib/widgets/messagelist.dart | 1 + lib/widgets/messagerow.dart | 30 +++++++++++++++--------------- 6 files changed, 27 insertions(+), 28 deletions(-) diff --git a/lib/models/appstate.dart b/lib/models/appstate.dart index f543211d..a00d15f7 100644 --- a/lib/models/appstate.dart +++ b/lib/models/appstate.dart @@ -12,8 +12,6 @@ class AppState extends ChangeNotifier { String? _selectedProfile; int? _selectedConversation; int _initialScrollIndex = 0; - int _hoveredIndex = -1; - int? _selectedIndex; bool _unreadMessagesBelow = false; bool _disableFilePicker = false; bool _focus = true; @@ -59,14 +57,6 @@ class AppState extends ChangeNotifier { notifyListeners(); } - // Never use this for message lookup - can be a non-indexed value - // e.g. -1 - int get hoveredIndex => _hoveredIndex; - set hoveredIndex(int newVal) { - this._hoveredIndex = newVal; - notifyListeners(); - } - bool get unreadMessagesBelow => _unreadMessagesBelow; set unreadMessagesBelow(bool newVal) { this._unreadMessagesBelow = newVal; diff --git a/lib/models/contact.dart b/lib/models/contact.dart index 665e32ff..dec7bf4f 100644 --- a/lib/models/contact.dart +++ b/lib/models/contact.dart @@ -66,6 +66,8 @@ class ContactInfoState extends ChangeNotifier { String? _acnCircuit; MessageDraft _messageDraft = MessageDraft.empty(); + var _hoveredIndex = -1; + ContactInfoState( this.profileOnion, this.identifier, @@ -405,6 +407,14 @@ class ContactInfoState extends ChangeNotifier { return this.nickname + (this.availabilityStatus == ProfileStatusMenu.available ? "" : " (" + this.statusString(context) + ")"); } + // Never use this for message lookup - can be a non-indexed value + // e.g. -1 + int get hoveredIndex => _hoveredIndex; + set hoveredIndex(int newVal) { + this._hoveredIndex = newVal; + notifyListeners(); + } + String statusString(BuildContext context) { switch (this.availabilityStatus) { case ProfileStatusMenu.available: diff --git a/lib/views/contactsview.dart b/lib/views/contactsview.dart index 5a375a85..3bb9cc30 100644 --- a/lib/views/contactsview.dart +++ b/lib/views/contactsview.dart @@ -50,7 +50,7 @@ void selectConversation(BuildContext context, int handle) { // triggers update in Double/TripleColumnView Provider.of(context, listen: false).initialScrollIndex = unread; Provider.of(context, listen: false).selectedConversation = handle; - Provider.of(context, listen: false).hoveredIndex = -1; + 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); diff --git a/lib/views/messageview.dart b/lib/views/messageview.dart index 461d5f9d..96791583 100644 --- a/lib/views/messageview.dart +++ b/lib/views/messageview.dart @@ -17,11 +17,9 @@ import 'package:cwtch/models/profile.dart'; import 'package:cwtch/third_party/linkify/flutter_linkify.dart'; import 'package:cwtch/widgets/malformedbubble.dart'; import 'package:cwtch/widgets/messageloadingbubble.dart'; -import 'package:cwtch/widgets/messagerow.dart'; import 'package:cwtch/widgets/profileimage.dart'; import 'package:cwtch/controllers/filesharing.dart' as filesharing; import 'package:cwtch/widgets/staticmessagebubble.dart'; -import 'package:file_picker/file_picker.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/messagelist.dart b/lib/widgets/messagelist.dart index 6319ba59..99d0d313 100644 --- a/lib/widgets/messagelist.dart +++ b/lib/widgets/messagelist.dart @@ -1,3 +1,4 @@ +import 'package:cwtch/config.dart'; import 'package:cwtch/models/appstate.dart'; import 'package:cwtch/models/contact.dart'; import 'package:cwtch/models/message.dart'; diff --git a/lib/widgets/messagerow.dart b/lib/widgets/messagerow.dart index 8920bdee..2d3faa34 100644 --- a/lib/widgets/messagerow.dart +++ b/lib/widgets/messagerow.dart @@ -81,7 +81,7 @@ class MessageRowState extends State with SingleTickerProviderStateMi Widget wdgReply = Platform.isAndroid ? SizedBox.shrink() : Visibility( - visible: EnvironmentConfig.TEST_MODE || Provider.of(context).hoveredIndex == Provider.of(context).messageID, + visible: EnvironmentConfig.TEST_MODE || Provider.of(context).hoveredIndex == Provider.of(context).messageID, maintainSize: true, maintainAnimation: true, maintainState: true, @@ -106,7 +106,7 @@ class MessageRowState extends State with SingleTickerProviderStateMi Widget wdgSeeReplies = Platform.isAndroid ? SizedBox.shrink() : Visibility( - visible: EnvironmentConfig.TEST_MODE || Provider.of(context).hoveredIndex == Provider.of(context).messageID, + visible: EnvironmentConfig.TEST_MODE || Provider.of(context).hoveredIndex == Provider.of(context).messageID, maintainSize: true, maintainAnimation: true, maintainState: true, @@ -128,8 +128,8 @@ class MessageRowState extends State with SingleTickerProviderStateMi : Visibility( visible: Provider.of(context, listen: false).cwtch.IsBlodeuweddSupported() && Provider.of(context).isExperimentEnabled(BlodeuweddExperiment) && - (EnvironmentConfig.TEST_MODE || Provider.of(context).hoveredIndex == Provider.of(context).messageID), - maintainSize: false, + (EnvironmentConfig.TEST_MODE || Provider.of(context).hoveredIndex == Provider.of(context).messageID), + maintainSize: true, maintainAnimation: true, maintainState: true, maintainInteractivity: false, @@ -245,16 +245,12 @@ class MessageRowState extends State with SingleTickerProviderStateMi var mr = MouseRegion( // For desktop... onHover: (event) { - if (Provider.of(context, listen: false).hoveredIndex != Provider.of(context, listen: false).messageID) { - setState(() { - Provider.of(context, listen: false).hoveredIndex = Provider.of(context, listen: false).messageID; - }); + if (Provider.of(context, listen: false).hoveredIndex != Provider.of(context, listen: false).messageID) { + Provider.of(context, listen: false).hoveredIndex = Provider.of(context, listen: false).messageID; } }, onExit: (event) { - // setState(() { - // Provider.of(context, listen: false).hoveredIndex = -1; - //}); + Provider.of(context, listen: false).hoveredIndex = -1; }, child: GestureDetector( onPanUpdate: (details) { @@ -270,12 +266,16 @@ class MessageRowState extends State with SingleTickerProviderStateMi }, onPanEnd: (details) { _runAnimation(details.velocity.pixelsPerSecond, size); - Provider.of(context, listen: false).messageDraft.quotedReference = Provider.of(context, listen: false).messageID; - Provider.of(context, listen: false).notifyMessageDraftUpdate(); - setState(() {}); + if (Platform.isAndroid) { + Provider.of(context, listen: false).messageDraft.quotedReference = Provider.of(context, listen: false).messageID; + Provider.of(context, listen: false).notifyMessageDraftUpdate(); + setState(() {}); + } }, onLongPress: () async { - modalShowReplies(context, AppLocalizations.of(context)!.headingReplies, AppLocalizations.of(context)!.messageNoReplies, settings, pis, cis, borderColor, cache, messageID); + if (Platform.isAndroid) { + modalShowReplies(context, AppLocalizations.of(context)!.headingReplies, AppLocalizations.of(context)!.messageNoReplies, settings, pis, cis, borderColor, cache, messageID); + } }, child: Padding( padding: EdgeInsets.all(2),