diff --git a/lib/ports_tab.dart b/lib/ports_tab.dart index 59fe1af..2eae7ae 100644 --- a/lib/ports_tab.dart +++ b/lib/ports_tab.dart @@ -7,8 +7,14 @@ enum MenuAction { edit, delete } class PortsTab extends StatefulWidget { final mixer.MixerState mixerState; final void Function(Map data) sendAction; + final bool Function(mixer.Port port, bool isOutput)? filter; + final void Function(mixer.Port port)? selectionCallback; const PortsTab( - {super.key, required this.mixerState, required this.sendAction}); + {super.key, + required this.mixerState, + required this.sendAction, + this.filter, + this.selectionCallback}); @override State createState() => _PortsTabState(); @@ -76,49 +82,55 @@ class _PortsTabState extends State { const SizedBox(height: 10), ...[...widget.mixerState.inputs, ...widget.mixerState.outputs] .indexed - .where((elem) { - return elem.$2.name - .toLowerCase() - .contains(searchText.toLowerCase()); - }).map( - (elem) => Card( - child: ListTile( - leading: (elem.$1 >= widget.mixerState.inputs.length) - ? const Icon(Icons.speaker_outlined) - : const Icon(Icons.mic_none_outlined), - title: Text(elem.$2.name), - subtitle: Text('Backend: ${elem.$2.properties.backend}'), - trailing: PopupMenuButton( - tooltip: "More Options", - onSelected: (MenuAction item) { - switch (item) { - case MenuAction.edit: - onEditPort(elem.$2); - case MenuAction.delete: - onDeletePort(elem.$2); - } - }, - itemBuilder: (BuildContext context) => - >[ - const PopupMenuItem( - value: MenuAction.edit, - child: ListTile( - leading: Icon(Icons.mode_edit), - title: Text('Edit'), - ), + .where((elem) => widget.filter != null + ? widget.filter!( + elem.$2, (elem.$1 >= widget.mixerState.inputs.length)) + : true) + .where((elem) => elem.$2.name + .toLowerCase() + .contains(searchText.toLowerCase())) + .map( + (elem) => Card( + child: ListTile( + leading: (elem.$1 >= widget.mixerState.inputs.length) + ? const Icon(Icons.speaker_outlined) + : const Icon(Icons.mic_none_outlined), + title: Text(elem.$2.name), + subtitle: Text('Backend: ${elem.$2.properties.backend}'), + onTap: widget.selectionCallback != null + ? () => widget.selectionCallback!(elem.$2) + : null, + trailing: PopupMenuButton( + tooltip: "More Options", + onSelected: (MenuAction item) { + switch (item) { + case MenuAction.edit: + onEditPort(elem.$2); + case MenuAction.delete: + onDeletePort(elem.$2); + } + }, + itemBuilder: (BuildContext context) => + >[ + const PopupMenuItem( + value: MenuAction.edit, + child: ListTile( + leading: Icon(Icons.mode_edit), + title: Text('Edit'), + ), + ), + const PopupMenuItem( + value: MenuAction.delete, + child: ListTile( + leading: Icon(Icons.delete), + title: Text('Delete'), + ), + ), + ], ), - const PopupMenuItem( - value: MenuAction.delete, - child: ListTile( - leading: Icon(Icons.delete), - title: Text('Delete'), - ), - ), - ], + ), ), - ), - ), - ) + ) ], ), ),