aves_mio0.31/lib/widgets/dialogs/folder_picker_page.dart
2026-07-18 13:39:22 +02:00

180 lines
4.8 KiB
Dart

import 'package:flutter/material.dart';
//import 'package:aves/database/local_media_db.dart';
import 'package:aves/model/entry/entry.dart';
//import 'package:aves/utils/file_utils.dart';
import 'package:aves/services/common/services.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.loadAllFolders();
final entries = await localMediaDb.loadEntriesMap();
final list = <_FolderRow>[];
for (final row in rows) {
final thumbEntry = row.thumbEntryId != null ? entries[row.thumbEntryId] : null;
list.add(
_FolderRow(
path: row.path,
displayName: row.displayName,
albumType: row.albumType,
priority: row.priority,
totalSize: row.totalSize,
fileCount: row.fileCount,
isRemote: row.isRemote == 1,
hybridType: row.hybridType,
thumbEntry: thumbEntry,
),
);
}
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;
}
@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 hybridType;
final AvesEntry? thumbEntry;
_FolderRow({
required this.path,
required this.displayName,
required this.albumType,
required this.priority,
required this.totalSize,
required this.fileCount,
required this.isRemote,
required this.hybridType,
required this.thumbEntry,
});
}
class _FolderTile extends StatelessWidget {
final _FolderRow folder;
final VoidCallback onTap;
const _FolderTile({
required this.folder,
required this.onTap,
});
@override
Widget build(BuildContext context) {
final thumb = folder.thumbEntry;
return ListTile(
leading: ClipRRect(
borderRadius: BorderRadius.circular(6),
child: SizedBox(
width: 56,
height: 56,
child: thumb != null
? Image(
image: thumb.thumbnailProvider(),
fit: BoxFit.cover,
)
: 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.hybridType != 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';
}
}