Add ability to add files to existing albums
This commit is contained in:
parent
0afbd87898
commit
af01dbe610
5 changed files with 160 additions and 43 deletions
17
lib/models/collection_items.dart
Normal file
17
lib/models/collection_items.dart
Normal 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);
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -161,7 +161,7 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
|
|||
PageTransition(
|
||||
type: PageTransitionType.bottomToTop,
|
||||
child: CreateCollectionPage(
|
||||
widget.selectedFiles.files.toList(),
|
||||
widget.selectedFiles,
|
||||
)));
|
||||
}
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
Loading…
Add table
Reference in a new issue