From 22994ee8f2febb96a5ccad506c94bce10673bc79 Mon Sep 17 00:00:00 2001 From: 21pages Date: Mon, 10 Jul 2023 16:02:47 +0800 Subject: [PATCH] opt chatModel, linux same startup height as dart Signed-off-by: 21pages --- flutter/lib/common/widgets/chat_page.dart | 39 ++++++++++----- flutter/lib/desktop/pages/server_page.dart | 5 +- .../lib/desktop/widgets/remote_toolbar.dart | 2 +- flutter/lib/mobile/pages/remote_page.dart | 4 +- flutter/lib/mobile/pages/server_page.dart | 2 +- flutter/lib/models/chat_model.dart | 48 ++++++++++--------- flutter/linux/my_application.cc | 2 +- 7 files changed, 62 insertions(+), 40 deletions(-) diff --git a/flutter/lib/common/widgets/chat_page.dart b/flutter/lib/common/widgets/chat_page.dart index a79e673d5..17267b71b 100644 --- a/flutter/lib/common/widgets/chat_page.dart +++ b/flutter/lib/common/widgets/chat_page.dart @@ -9,6 +9,7 @@ import '../../mobile/pages/home_page.dart'; enum ChatPageType { mobileMain, + desktopCM, } class ChatPage extends StatelessWidget implements PageShape { @@ -43,30 +44,39 @@ class ChatPage extends StatelessWidget implements PageShape { // only mobile need [appBarActions], just bind gFFI.chatModel final chatModel = gFFI.chatModel; return chatModel.messages.entries.map((entry) { - final id = entry.key; + final key = entry.key; final user = entry.value.chatUser; final client = gFFI.serverModel.clients - .firstWhereOrNull((e) => e.id == id.connId); + .firstWhereOrNull((e) => e.id == key.connId); + final connected = + gFFI.serverModel.clients.any((e) => e.id == key.connId); return PopupMenuItem( child: Row( children: [ Icon( - id.isOut + key.isOut ? Icons.call_made_rounded : Icons.call_received_rounded, color: MyTheme.accent) .marginOnly(right: 6), Text("${user.firstName} ${user.id}"), + if (connected) + Container( + width: 10, + height: 10, + decoration: BoxDecoration( + shape: BoxShape.circle, color: Colors.green), + ).marginSymmetric(horizontal: 2), if (client != null) unreadMessageCountBuilder(client.unreadChatMessageCount) ], ), - value: id, + value: key, ); }).toList(); }, - onSelected: (id) { - gFFI.chatModel.changeCurrentID(id); + onSelected: (key) { + gFFI.chatModel.changeCurrentKey(key); }) ]; @@ -79,6 +89,17 @@ class ChatPage extends StatelessWidget implements PageShape { child: Consumer( builder: (context, chatModel, child) { final currentUser = chatModel.currentUser; + final readOnly = type == ChatPageType.mobileMain && + (chatModel.currentKey.connId == ChatModel.clientModeID || + gFFI.serverModel.clients.every((e) => + e.id != chatModel.currentKey.connId || + chatModel.currentUser == null)) || + type == ChatPageType.desktopCM && + gFFI.serverModel.clients + .firstWhereOrNull( + (e) => e.id == chatModel.currentKey.connId) + ?.disconnected == + true; return Stack( children: [ LayoutBuilder(builder: (context, constraints) { @@ -88,11 +109,7 @@ class ChatPage extends StatelessWidget implements PageShape { messages: chatModel .messages[chatModel.currentKey]?.chatMessages ?? [], - readOnly: type == ChatPageType.mobileMain && - (chatModel.currentKey.connId == - ChatModel.clientModeID || - gFFI.serverModel.clients.every( - (e) => e.id != chatModel.currentKey.connId)), + readOnly: readOnly, inputOptions: InputOptions( focusNode: chatModel.inputNode, textController: chatModel.textController, diff --git a/flutter/lib/desktop/pages/server_page.dart b/flutter/lib/desktop/pages/server_page.dart index b560d1a41..c26c0bf7a 100644 --- a/flutter/lib/desktop/pages/server_page.dart +++ b/flutter/lib/desktop/pages/server_page.dart @@ -103,7 +103,7 @@ class ConnectionManagerState extends State { final client = gFFI.serverModel.clients.firstWhereOrNull((e) => e.id == client_id); if (client != null) { - gFFI.chatModel.changeCurrentID(MessageKey(client.peerId, client.id)); + gFFI.chatModel.changeCurrentKey(MessageKey(client.peerId, client.id)); if (client.unreadChatMessageCount.value > 0) { Future.delayed(Duration.zero, () { client.unreadChatMessageCount.value = 0; @@ -181,7 +181,8 @@ class ConnectionManagerState extends State { right: BorderSide( color: Theme.of(context) .dividerColor))), - child: ChatPage()), + child: + ChatPage(type: ChatPageType.desktopCM)), ), ) : Offstage(), diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index 29151b9b8..c36b1a41a 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -1413,7 +1413,7 @@ class _ChatMenuState extends State<_ChatMenu> { initPos = Offset(pos.dx, pos.dy + _ToolbarTheme.dividerHeight); } - widget.ffi.chatModel.changeCurrentID( + widget.ffi.chatModel.changeCurrentKey( MessageKey(widget.ffi.id, ChatModel.clientModeID)); widget.ffi.chatModel.toggleChatOverlay(chatInitPos: initPos); }); diff --git a/flutter/lib/mobile/pages/remote_page.dart b/flutter/lib/mobile/pages/remote_page.dart index 61867daa2..a769fd187 100644 --- a/flutter/lib/mobile/pages/remote_page.dart +++ b/flutter/lib/mobile/pages/remote_page.dart @@ -72,6 +72,8 @@ class _RemotePageState extends State { keyboardVisibilityController.onChange.listen(onSoftKeyboardChanged); _blockableOverlayState.applyFfi(gFFI); initSharedStates(widget.id); + gFFI.chatModel + .changeCurrentKey(MessageKey(widget.id, ChatModel.clientModeID)); } @override @@ -351,7 +353,7 @@ class _RemotePageState extends State { color: Colors.white, icon: Icon(Icons.message), onPressed: () { - gFFI.chatModel.changeCurrentID(MessageKey( + gFFI.chatModel.changeCurrentKey(MessageKey( widget.id, ChatModel.clientModeID)); gFFI.chatModel.toggleChatOverlay(); }, diff --git a/flutter/lib/mobile/pages/server_page.dart b/flutter/lib/mobile/pages/server_page.dart index 7ca3a9cb2..c215564fa 100644 --- a/flutter/lib/mobile/pages/server_page.dart +++ b/flutter/lib/mobile/pages/server_page.dart @@ -420,7 +420,7 @@ class ConnectionManager extends StatelessWidget { ? const SizedBox.shrink() : IconButton( onPressed: () { - gFFI.chatModel.changeCurrentID( + gFFI.chatModel.changeCurrentKey( MessageKey(client.peerId, client.id)); final bar = navigationBarKey.currentWidget; if (bar != null) { diff --git a/flutter/lib/models/chat_model.dart b/flutter/lib/models/chat_model.dart index a50a7deb1..8b5027037 100644 --- a/flutter/lib/models/chat_model.dart +++ b/flutter/lib/models/chat_model.dart @@ -12,6 +12,7 @@ import 'package:flutter_hbb/models/platform_model.dart'; import 'package:flutter_hbb/models/state_model.dart'; import 'package:get/get_rx/src/rx_types/rx_types.dart'; import 'package:get/get.dart'; +import 'package:uuid/uuid.dart'; import 'package:window_manager/window_manager.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -77,13 +78,13 @@ class ChatModel with ChangeNotifier { } final ChatUser me = ChatUser( - id: "", + id: Uuid().v4().toString(), firstName: translate("Me"), ); late final Map _messages = {}; - MessageKey _currentKey = MessageKey('', clientModeID); + MessageKey _currentKey = MessageKey('', -2); // -2 is invalid value late bool _isShowCMChatPage = false; Map get messages => _messages; @@ -266,7 +267,7 @@ class ChatModel with ChangeNotifier { toggleCMChatPage(MessageKey key) async { if (gFFI.chatModel.currentKey != key) { - gFFI.chatModel.changeCurrentID(key); + gFFI.chatModel.changeCurrentKey(key); } if (_isShowCMChatPage) { _isShowCMChatPage = !_isShowCMChatPage; @@ -284,28 +285,29 @@ class ChatModel with ChangeNotifier { } } - changeCurrentID(MessageKey key) { + changeCurrentKey(MessageKey key) { updateConnIdOfKey(key); - if (_messages.containsKey(key)) { - _currentKey = key; - notifyListeners(); + String? peerName; + if (key.connId == clientModeID) { + peerName = parent.target?.ffiModel.pi.username; } else { - String? peerName; - if (key.connId == clientModeID) { - peerName = parent.target?.ffiModel.pi.username; - } else { - peerName = parent.target?.serverModel.clients - .firstWhereOrNull((client) => client.peerId == key.peerId) - ?.name; - } + peerName = parent.target?.serverModel.clients + .firstWhereOrNull((client) => client.peerId == key.peerId) + ?.name; + } + if (!_messages.containsKey(key)) { final chatUser = ChatUser( id: key.peerId, firstName: peerName, ); _messages[key] = MessageBody(chatUser, []); - _currentKey = key; - notifyListeners(); + } else { + if (peerName != null && peerName.isNotEmpty) { + _messages[key]?.chatUser.firstName = peerName; + } } + _currentKey = key; + notifyListeners(); mobileClearClientUnread(key.connId); } @@ -388,7 +390,7 @@ class ChatModel with ChangeNotifier { } } else { if (HomePage.homeKey.currentState?.selectedIndex != 1 || - _currentKey.peerId != client.peerId) { + _currentKey != messagekey) { client.unreadChatMessageCount.value += 1; mobileUpdateUnreadSum(); } @@ -398,7 +400,7 @@ class ChatModel with ChangeNotifier { insertMessage(messagekey, ChatMessage(text: text, user: chatUser, createdAt: DateTime.now())); if (id == clientModeID || _currentKey.peerId.isEmpty) { - // Invalid + // client or invalid _currentKey = messagekey; mobileClearClientUnread(messagekey.connId); } @@ -435,12 +437,12 @@ class ChatModel with ChangeNotifier { .toList() .firstWhereOrNull((e) => e == key && e.connId != key.connId) != null) { - final old = _messages.remove(key); - if (old != null) { - _messages[key] = old; + final value = _messages.remove(key); + if (value != null) { + _messages[key] = value; } } - if (_currentKey == key) { + if (_currentKey == key || _currentKey.peerId.isEmpty) { _currentKey = key; // hash != assign } } diff --git a/flutter/linux/my_application.cc b/flutter/linux/my_application.cc index 21e25fa28..b96c16f3f 100644 --- a/flutter/linux/my_application.cc +++ b/flutter/linux/my_application.cc @@ -64,7 +64,7 @@ static void my_application_activate(GApplication* application) { int width = 800, height = 600; if (gIsConnectionManager) { width = 300; - height = 400; + height = 490; } gtk_window_set_default_size(window, width, height); // <-- comment this line gtk_widget_show(GTK_WIDGET(window));