Aves_mio0.88/lib/widgets/dialogs/folder_picker_page.dart
2026-10-03 12:51:15 +02:00

182 lines
4.6 KiB
Dart

// 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<FolderPickerPage> createState() => _FolderPickerPageState();
}
class _FolderPickerPageState extends State<FolderPickerPage> {
late Future<List<_FolderRow>> _future;
@override
void initState() {
super.initState();
_future = _loadFolders();
}
Future<List<_FolderRow>> _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<List<_FolderRow>>(
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';
}
}