Movie Context Menu
This commit is contained in:
@@ -143,6 +143,10 @@ class BackendApi {
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> deleteMovie(int movieId) async {
|
||||
await _post({'action': 'delete_movie', 'movie_id': movieId});
|
||||
}
|
||||
|
||||
Future<List<Map<String, dynamic>>> getEpisodes({
|
||||
String? status,
|
||||
String? q,
|
||||
|
||||
@@ -127,7 +127,7 @@ class MovieListScreen extends ConsumerWidget {
|
||||
separatorBuilder: (_, __) => const Divider(height: 1),
|
||||
itemBuilder: (context, i) {
|
||||
final m = itemsSorted[i];
|
||||
return ListTile(
|
||||
final tile = ListTile(
|
||||
tileColor: _statusBg(m.status, context),
|
||||
leading: m.posterPath != null
|
||||
? ClipRRect(
|
||||
@@ -187,6 +187,72 @@ class MovieListScreen extends ConsumerWidget {
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
Future<void> setStatus(ItemStatus s) async {
|
||||
final messenger = ScaffoldMessenger.of(context);
|
||||
try {
|
||||
await ref.read(backendApiProvider).setStatus(type: 'movie', refId: m.id, status: s.name);
|
||||
ref.invalidate(moviesStreamProvider);
|
||||
ref.invalidate(moviesProvider);
|
||||
messenger.showSnackBar(SnackBar(content: Text('Status gesetzt: ${s.name}')));
|
||||
} catch (e) {
|
||||
messenger.showSnackBar(SnackBar(content: Text('Fehler: $e')));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> updateMovie() async {
|
||||
final messenger = ScaffoldMessenger.of(context);
|
||||
try {
|
||||
final tmdb = ref.read(tmdbApiProvider);
|
||||
final json = await tmdb.getMovie(m.tmdbId);
|
||||
await ref.read(backendApiProvider).upsertMovie(json);
|
||||
ref.invalidate(moviesStreamProvider);
|
||||
ref.invalidate(moviesProvider);
|
||||
messenger.showSnackBar(const SnackBar(content: Text('Film aktualisiert')));
|
||||
} catch (e) {
|
||||
messenger.showSnackBar(SnackBar(content: Text('Update fehlgeschlagen: $e')));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> deleteMovie() async {
|
||||
final confirm = await showDialog<bool>(
|
||||
context: context,
|
||||
builder: (ctx) => AlertDialog(
|
||||
title: const Text('Film löschen?'),
|
||||
content: Text(m.title),
|
||||
actions: [
|
||||
TextButton(onPressed: () => Navigator.of(ctx).pop(false), child: const Text('Abbrechen')),
|
||||
FilledButton(onPressed: () => Navigator.of(ctx).pop(true), child: const Text('Löschen')),
|
||||
],
|
||||
),
|
||||
);
|
||||
if (confirm != true) return;
|
||||
final messenger = ScaffoldMessenger.of(context);
|
||||
try {
|
||||
await ref.read(backendApiProvider).deleteMovie(m.id);
|
||||
ref.invalidate(moviesStreamProvider);
|
||||
ref.invalidate(moviesProvider);
|
||||
messenger.showSnackBar(const SnackBar(content: Text('Film gelöscht')));
|
||||
} catch (e) {
|
||||
messenger.showSnackBar(SnackBar(content: Text('Löschen fehlgeschlagen: $e')));
|
||||
}
|
||||
}
|
||||
|
||||
return MenuAnchor(
|
||||
menuChildren: [
|
||||
MenuItemButton(onPressed: () => setStatus(ItemStatus.Init), child: const Text('set to init')),
|
||||
MenuItemButton(onPressed: () => setStatus(ItemStatus.Progress), child: const Text('set to progress')),
|
||||
MenuItemButton(onPressed: () => setStatus(ItemStatus.Done), child: const Text('set to done')),
|
||||
MenuItemButton(onPressed: updateMovie, child: const Text('update')),
|
||||
MenuItemButton(onPressed: deleteMovie, child: const Text('delete')),
|
||||
],
|
||||
builder: (ctx, controller, child) => GestureDetector(
|
||||
onSecondaryTapDown: (_) => controller.open(),
|
||||
onSecondaryTapUp: (_) => controller.open(),
|
||||
onLongPress: () => controller.open(),
|
||||
child: tile,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user