From 08c09051ea8c6a9dec144519a742a18bcb390789 Mon Sep 17 00:00:00 2001 From: Sorunome Date: Sun, 19 Sep 2021 11:50:43 +0200 Subject: [PATCH] Add simple client switcher buttons for within a bundle next to the input bar --- lib/pages/chat.dart | 4 +++ lib/pages/views/chat_view.dart | 64 ++++++++++++++++++++++++++++++++-- lib/widgets/matrix.dart | 17 +++++++++ 3 files changed, 83 insertions(+), 2 deletions(-) diff --git a/lib/pages/chat.dart b/lib/pages/chat.dart index 2c0e067e..942e6024 100644 --- a/lib/pages/chat.dart +++ b/lib/pages/chat.dart @@ -222,6 +222,10 @@ class ChatController extends State { TextEditingController sendController = TextEditingController(); + void setActiveClient(Client c) => setState(() { + Matrix.of(context).setActiveClient(c); + }); + Future send() async { if (sendController.text.trim().isEmpty) return; var parseCommands = true; diff --git a/lib/pages/views/chat_view.dart b/lib/pages/views/chat_view.dart index ffa1ea0d..20d7cf3a 100644 --- a/lib/pages/views/chat_view.dart +++ b/lib/pages/views/chat_view.dart @@ -37,9 +37,9 @@ class ChatView extends StatelessWidget { @override Widget build(BuildContext context) { - controller.matrix = Matrix.of(context); + controller.matrix ??= Matrix.of(context); final client = controller.matrix.client; - controller.room ??= client.getRoomById(controller.roomId); + controller.room = client.getRoomById(controller.roomId); if (controller.room == null) { return Scaffold( appBar: AppBar( @@ -680,6 +680,14 @@ class ChatView extends StatelessWidget { alignment: Alignment.center, child: EncryptionButton(controller.room), ), + if (controller.matrix.isMultiAccount && + controller.matrix.currentBundle.length > + 1) + Container( + height: 56, + alignment: Alignment.center, + child: _ChatAccountPicker(controller), + ), Expanded( child: Padding( padding: const EdgeInsets.symmetric( @@ -792,3 +800,55 @@ class _EditContent extends StatelessWidget { ); } } + +class _ChatAccountPicker extends StatelessWidget { + final ChatController controller; + + const _ChatAccountPicker(this.controller, {Key key}) : super(key: key); + + void _popupMenuButtonSelected(String mxid) { + final client = controller.matrix.currentBundle + .firstWhere((cl) => cl.userID == mxid, orElse: () => null); + if (client == null) { + Logs().w('Attempted to switch to a non-existing client $mxid'); + return; + } + controller.setActiveClient(client); + } + + @override + Widget build(BuildContext context) { + controller.matrix ??= Matrix.of(context); + final clients = controller.matrix.currentBundle; + clients.removeWhere((c) => c.getRoomById(controller.roomId) == null); + return FutureBuilder( + future: controller.matrix.client.ownProfile, + builder: (context, snapshot) => PopupMenuButton( + onSelected: _popupMenuButtonSelected, + itemBuilder: (BuildContext context) => clients + .map((client) => PopupMenuItem( + value: client.userID, + child: FutureBuilder( + future: client.ownProfile, + builder: (context, snapshot) => ListTile( + leading: Avatar( + snapshot.data?.avatarUrl, + snapshot.data?.displayName ?? client.userID.localpart, + size: 20, + ), + title: Text(snapshot.data?.displayName ?? client.userID), + contentPadding: EdgeInsets.all(0), + ), + ), + )) + .toList(), + child: Avatar( + snapshot.data?.avatarUrl, + snapshot.data?.displayName ?? + controller.matrix.client.userID.localpart, + size: 20, + ), + ), + ); + } +} diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 89979de9..c1b7f22b 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -80,6 +80,23 @@ class MatrixState extends State with WidgetsBindingObserver { return activeClient; } + void setActiveClient(Client cl) { + final i = widget.clients.indexWhere((c) => c == cl); + if (i != null) { + activeClient = i; + } else { + Logs().w('Tried to set an unknown client ${cl.userID} as active'); + } + } + + List get currentBundle { + final bundles = accountBundles; + if (bundles.containsKey(activeBundle)) { + return bundles[activeBundle]; + } + return bundles.values.first; + } + Map> get accountBundles { final resBundles = >{}; for (var i = 0; i < widget.clients.length; i++) {