Files
maps_bookmarks/lib/pages/collections_list_page.dart
marco c80606b7d0
All checks were successful
Flutter APK Build / Build Flutter APK (pull_request) Successful in 6m44s
changed appearance of lists
2026-01-21 15:04:24 +01:00

132 lines
4.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../l10n/app_localizations.dart';
import '../model/collection.dart';
import '../service/bookmarks_provider.dart';
import '../service/shared_link_provider.dart';
import '../service/storage.dart';
import '../widgets/create_bookmark_collection_dialog.dart';
import 'collection_page.dart';
import 'search_page.dart' show SearchPage;
class CollectionsListPage extends StatefulWidget {
const CollectionsListPage({super.key});
static const String routeName = '/collections';
@override
State<CollectionsListPage> createState() => _CollectionsListPageState();
}
class _CollectionsListPageState extends State<CollectionsListPage> {
bool addingNewBookmark = false;
final bookmarkCountMap = Storage.loadPerCollectionBookmarkCount();
Widget bottomSheetBuilder(BuildContext context) {
final titleTextFieldController = TextEditingController(
text: context
.read<SharedLinkProvider>()
.currentMapsLinkMetadata!
.placeName,
);
return SizedBox(
height: 200,
child: TextField(controller: titleTextFieldController),
);
}
void onAddButtonPressed() => showDialog(
context: context,
builder: (context) =>
CreateBookmarkCollectionDialog(onSavePressed: onCollectionSaved),
);
void onCollectionSaved(Collection collection) {
Storage.addOrUpdateCollection(collection);
setState(() {});
}
Widget collectionsListItemBuilder(
BuildContext context,
Collection collection,
) {
return ListTile(
title: Text(collection.name),
onTap: () => navigateToCollection(collection.id),
onLongPress: () => onEditCollection(collection),
leading: const Icon(Icons.list_rounded),
trailing: Text(
bookmarkCountMap[collection.id]?.toString() ?? '0',
style: Theme.of(context).textTheme.bodyMedium,
),
);
}
void navigateToCollection(int collectionId) {
BookmarksProvider.selectedCollectionId = collectionId;
Navigator.pushNamed(context, CollectionPage.routeName);
}
void onEditCollection(Collection selectedCollection) => showDialog(
context: context,
builder: (context) => CreateBookmarkCollectionDialog(
selectedCollection: selectedCollection,
onSavePressed: onCollectionSaved,
onDeletePressed: () {
Storage.deleteCollection(
selectedCollection,
).whenComplete(() => setState(() {}));
},
),
);
@override
Widget build(BuildContext context) {
final collections = Storage.loadCollections();
final provider = context.watch<SharedLinkProvider>();
addingNewBookmark = provider.currentMapsLinkMetadata != null;
return Scaffold(
appBar: AppBar(
title: addingNewBookmark
? Text(AppLocalizations.of(context)!.chooseCollection)
: Text(AppLocalizations.of(context)!.collections),
actions: [
if (addingNewBookmark)
TextButton(
onPressed: () => provider.removeCurrentMapsLink(),
child: Text(AppLocalizations.of(context)!.cancel),
)
else
IconButton(
onPressed: () =>
Navigator.of(context).pushNamed(SearchPage.routeName),
icon: Icon(Icons.search),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: onAddButtonPressed,
child: Icon(Icons.add),
),
body: collections.isNotEmpty
? Center(
child: SizedBox(
width: MediaQuery.of(context).size.width * 0.9,
child: ListView.separated(
itemBuilder: (context, index) => collectionsListItemBuilder(
context,
collections.elementAt(index),
),
itemCount: collections.length,
separatorBuilder: (context, index) => SizedBox(height: 10),
),
),
)
: Center(
child: Text(AppLocalizations.of(context)!.tipCreateCollections),
),
);
}
}