Add simple client switcher buttons for within a bundle next to the input bar

This commit is contained in:
Sorunome 2021-09-19 11:50:43 +02:00
parent 8225c00e02
commit 08c09051ea
No known key found for this signature in database
GPG Key ID: B19471D07FC9BE9C
3 changed files with 83 additions and 2 deletions

View File

@ -222,6 +222,10 @@ class ChatController extends State<Chat> {
TextEditingController sendController = TextEditingController();
void setActiveClient(Client c) => setState(() {
Matrix.of(context).setActiveClient(c);
});
Future<void> send() async {
if (sendController.text.trim().isEmpty) return;
var parseCommands = true;

View File

@ -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<Profile>(
future: controller.matrix.client.ownProfile,
builder: (context, snapshot) => PopupMenuButton<String>(
onSelected: _popupMenuButtonSelected,
itemBuilder: (BuildContext context) => clients
.map((client) => PopupMenuItem<String>(
value: client.userID,
child: FutureBuilder<Profile>(
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,
),
),
);
}
}

View File

@ -80,6 +80,23 @@ class MatrixState extends State<Matrix> 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<Client> get currentBundle {
final bundles = accountBundles;
if (bundles.containsKey(activeBundle)) {
return bundles[activeBundle];
}
return bundles.values.first;
}
Map<String, List<Client>> get accountBundles {
final resBundles = <String, List<_AccountBundleWithClient>>{};
for (var i = 0; i < widget.clients.length; i++) {