Allow using the ports_tab component as a port selection dialog

This commit is contained in:
2024-08-28 23:10:37 +02:00
parent 0997e067d9
commit 340d6033ef

View File

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