import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/settings/navigation/drawer_editor_banner.dart'; import 'package:flutter/material.dart'; typedef ItemWidgetBuilder = Widget Function(T item); class DrawerFixedListTab extends StatefulWidget { final List items; final Set visibleItems; final ItemWidgetBuilder leading; final ItemWidgetBuilder title; const DrawerFixedListTab({ super.key, required this.items, required this.visibleItems, required this.leading, required this.title, }); @override State> createState() => _DrawerFixedListTabState(); } class _DrawerFixedListTabState extends State> { Set get visibleItems => widget.visibleItems; @override Widget build(BuildContext context) { return Column( children: [ if (!settings.useTvLayout) ...[ const DrawerEditorBanner(), const Divider(height: 0), ], Flexible( child: ReorderableListView.builder( itemBuilder: (context, index) { final filter = widget.items[index]; final visible = visibleItems.contains(filter); void onPressed() { setState(() { if (visible) { visibleItems.remove(filter); } else { visibleItems.add(filter); } }); } return Opacity( key: ValueKey(filter), opacity: visible ? 1 : .4, child: ListTile( leading: widget.leading(filter), title: widget.title(filter), trailing: IconButton( icon: Icon(visible ? AIcons.hide : AIcons.show), onPressed: onPressed, tooltip: visible ? context.l10n.hideTooltip : context.l10n.showTooltip, ), onTap: settings.useTvLayout ? onPressed : null, ), ); }, itemCount: widget.items.length, onReorder: (oldIndex, newIndex) { setState(() { if (oldIndex < newIndex) newIndex -= 1; widget.items.insert(newIndex, widget.items.removeAt(oldIndex)); }); }, ), ), ], ); } }