part of 'favorites_page.dart'; class _LeftBar extends StatefulWidget { const _LeftBar({this.favPage, this.onSelected, this.withAppbar = false}); final _FavoritesPageState? favPage; final VoidCallback? onSelected; final bool withAppbar; @override State<_LeftBar> createState() => _LeftBarState(); } class _LeftBarState extends State<_LeftBar> implements FolderList { late _FavoritesPageState favPage; var folders = []; var networkFolders = []; void findNetworkFolders() { networkFolders.clear(); var all = ComicSource.all() .where((e) => e.favoriteData != null) .map((e) => e.favoriteData!.key) .toList(); var settings = appdata.settings['favorites'] as List; for (var p in settings) { if (all.contains(p) && !networkFolders.contains(p)) { networkFolders.add(p); } } } @override void initState() { favPage = widget.favPage ?? context.findAncestorStateOfType<_FavoritesPageState>()!; favPage.folderList = this; folders = LocalFavoritesManager().folderNames; findNetworkFolders(); appdata.settings.addListener(updateFolders); super.initState(); } @override void dispose() { super.dispose(); appdata.settings.removeListener(updateFolders); } @override Widget build(BuildContext context) { return Container( width: double.infinity, height: double.infinity, decoration: BoxDecoration( border: Border( right: BorderSide( color: context.colorScheme.outlineVariant, width: 0.6, ), ), ), child: Column( children: [ if (widget.withAppbar) SizedBox( height: 56, child: Row( children: [ const SizedBox(width: 8), const CloseButton(), const SizedBox(width: 8), Text( "Folders".tl, style: ts.s18, ), ], ), ).paddingTop(context.padding.top), Expanded( child: ListView.builder( padding: widget.withAppbar ? EdgeInsets.zero : EdgeInsets.only(top: context.padding.top), itemCount: folders.length + networkFolders.length + 2, itemBuilder: (context, index) { if (index == 0) { return Container( padding: const EdgeInsets.symmetric(vertical: 8), child: Row( children: [ Icon( Icons.local_activity, color: context.colorScheme.secondary, ), const SizedBox(width: 12), Text("Local".tl), const Spacer(), MenuButton( entries: [ MenuEntry( icon: Icons.search, text: 'Search'.tl, onClick: () { context.to(() => const LocalSearchPage()); }, ), MenuEntry( icon: Icons.add, text: 'Create Folder'.tl, onClick: () { newFolder().then((value) { setState(() { folders = LocalFavoritesManager().folderNames; }); }); }, ), MenuEntry( icon: Icons.reorder, text: 'Sort'.tl, onClick: () { sortFolders().then((value) { setState(() { folders = LocalFavoritesManager().folderNames; }); }); }, ), ], ), ], ).paddingHorizontal(16), ); } index--; if (index < folders.length) { return buildLocalFolder(folders[index]); } index -= folders.length; if (index == 0) { return Container( padding: const EdgeInsets.symmetric(vertical: 12), margin: const EdgeInsets.only(top: 8), decoration: BoxDecoration( border: Border( top: BorderSide( color: context.colorScheme.outlineVariant, width: 0.6, ), ), ), child: Row( children: [ Icon( Icons.cloud, color: context.colorScheme.secondary, ), const SizedBox(width: 12), Text("Network".tl), const Spacer(), IconButton( icon: const Icon(Icons.settings), onPressed: () { showPopUpWidget( App.rootContext, setFavoritesPagesWidget(), ); }, ), ], ).paddingHorizontal(16), ); } index--; return buildNetworkFolder(networkFolders[index]); }, ), ) ], ), ); } Widget buildLocalFolder(String name) { bool isSelected = name == favPage.folder && !favPage.isNetwork; return InkWell( onTap: () { if (isSelected) { return; } favPage.setFolder(false, name); widget.onSelected?.call(); }, child: Container( height: 42, alignment: Alignment.centerLeft, decoration: BoxDecoration( color: isSelected ? context.colorScheme.primaryContainer.toOpacity(0.36) : null, border: Border( left: BorderSide( color: isSelected ? context.colorScheme.primary : Colors.transparent, width: 2, ), ), ), padding: const EdgeInsets.only(left: 16), child: Text(name), ), ); } Widget buildNetworkFolder(String key) { var data = getFavoriteDataOrNull(key); if (data == null) { return const SizedBox(); } bool isSelected = key == favPage.folder && favPage.isNetwork; return InkWell( onTap: () { if (isSelected) { return; } favPage.setFolder(true, key); widget.onSelected?.call(); }, child: Container( height: 42, alignment: Alignment.centerLeft, decoration: BoxDecoration( color: isSelected ? context.colorScheme.primaryContainer.toOpacity(0.36) : null, border: Border( left: BorderSide( color: isSelected ? context.colorScheme.primary : Colors.transparent, width: 2, ), ), ), padding: const EdgeInsets.only(left: 16), child: Text(data.title), ), ); } @override void update() { if (!mounted) return; setState(() {}); } @override void updateFolders() { if (!mounted) return; setState(() { folders = LocalFavoritesManager().folderNames; findNetworkFolders(); }); } }