Add ability to add files to existing albums

This commit is contained in:
Vishnu Mohandas 2020-10-29 06:00:02 +05:30
parent 0afbd87898
commit af01dbe610
5 changed files with 160 additions and 43 deletions

View file

@ -0,0 +1,17 @@
import 'package:photos/models/collection.dart';
import 'package:photos/models/device_folder.dart';
import 'package:photos/models/file.dart';
class CollectionItems {
final List<DeviceFolder> folders;
final List<CollectionWithThumbnail> collections;
CollectionItems(this.folders, this.collections);
}
class CollectionWithThumbnail {
final Collection collection;
final File thumbnail;
CollectionWithThumbnail(this.collection, this.thumbnail);
}

View file

@ -11,6 +11,7 @@ import 'package:photos/events/collection_updated_event.dart';
import 'package:photos/events/local_photos_updated_event.dart';
import 'package:photos/events/tab_changed_event.dart';
import 'package:photos/models/collection.dart';
import 'package:photos/models/collection_items.dart';
import 'package:photos/models/file.dart';
import 'package:photos/repositories/file_repository.dart';
import 'package:photos/services/collections_service.dart';
@ -217,12 +218,9 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget> {
ClipRRect(
borderRadius: BorderRadius.circular(4.0),
child: Container(
child: c.thumbnail ==
null // When the user has shared a folder without photos
? Icon(Icons.error)
: Hero(
tag: "collection" + c.thumbnail.tag(),
child: ThumbnailWidget(c.thumbnail)),
child: Hero(
tag: "collection" + c.thumbnail.tag(),
child: ThumbnailWidget(c.thumbnail)),
height: 150,
width: 150,
),
@ -281,17 +279,3 @@ class SectionTitle extends StatelessWidget {
]));
}
}
class CollectionItems {
final List<DeviceFolder> folders;
final List<CollectionWithThumbnail> collections;
CollectionItems(this.folders, this.collections);
}
class CollectionWithThumbnail {
final Collection collection;
final File thumbnail;
CollectionWithThumbnail(this.collection, this.thumbnail);
}

View file

@ -1,17 +1,24 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:logging/logging.dart';
import 'package:page_transition/page_transition.dart';
import 'package:photos/core/configuration.dart';
import 'package:photos/db/files_db.dart';
import 'package:photos/models/collection.dart';
import 'package:photos/models/collection_items.dart';
import 'package:photos/models/file.dart';
import 'package:photos/models/selected_files.dart';
import 'package:photos/services/collections_service.dart';
import 'package:photos/ui/collection_page.dart';
import 'package:photos/ui/loading_widget.dart';
import 'package:photos/ui/thumbnail_widget.dart';
import 'package:photos/utils/dialog_util.dart';
import 'package:photos/utils/file_uploader.dart';
import 'package:photos/utils/toast_util.dart';
class CreateCollectionPage extends StatefulWidget {
final List<File> files;
const CreateCollectionPage(this.files, {Key key}) : super(key: key);
final SelectedFiles selectedFiles;
const CreateCollectionPage(this.selectedFiles, {Key key}) : super(key: key);
@override
_CreateCollectionPageState createState() => _CreateCollectionPageState();
@ -32,26 +39,125 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
}
Widget _getBody(BuildContext context) {
return Row(
return Column(
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: OutlineButton(
child: Text(
"Create a new album",
style: Theme.of(context).textTheme.bodyText1,
Row(
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: OutlineButton(
child: Text(
"Create a new album",
style: Theme.of(context).textTheme.bodyText1,
),
onPressed: () {
_showNameAlbumDialog();
},
),
),
),
],
),
Padding(
padding: const EdgeInsets.fromLTRB(8, 12, 8, 8),
child: Align(
alignment: Alignment.centerLeft,
child: Text(
"Add to an existing collection",
style: TextStyle(
fontWeight: FontWeight.bold,
color: Theme.of(context).primaryColorLight,
),
onPressed: () {
_showNameAlbumDialog();
},
),
),
),
_getExistingCollectionsWidget(),
],
);
}
Widget _getExistingCollectionsWidget() {
return FutureBuilder<List<CollectionWithThumbnail>>(
future: _getCollectionsWithThumbnail(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text(snapshot.error.toString());
} else if (snapshot.hasData) {
return Flexible(
child: ListView.builder(
itemBuilder: (context, index) {
return _buildCollectionItem(snapshot.data[index]);
},
itemCount: snapshot.data.length,
shrinkWrap: true,
),
);
} else {
return loadWidget;
}
},
);
}
Widget _buildCollectionItem(CollectionWithThumbnail item) {
return Container(
padding: EdgeInsets.all(8),
child: GestureDetector(
child: Row(
children: <Widget>[
ClipRRect(
borderRadius: BorderRadius.circular(2.0),
child: Container(
child: ThumbnailWidget(item.thumbnail),
height: 64,
width: 64,
),
),
Padding(padding: EdgeInsets.all(8)),
Expanded(
child: Text(
item.collection.name,
style: TextStyle(
fontSize: 16,
),
),
),
],
),
onTap: () async {
if (await _addToCollection(item.collection.id)) {
showToast("Added successfully to '" + item.collection.name);
Navigator.pop(context);
Navigator.push(
context,
PageTransition(
type: PageTransitionType.bottomToTop,
child: CollectionPage(
item.collection,
)));
}
},
),
);
}
Future<List<CollectionWithThumbnail>> _getCollectionsWithThumbnail() async {
final collectionsWithThumbnail = List<CollectionWithThumbnail>();
final collections = CollectionsService.instance.getCollections();
for (final c in collections) {
if (c.ownerID != Configuration.instance.getUserID()) {
continue;
}
var thumbnail = await FilesDB.instance.getLatestFileInCollection(c.id);
if (thumbnail == null) {
continue;
}
collectionsWithThumbnail.add(CollectionWithThumbnail(c, thumbnail));
}
return collectionsWithThumbnail;
}
void _showNameAlbumDialog() async {
AlertDialog alert = AlertDialog(
title: Text("Album title"),
@ -72,9 +178,20 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
FlatButton(
child: Text("OK"),
onPressed: () async {
Navigator.pop(context);
final collection = await _createAlbum(_albumName);
if (collection != null) {
await _addToCollection(collection.id);
if (await _addToCollection(collection.id)) {
showToast("Album '" + _albumName + "' created.");
Navigator.pop(context);
Navigator.push(
context,
PageTransition(
type: PageTransitionType.bottomToTop,
child: CollectionPage(
collection,
)));
}
}
},
),
@ -89,11 +206,11 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
);
}
Future<void> _addToCollection(int collectionID) async {
Future<bool> _addToCollection(int collectionID) async {
final dialog = createProgressDialog(context, "Uploading files to album...");
await dialog.show();
final files = List<File>();
for (final file in widget.files) {
for (final file in widget.selectedFiles.files) {
if (file.uploadedFileID == null) {
file.collectionID = collectionID;
final uploadedFile =
@ -106,16 +223,15 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
}
try {
await CollectionsService.instance.addToCollection(collectionID, files);
Navigator.pop(context);
Navigator.pop(context);
showToast("Album '" + _albumName + "' created.");
await dialog.hide();
widget.selectedFiles.clearAll();
return true;
} catch (e, s) {
_logger.severe(e, s);
await dialog.hide();
showGenericErrorDialog(context);
} finally {
await dialog.hide();
}
return false;
}
Future<Collection> _createAlbum(String albumName) async {

View file

@ -161,7 +161,7 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
PageTransition(
type: PageTransitionType.bottomToTop,
child: CreateCollectionPage(
widget.selectedFiles.files.toList(),
widget.selectedFiles,
)));
}

View file

@ -8,7 +8,7 @@ import 'package:photos/core/event_bus.dart';
import 'package:photos/db/collections_db.dart';
import 'package:photos/db/files_db.dart';
import 'package:photos/events/remote_sync_event.dart';
import 'package:photos/ui/collections_gallery_widget.dart';
import 'package:photos/models/collection_items.dart';
import 'package:photos/ui/common_elements.dart';
import 'package:photos/ui/loading_widget.dart';
import 'package:photos/ui/shared_collection_page.dart';