// lib/widgets/dialogs/folder_picker_page.dart import 'package:aves/model/db/folder_content_type.dart'; import 'package:aves/services/common/services.dart'; import 'package:flutter/material.dart'; class FolderPickerPage extends StatefulWidget { static const routeName = '/folder_picker'; const FolderPickerPage({super.key}); @override State createState() => _FolderPickerPageState(); } class _FolderPickerPageState extends State { late Future> _future; @override void initState() { super.initState(); _future = _loadFolders(); } Future> _loadFolders() async { final rows = await localMediaDb.loadFolders( contentType: FolderContentType.media, ); final list = <_FolderRow>[]; for (final row in rows) { list.add( _FolderRow( path: row.path, displayName: row.displayName, albumType: row.albumType, priority: row.priority, totalSize: row.totalSize, fileCount: row.fileCount, isRemote: row.isRemote != 0, hybridFolder: _parseHybridFolder(row.hybridFolder), ), ); } return _sortFolders(list); } List<_FolderRow> _sortFolders(List<_FolderRow> folders) { folders.sort((a, b) { final p = b.priority.compareTo(a.priority); if (p != 0) return p; if (a.albumType == 3 && b.albumType != 3) return -1; if (b.albumType == 3 && a.albumType != 3) return 1; if (a.isRemote != b.isRemote) { return a.isRemote ? 1 : -1; } return a.displayName.toLowerCase().compareTo( b.displayName.toLowerCase(), ); }); return folders; } static int _parseHybridFolder(Object? value) { if (value == null) return 0; if (value is int) return value; if (value is num) return value.toInt(); return int.tryParse('$value') ?? 0; } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Scegli cartella')), body: FutureBuilder>( future: _future, builder: (context, snapshot) { if (!snapshot.hasData) { return const Center(child: CircularProgressIndicator()); } final folders = snapshot.data!; if (folders.isEmpty) { return const Center(child: Text('Nessuna cartella')); } return ListView.builder( itemCount: folders.length, itemBuilder: (context, index) { return _FolderTile( folder: folders[index], onTap: () => Navigator.pop(context, folders[index].path), ); }, ); }, ), ); } } class _FolderRow { final String path; final String displayName; final int albumType; final int priority; final int totalSize; final int fileCount; final bool isRemote; final int hybridFolder; _FolderRow({ required this.path, required this.displayName, required this.albumType, required this.priority, required this.totalSize, required this.fileCount, required this.isRemote, required this.hybridFolder, }); } class _FolderTile extends StatelessWidget { final _FolderRow folder; final VoidCallback onTap; const _FolderTile({ required this.folder, required this.onTap, }); @override Widget build(BuildContext context) { return ListTile( leading: ClipRRect( borderRadius: BorderRadius.circular(6), child: SizedBox( width: 56, height: 56, child: Container( color: Colors.grey.shade300, child: const Icon( Icons.folder, size: 32, color: Colors.black54, ), ), ), ), title: Text(folder.displayName), subtitle: Text( '${folder.fileCount} elementi • ${_formatSize(folder.totalSize)}', ), trailing: Row( mainAxisSize: MainAxisSize.min, children: [ if (folder.isRemote) const Icon(Icons.cloud, size: 18), if (folder.albumType == 3) const Icon(Icons.lock, size: 18), if (folder.hybridFolder != 0) const Icon(Icons.link, size: 18), ], ), onTap: onTap, ); } String _formatSize(int bytes) { if (bytes < 1024) return '$bytes B'; if (bytes < 1024 * 1024) { return '${(bytes / 1024).toStringAsFixed(1)} KB'; } if (bytes < 1024 * 1024 * 1024) { return '${(bytes / 1024 / 1024).toStringAsFixed(1)} MB'; } return '${(bytes / 1024 / 1024 / 1024).toStringAsFixed(1)} GB'; } }