Add hero animation to the device folder gallery page
This commit is contained in:
parent
06886c858c
commit
2d14356792
13 changed files with 49 additions and 31 deletions
|
@ -187,6 +187,9 @@ class PhotoSyncManager {
|
|||
List<File> photosToBeUploaded = await _db.getFilesToBeUploaded();
|
||||
for (int i = 0; i < photosToBeUploaded.length; i++) {
|
||||
File file = photosToBeUploaded[i];
|
||||
if (file.fileType == FileType.video) {
|
||||
continue;
|
||||
}
|
||||
_logger.info("Uploading " + file.toString());
|
||||
try {
|
||||
var uploadedFile = await _uploadFile(file);
|
||||
|
|
|
@ -17,8 +17,10 @@ import 'package:logging/logging.dart';
|
|||
class DetailPage extends StatefulWidget {
|
||||
final List<File> files;
|
||||
final int selectedIndex;
|
||||
final String tagPrefix;
|
||||
|
||||
DetailPage(this.files, this.selectedIndex, {key}) : super(key: key);
|
||||
DetailPage(this.files, this.selectedIndex, this.tagPrefix, {key})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
_DetailPageState createState() => _DetailPageState();
|
||||
|
@ -74,11 +76,13 @@ class _DetailPageState extends State<DetailPage> {
|
|||
_shouldDisableScroll = value;
|
||||
});
|
||||
},
|
||||
tagPrefix: widget.tagPrefix,
|
||||
);
|
||||
} else if (file.fileType == FileType.video) {
|
||||
content = VideoWidget(
|
||||
file,
|
||||
autoPlay: !_hasPageChanged, // Autoplay if it was opened directly
|
||||
tagPrefix: widget.tagPrefix,
|
||||
);
|
||||
} else {
|
||||
content = Icon(Icons.error);
|
||||
|
|
|
@ -46,6 +46,7 @@ class _DeviceFolderPageState extends State<DeviceFolderPage> {
|
|||
});
|
||||
},
|
||||
reloadEvent: Bus.instance.on<LocalPhotosUpdatedEvent>(),
|
||||
tagPrefix: "device_folder",
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@ import 'dart:async';
|
|||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:page_transition/page_transition.dart';
|
||||
import 'package:photos/core/event_bus.dart';
|
||||
import 'package:photos/db/file_db.dart';
|
||||
import 'package:photos/events/local_photos_updated_event.dart';
|
||||
|
@ -98,7 +97,9 @@ class _DeviceFolderGalleryWidgetState extends State<DeviceFolderGalleryWidget> {
|
|||
child: Column(
|
||||
children: <Widget>[
|
||||
Container(
|
||||
child: ThumbnailWidget(folder.thumbnail),
|
||||
child: Hero(
|
||||
tag: "device_folder" + folder.thumbnail.tag(),
|
||||
child: ThumbnailWidget(folder.thumbnail)),
|
||||
height: 150,
|
||||
width: 150,
|
||||
),
|
||||
|
@ -115,11 +116,13 @@ class _DeviceFolderGalleryWidgetState extends State<DeviceFolderGalleryWidget> {
|
|||
],
|
||||
),
|
||||
onTap: () {
|
||||
Navigator.push(
|
||||
context,
|
||||
PageTransition(
|
||||
type: PageTransitionType.rightToLeftWithFade,
|
||||
child: DeviceFolderPage(folder)));
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
return DeviceFolderPage(folder);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ class FaceSearchResultsPage extends StatelessWidget {
|
|||
body: Container(
|
||||
child: Gallery(
|
||||
asyncLoader: () => _faceSearchManager.getFaceSearchResults(face),
|
||||
tagPrefix: "face_search_results",
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
|
@ -23,6 +23,7 @@ class Gallery extends StatefulWidget {
|
|||
final Future<void> Function() onRefresh;
|
||||
final Set<File> selectedFiles;
|
||||
final Function(Set<File>) onFileSelectionChange;
|
||||
final String tagPrefix;
|
||||
|
||||
Gallery({
|
||||
this.syncLoader,
|
||||
|
@ -31,6 +32,7 @@ class Gallery extends StatefulWidget {
|
|||
this.onRefresh,
|
||||
this.selectedFiles,
|
||||
this.onFileSelectionChange,
|
||||
this.tagPrefix,
|
||||
});
|
||||
|
||||
@override
|
||||
|
@ -189,7 +191,7 @@ class _GalleryState extends State<Gallery> {
|
|||
: null,
|
||||
),
|
||||
child: Hero(
|
||||
tag: file.tag(),
|
||||
tag: widget.tagPrefix + file.tag(),
|
||||
child: ThumbnailWidget(file),
|
||||
),
|
||||
),
|
||||
|
@ -211,6 +213,7 @@ class _GalleryState extends State<Gallery> {
|
|||
final page = DetailPage(
|
||||
_files,
|
||||
_files.indexOf(file),
|
||||
widget.tagPrefix,
|
||||
);
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
|
|
|
@ -123,6 +123,7 @@ class _HomeWidgetState extends State<HomeWidget> {
|
|||
_selectedPhotos = selectedPhotos;
|
||||
});
|
||||
},
|
||||
tagPrefix: "home_gallery",
|
||||
);
|
||||
} else if (snapshot.hasError) {
|
||||
return Center(child: Text(snapshot.error.toString()));
|
||||
|
|
|
@ -39,6 +39,7 @@ class _LocationSearchResultsPageState extends State<LocationSearchResultsPage> {
|
|||
body: Container(
|
||||
child: Gallery(
|
||||
syncLoader: _getResult,
|
||||
tagPrefix: "location_search",
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
|
@ -33,17 +33,18 @@ class _RemoteFolderPageState extends State<RemoteFolderPage> {
|
|||
},
|
||||
),
|
||||
body: Gallery(
|
||||
asyncLoader: () => FileDB.instance.getAllInFolder(widget.folder.id),
|
||||
onRefresh: () =>
|
||||
FolderSharingService.instance.syncDiff(widget.folder),
|
||||
selectedFiles: _selectedPhotos,
|
||||
onFileSelectionChange: (Set<File> selectedPhotos) {
|
||||
setState(
|
||||
() {
|
||||
_selectedPhotos = selectedPhotos;
|
||||
},
|
||||
);
|
||||
}),
|
||||
asyncLoader: () => FileDB.instance.getAllInFolder(widget.folder.id),
|
||||
onRefresh: () => FolderSharingService.instance.syncDiff(widget.folder),
|
||||
selectedFiles: _selectedPhotos,
|
||||
onFileSelectionChange: (Set<File> selectedPhotos) {
|
||||
setState(
|
||||
() {
|
||||
_selectedPhotos = selectedPhotos;
|
||||
},
|
||||
);
|
||||
},
|
||||
tagPrefix: "remote_folder",
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,13 @@ import 'loading_widget.dart';
|
|||
class VideoWidget extends StatefulWidget {
|
||||
final File file;
|
||||
final bool autoPlay;
|
||||
VideoWidget(this.file, {this.autoPlay = false, Key key}) : super(key: key);
|
||||
final String tagPrefix;
|
||||
VideoWidget(
|
||||
this.file, {
|
||||
this.autoPlay = false,
|
||||
this.tagPrefix,
|
||||
Key key,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_VideoWidgetState createState() => _VideoWidgetState();
|
||||
|
@ -73,7 +79,7 @@ class _VideoWidgetState extends State<VideoWidget> {
|
|||
? _getVideoPlayer()
|
||||
: _getLoadingWidget();
|
||||
return Hero(
|
||||
tag: widget.file.tag(),
|
||||
tag: widget.tagPrefix + widget.file.tag(),
|
||||
child: content,
|
||||
);
|
||||
}
|
||||
|
|
|
@ -12,11 +12,13 @@ import 'package:photos/core/constants.dart';
|
|||
class ZoomableImage extends StatefulWidget {
|
||||
final File photo;
|
||||
final Function(bool) shouldDisableScroll;
|
||||
final String tagPrefix;
|
||||
|
||||
ZoomableImage(
|
||||
this.photo, {
|
||||
Key key,
|
||||
this.shouldDisableScroll,
|
||||
this.tagPrefix,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
|
@ -59,7 +61,7 @@ class _ZoomableImageState extends State<ZoomableImage>
|
|||
minScale: PhotoViewComputedScale.contained,
|
||||
gaplessPlayback: true,
|
||||
heroAttributes: PhotoViewHeroAttributes(
|
||||
tag: widget.photo.tag(),
|
||||
tag: widget.tagPrefix + widget.photo.tag(),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
|
|
|
@ -352,13 +352,6 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.4.0+17"
|
||||
page_transition:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: page_transition
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.5"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
@ -54,7 +54,6 @@ dependencies:
|
|||
chewie: ^0.9.10
|
||||
cached_network_image: ^2.3.0-beta
|
||||
progress_dialog: ^1.2.4
|
||||
page_transition: ^1.1.5
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
|
Loading…
Add table
Reference in a new issue