From 140e0bd339a6c0c86e6f3153439095cc567363cb Mon Sep 17 00:00:00 2001 From: Herwig Birke Date: Mon, 13 May 2024 17:27:56 +0200 Subject: [PATCH] update movie --- lib/data/movies.dart | 4 + lib/widgets/movies/details/detailsScreen.dart | 73 +++++++++++++-- lib/widgets/movies/details/settingsBox.dart | 32 ++++++- .../movies/details/settingsBoxLocalPath.dart | 10 +- .../movies/details/settingsBoxResolution.dart | 4 + lib/widgets/movies/details/stateBox.dart | 78 ++-------------- lib/widgets/movies/listScreen.dart | 73 ++++++++++++--- .../tvshows/details/detailsScreen.dart | 8 +- lib/widgets/tvshows/listScreen.dart | 92 ++++++++++--------- 9 files changed, 232 insertions(+), 142 deletions(-) diff --git a/lib/data/movies.dart b/lib/data/movies.dart index f7af2c3..eaa0e55 100644 --- a/lib/data/movies.dart +++ b/lib/data/movies.dart @@ -6,6 +6,7 @@ import 'package:syncfusion_flutter_datagrid/datagrid.dart'; class Movie { int movieID; String movieTitle; + String originalTitle; String overview; DateTime releaseDate; int state; @@ -24,6 +25,7 @@ class Movie { Movie({ required this.movieID, required this.movieTitle, + required this.originalTitle, required this.overview, required this.releaseDate, required this.state, @@ -45,6 +47,7 @@ class Movie { return Movie( movieID: int.parse(json['movieID']), movieTitle: json['movieTitle'] as String, + originalTitle: json['originalTitle'] as String, overview: json['overview'] as String, releaseDate: DateTime.parse(json['releaseDate']), state: int.parse(json['state']), @@ -64,6 +67,7 @@ class Movie { return Movie( movieID: int.parse(json['movieID']), movieTitle: json['movieTitle'] as String, + originalTitle: '', overview: json['overview'] as String, releaseDate: DateTime.parse(json['releaseDate']), state: int.parse(json['state']), diff --git a/lib/widgets/movies/details/detailsScreen.dart b/lib/widgets/movies/details/detailsScreen.dart index 7286a82..c0b91e7 100644 --- a/lib/widgets/movies/details/detailsScreen.dart +++ b/lib/widgets/movies/details/detailsScreen.dart @@ -285,9 +285,67 @@ class MovieDetailsScreen extends StatelessWidget { } bool save() { + updateMovie(); return true; } + Future updateMovie() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + + String? dbProtocol = prefs.getString('dbProtocol'); + String? dbHost = prefs.getString('dbHost'); + String? dbPath = prefs.getString('dbPath'); + + Uri url = Uri( + scheme: dbProtocol, + host: dbHost, + path: dbPath, + ); + + try { + final r = await http.post( + url, + headers: { + 'Content-Type': 'application/json; charset=UTF-8', + }, + body: jsonEncode( + { + 'module': 'movie', + 'function': 'update', + 'movieID': movieDetails.movieID.toString(), + 'movieTitle': movieDetails.movieTitle, + 'originalTitle': movieDetails.originalTitle, + 'overview': movieDetails.overview, + 'releaseDate': + DateFormat('yyyy-MM-dd').format(movieDetails.releaseDate), + 'resolution': movieDetails.resolution, + 'state': movieDetails.state.toString(), + 'backdropPath': movieDetails.backdropPath, + 'languages': movieDetails.languages, + 'productionCountries': movieDetails.productionCountries, + 'productionCompanies': movieDetails.productionCompanies, + 'voteAverage': movieDetails.voteAverage.toString(), + 'voteCount': movieDetails.voteCount.toString(), + 'cast': movieDetails.cast, + 'crew': movieDetails.crew, + 'genre': movieDetails.genre, + 'localPath': movieDetails.localPath, + }, + ), + ); + } catch (e) { + print (e.toString()); + } + + return true; + } + + void settingsChanged(String localPath, String resolution, int state) { + movieDetails.localPath = localPath; + movieDetails.resolution = resolution; + movieDetails.state = state; + } + @override Widget build(BuildContext context) { String releaseDate = DateFormat('yyyy-MM-dd').format(movie.releaseDate); @@ -300,7 +358,7 @@ class MovieDetailsScreen extends StatelessWidget { tooltip: 'Save changes', onPressed: () { if (save()) { - Navigator.pop(context); + Navigator.pop(context, movieDetails); } }, ), @@ -308,7 +366,7 @@ class MovieDetailsScreen extends StatelessWidget { icon: const Icon(Icons.highlight_off), tooltip: 'Revert changes', onPressed: () { - Navigator.pop(context); + Navigator.pop(context, null); }, ), ], @@ -323,10 +381,12 @@ class MovieDetailsScreen extends StatelessWidget { return Stack(children: [ Container( decoration: BoxDecoration( - image: movieDetails.backdropPath.isNotEmpty ? DecorationImage( - image: NetworkImage(url), - fit: BoxFit.cover, - ) : null, + image: movieDetails.backdropPath.isNotEmpty + ? DecorationImage( + image: NetworkImage(url), + fit: BoxFit.cover, + ) + : null, ), ), SingleChildScrollView( @@ -355,6 +415,7 @@ class MovieDetailsScreen extends StatelessWidget { localPath: movieDetails.localPath, resolution: movieDetails.resolution, state: movieDetails.state, + settingsChanged: settingsChanged, ), ), ], diff --git a/lib/widgets/movies/details/settingsBox.dart b/lib/widgets/movies/details/settingsBox.dart index c185381..9c6a5e4 100644 --- a/lib/widgets/movies/details/settingsBox.dart +++ b/lib/widgets/movies/details/settingsBox.dart @@ -6,16 +6,34 @@ import 'package:multimedia/widgets/movies/details/settingsBoxResolution.dart'; import 'package:multimedia/widgets/movies/details/stateBox.dart'; class MovieDetailsSettingsBox extends StatelessWidget { - const MovieDetailsSettingsBox({ + MovieDetailsSettingsBox({ super.key, required this.localPath, required this.resolution, required this.state, + required this.settingsChanged, }); - final String localPath; - final String resolution; - final int state; + String localPath; + String resolution; + int state; + + final Function(String localPath, String resolution, int state) settingsChanged; + + void localPathChanged(String localPath) { + this.localPath = localPath; + settingsChanged(localPath, resolution, state); + } + + void resolutionChanged(String resolution) { + this.resolution = resolution; + settingsChanged(localPath, resolution, state); + } + + void stateChanged(int state) { + this.state = state; + settingsChanged(localPath, resolution, state); + } Widget generateInputs(BuildContext context) { double width = MediaQuery.of(context).size.width; @@ -31,6 +49,7 @@ class MovieDetailsSettingsBox extends StatelessWidget { children: [ MovieDetailsSettingsBoxResolution( resolution: resolution, + resolutionChanged: resolutionChanged, ), ], ), @@ -38,6 +57,7 @@ class MovieDetailsSettingsBox extends StatelessWidget { children: [ MovieDetailsSettingsBoxLocalPath( localPath: localPath, + localPathChanged: localPathChanged, ), ], ), @@ -45,6 +65,7 @@ class MovieDetailsSettingsBox extends StatelessWidget { children: [ MovieDetailsSettingsStateBox( state: state, + stateChanged: stateChanged, ), ], ), @@ -63,12 +84,15 @@ class MovieDetailsSettingsBox extends StatelessWidget { children: [ MovieDetailsSettingsBoxLocalPath( localPath: localPath, + localPathChanged: localPathChanged, ), MovieDetailsSettingsBoxResolution( resolution: resolution, + resolutionChanged: resolutionChanged, ), MovieDetailsSettingsStateBox( state: state, + stateChanged: stateChanged, ), ], ), diff --git a/lib/widgets/movies/details/settingsBoxLocalPath.dart b/lib/widgets/movies/details/settingsBoxLocalPath.dart index 4995411..9c02907 100644 --- a/lib/widgets/movies/details/settingsBoxLocalPath.dart +++ b/lib/widgets/movies/details/settingsBoxLocalPath.dart @@ -1,12 +1,15 @@ import 'package:flutter/material.dart'; class MovieDetailsSettingsBoxLocalPath extends StatelessWidget { - const MovieDetailsSettingsBoxLocalPath({ + MovieDetailsSettingsBoxLocalPath({ super.key, required this.localPath, + required this.localPathChanged, }); - final String localPath; + String localPath; + + final Function(String localPath) localPathChanged; @override Widget build(BuildContext context) { @@ -31,6 +34,9 @@ class MovieDetailsSettingsBoxLocalPath extends StatelessWidget { labelText: 'Local Path', ), initialValue: localPath, + onChanged: (text) { + localPathChanged(text); + }, ), ], ), diff --git a/lib/widgets/movies/details/settingsBoxResolution.dart b/lib/widgets/movies/details/settingsBoxResolution.dart index 77d7a04..f03b0a9 100644 --- a/lib/widgets/movies/details/settingsBoxResolution.dart +++ b/lib/widgets/movies/details/settingsBoxResolution.dart @@ -4,10 +4,13 @@ class MovieDetailsSettingsBoxResolution extends StatefulWidget { MovieDetailsSettingsBoxResolution({ super.key, required this.resolution, + required this.resolutionChanged, }); String resolution; + final Function(String resolution) resolutionChanged; + @override State createState() => _MovieDetailsSettingsBoxResolutionState(); @@ -69,6 +72,7 @@ class _MovieDetailsSettingsBoxResolutionState onChanged: (String? newValue) { setState(() { _curResolution = newValue!; + widget.resolutionChanged(_curResolution); }); }, ), diff --git a/lib/widgets/movies/details/stateBox.dart b/lib/widgets/movies/details/stateBox.dart index 965334f..29cdb9a 100644 --- a/lib/widgets/movies/details/stateBox.dart +++ b/lib/widgets/movies/details/stateBox.dart @@ -3,10 +3,16 @@ import 'package:flutter/material.dart'; import 'package:multimedia/constants.dart'; class MovieDetailsSettingsStateBox extends StatefulWidget { - MovieDetailsSettingsStateBox({super.key, required this.state}); + MovieDetailsSettingsStateBox({ + super.key, + required this.state, + required this.stateChanged, + }); int state; + final Function(int state) stateChanged; + @override State createState() => _MovieDetailsSettingsStateBoxState(); @@ -60,6 +66,7 @@ class _MovieDetailsSettingsStateBoxState if (value == true) { setState(() { widget.state = 1; + widget.stateChanged(1); }); } }, @@ -82,6 +89,7 @@ class _MovieDetailsSettingsStateBoxState if (value == true) { setState(() { widget.state = 2; + widget.stateChanged(2); }); } }, @@ -104,6 +112,7 @@ class _MovieDetailsSettingsStateBoxState if (value == true) { setState(() { widget.state = 3; + widget.stateChanged(3); }); } }, @@ -117,72 +126,5 @@ class _MovieDetailsSettingsStateBoxState ), ); - // return Row( - // children: [ - // SizedBox( - // width: 200, - // child: CheckboxListTile( - // side: MaterialStateBorderSide.resolveWith( - // (states) => const BorderSide(width: 1.0, color: Colors.grey), - // ), - // title: const Text( - // 'initialized', - // textAlign: TextAlign.end, - // style: TextStyle(color: Colors.black), - // ), - // value: widget.state == 1, - // onChanged: (bool? value) { - // if (value == true) { - // setState(() { - // widget.state = 1; - // }); - // } - // }, - // ), - // ), - // SizedBox( - // width: 200, - // child: CheckboxListTile( - // side: MaterialStateBorderSide.resolveWith( - // (states) => const BorderSide(width: 1.0, color: Colors.grey), - // ), - // title: const Text( - // 'in progress', - // textAlign: TextAlign.end, - // style: TextStyle(color: Colors.black), - // ), - // value: widget.state == 2, - // onChanged: (bool? value) { - // if (value == true) { - // setState(() { - // widget.state = 2; - // }); - // } - // }, - // ), - // ), - // SizedBox( - // width: 200, - // child: CheckboxListTile( - // side: MaterialStateBorderSide.resolveWith( - // (states) => const BorderSide(width: 1.0, color: Colors.grey), - // ), - // title: const Text( - // 'done', - // textAlign: TextAlign.end, - // style: TextStyle(color: Colors.black), - // ), - // value: widget.state == 3, - // onChanged: (bool? value) { - // if (value == true) { - // setState(() { - // widget.state = 3; - // }); - // } - // }, - // ), - // ), - // ], - // ); } } diff --git a/lib/widgets/movies/listScreen.dart b/lib/widgets/movies/listScreen.dart index 2b7e507..4913a84 100644 --- a/lib/widgets/movies/listScreen.dart +++ b/lib/widgets/movies/listScreen.dart @@ -45,22 +45,28 @@ class _MoviesScreenState extends State { }, ); - final response = await http.get(url); - bool? error; - String? errorMessage; + try { + final response = await http.get(url); + bool? error; + String? errorMessage; - Map movies = json.decode(response.body); - error = movies['error']; - errorMessage = movies['errmsg']; - var list = movies['data']; + Map movies = json.decode(response.body); + error = movies['error']; + errorMessage = movies['errmsg']; + var list = movies['data']; - List _movies = - await list.map((json) => Movie.fromJson(json)).toList(); - movieDataSource = MovieDataSource(_movies); + List _movies = + await list.map((json) => Movie.fromJson(json)).toList(); + movieDataSource = MovieDataSource(_movies); - _moviesList = _movies; + _moviesList = _movies; - return _movies; + return _movies; + } catch (e) { + print(e.toString()); + } + + return []; } List getColumns() { @@ -126,7 +132,7 @@ class _MoviesScreenState extends State { _columns = getColumns(); } - void showMovieDetails(int index) { + Future showMovieDetails(int index) async { List> cells = movieDataSource.effectiveRows.elementAt(index).getCells(); @@ -142,11 +148,46 @@ class _MoviesScreenState extends State { } if (found) { - Navigator.push( + final m = await Navigator.push( context, MaterialPageRoute( builder: (ctx) => MovieDetailsScreen(movie: _moviesList[movieIndex]))); + + if (m != null) { + _moviesList[movieIndex].movieTitle = m.movieTitle; + _moviesList[movieIndex].localPath = m.localPath; + _moviesList[movieIndex].resolution = m.resolution; + _moviesList[movieIndex].state = m.state; + Movie e = _moviesList[movieIndex]; + + movieDataSource._movieDataGridRows[index] = DataGridRow(cells: [ + DataGridCell(columnName: 'movieID', value: e.movieID), + DataGridCell(columnName: 'state', value: e.state), + DataGridCell( + columnName: 'backdropPath', value: e.backdropPath), + DataGridCell(columnName: 'movieTitle', value: e.movieTitle), + DataGridCell( + columnName: 'releaseDate', + value: DateFormat('yyyy-MM-dd').format(e.releaseDate)), + DataGridCell(columnName: 'resolution', value: e.resolution), + DataGridCell(columnName: 'overview', value: e.overview), + ]); + + movieDataSource.updateDataGridSource( + rowColumnIndex: RowColumnIndex(index, 0)); + movieDataSource.updateDataGridSource( + rowColumnIndex: RowColumnIndex(index, 1)); + movieDataSource.updateDataGridSource( + rowColumnIndex: RowColumnIndex(index, 2)); + movieDataSource.updateDataGridSource( + rowColumnIndex: RowColumnIndex(index, 3)); + movieDataSource.updateDataGridSource( + rowColumnIndex: RowColumnIndex(index, 4)); + movieDataSource.updateDataGridSource( + rowColumnIndex: RowColumnIndex(index, 5)); + } else { + } } } @@ -267,4 +308,8 @@ class MovieDataSource extends DataGridSource { void updateDataGrid() { notifyListeners(); } + + void updateDataGridSource({required RowColumnIndex rowColumnIndex}) { + notifyDataSourceListeners(rowColumnIndex: rowColumnIndex); + } } diff --git a/lib/widgets/tvshows/details/detailsScreen.dart b/lib/widgets/tvshows/details/detailsScreen.dart index f65949e..50a8473 100644 --- a/lib/widgets/tvshows/details/detailsScreen.dart +++ b/lib/widgets/tvshows/details/detailsScreen.dart @@ -38,11 +38,6 @@ class TVShowDetailsScreen extends StatelessWidget { scheme: dbProtocol, host: dbHost, path: dbPath, - queryParameters: { - 'module': 'tvshow', - 'function': 'test', - 'data': data, - }, ); print(url.toString()); @@ -54,6 +49,8 @@ class TVShowDetailsScreen extends StatelessWidget { }, body: jsonEncode( { + 'module': 'tvshow', + 'function': 'test', 'title': data, }, ), @@ -80,6 +77,7 @@ class TVShowDetailsScreen extends StatelessWidget { }, ); + print (url); final response = await http.get(url); bool? error; String? errorMessage; diff --git a/lib/widgets/tvshows/listScreen.dart b/lib/widgets/tvshows/listScreen.dart index c12b97e..e7a1276 100644 --- a/lib/widgets/tvshows/listScreen.dart +++ b/lib/widgets/tvshows/listScreen.dart @@ -50,44 +50,50 @@ class _TVShowsScreenState extends State { }, ); - final response = await http.get(url); - bool? error; - String? errorMessage; - String? mSeason; + try { + final response = await http.get(url); + bool? error; + String? errorMessage; + String? mSeason; - Map tvshows = json.decode(response.body); - error = tvshows['error']; - errorMessage = tvshows['errmsg']; - mSeason = tvshows['maxSeason']; + Map tvshows = json.decode(response.body); + error = tvshows['error']; + errorMessage = tvshows['errmsg']; + mSeason = tvshows['maxSeason']; - var tvshowList = tvshows['tvshows']; - var episodeList = tvshows['episodeCount']; + var tvshowList = tvshows['tvshows']; + var episodeList = tvshows['episodeCount']; - if (mSeason != null) { - if (int.tryParse(mSeason!) != null) { - maxSeason = int.parse(mSeason); + if (mSeason != null) { + if (int.tryParse(mSeason!) != null) { + maxSeason = int.parse(mSeason); + } } + + List _tvshows = + await tvshowList.map((json) => TVShow.fromJson(json)).toList(); + tvshowDataSource = TVShowDataSource(_tvshows, maxSeason); + + List _episodecount = await episodeList + .map((json) => EpisodeCount.fromJson(json)) + .toList(); + + episodeCount = _episodecount; + + if (initDone == false) { + addSeasonColumns(maxSeason); + } + + initDone = true; + + _tvshowsList = _tvshows; + + return _tvshows; + } catch (e) { + print (e.toString()); } - List _tvshows = - await tvshowList.map((json) => TVShow.fromJson(json)).toList(); - tvshowDataSource = TVShowDataSource(_tvshows, maxSeason); - - List _episodecount = await episodeList - .map((json) => EpisodeCount.fromJson(json)) - .toList(); - - episodeCount = _episodecount; - - if (initDone == false) { - addSeasonColumns(maxSeason); - } - - initDone = true; - - _tvshowsList = _tvshows; - - return _tvshows; + return []; } void addSeasonColumns(int maxSeason) { @@ -96,7 +102,7 @@ class _TVShowsScreenState extends State { columnName: 'season$x', // columnWidthMode: ColumnWidthMode.auto, label: Container( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all(4.0), alignment: Alignment.centerLeft, child: Text('Season $x')))); } @@ -109,7 +115,7 @@ class _TVShowsScreenState extends State { visible: false, width: 70, label: Container( - padding: const EdgeInsets.all(16.0), + padding: const EdgeInsets.all(4.0), alignment: Alignment.centerLeft, child: const Text('seriesID'), ), @@ -119,7 +125,7 @@ class _TVShowsScreenState extends State { visible: false, width: 70, label: Container( - padding: const EdgeInsets.all(16.0), + padding: const EdgeInsets.all(4.0), alignment: Alignment.centerLeft, child: const Text('seriesState'))), GridColumn( @@ -127,7 +133,7 @@ class _TVShowsScreenState extends State { visible: false, width: 70, label: Container( - padding: const EdgeInsets.all(16.0), + padding: const EdgeInsets.all(4.0), alignment: Alignment.centerLeft, child: const Text('status'))), GridColumn( @@ -135,7 +141,7 @@ class _TVShowsScreenState extends State { visible: false, width: 70, label: Container( - padding: const EdgeInsets.all(16.0), + padding: const EdgeInsets.all(4.0), alignment: Alignment.centerLeft, child: const Text('cliffhanger'))), GridColumn( @@ -143,7 +149,7 @@ class _TVShowsScreenState extends State { visible: false, width: 70, label: Container( - padding: const EdgeInsets.all(16.0), + padding: const EdgeInsets.all(4.0), alignment: Alignment.centerLeft, child: const Text('backdropPath'))), GridColumn( @@ -151,28 +157,28 @@ class _TVShowsScreenState extends State { visible: false, width: 70, label: Container( - padding: const EdgeInsets.all(16.0), + padding: const EdgeInsets.all(4.0), alignment: Alignment.centerLeft, child: const Text('overview'))), GridColumn( columnName: 'seriesName', // columnWidthMode: ColumnWidthMode.auto, label: Container( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all(4.0), alignment: Alignment.centerLeft, child: const Text('Name'))), GridColumn( columnName: 'firstAired', // columnWidthMode: ColumnWidthMode.auto, label: Container( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all(4.0), alignment: Alignment.centerLeft, child: const Text('First Aired'))), GridColumn( columnName: 'resolution', // columnWidthMode: ColumnWidthMode.auto, label: Container( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all(4.0), alignment: Alignment.centerLeft, child: const Text('Resolution'))), ]; @@ -371,7 +377,7 @@ class TVShowDataSource extends DataGridSource { '1', style: TextStyle( fontFamily: 'geometric', - fontSize: 30, + fontSize: 25, color: col, ), )),