Display memories from previous years
This commit is contained in:
parent
5424eb01f5
commit
755664a8de
6 changed files with 141 additions and 26 deletions
|
@ -1,5 +1,4 @@
|
|||
import 'dart:async';
|
||||
import 'dart:collection';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
@ -16,6 +15,7 @@ import 'package:photos/ui/gallery.dart';
|
|||
import 'package:photos/ui/gallery_app_bar_widget.dart';
|
||||
import 'package:photos/ui/loading_photos_widget.dart';
|
||||
import 'package:photos/ui/loading_widget.dart';
|
||||
import 'package:photos/ui/memories_widget.dart';
|
||||
import 'package:photos/ui/remote_folder_gallery_widget.dart';
|
||||
import 'package:photos/ui/search_page.dart';
|
||||
import 'package:photos/utils/logging_util.dart';
|
||||
|
@ -114,6 +114,7 @@ class _HomeWidgetState extends State<HomeWidget> {
|
|||
onRefresh: PhotoSyncManager.instance.sync,
|
||||
tagPrefix: "home_gallery",
|
||||
selectedFiles: _selectedFiles,
|
||||
headerWidget: MemoriesWidget(),
|
||||
);
|
||||
} else if (snapshot.hasError) {
|
||||
return Center(child: Text(snapshot.error.toString()));
|
||||
|
|
|
@ -1,17 +1,15 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_swiper/flutter_swiper.dart';
|
||||
import 'package:photos/memory_service.dart';
|
||||
import 'package:photos/models/file_type.dart';
|
||||
import 'package:photos/models/memory.dart';
|
||||
import 'package:photos/ui/thumbnail_widget.dart';
|
||||
import 'package:photos/ui/video_widget.dart';
|
||||
import 'package:photos/ui/zoomable_image.dart';
|
||||
import 'package:photos/utils/date_time_util.dart';
|
||||
|
||||
class MemoriesWidget extends StatefulWidget {
|
||||
MemoriesWidget({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_MemoriesWidgetState createState() => _MemoriesWidgetState();
|
||||
}
|
||||
|
||||
class _MemoriesWidgetState extends State<MemoriesWidget> {
|
||||
class MemoriesWidget extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return FutureBuilder<List<Memory>>(
|
||||
|
@ -75,23 +73,37 @@ class MemoryWidget extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
width: 100,
|
||||
height: 120,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Column(
|
||||
children: [
|
||||
ClipOval(
|
||||
child: Container(
|
||||
width: 76,
|
||||
height: 76,
|
||||
child: ThumbnailWidget(memories[0].file),
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
return FullScreenMemory(memories);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
child: Container(
|
||||
width: 100,
|
||||
height: 120,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Column(
|
||||
children: [
|
||||
ClipOval(
|
||||
child: Container(
|
||||
width: 76,
|
||||
height: 76,
|
||||
child: Hero(
|
||||
tag: "memories" + memories[0].file.tag(),
|
||||
child: ThumbnailWidget(memories[0].file),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(padding: EdgeInsets.all(2)),
|
||||
_getTitle(memories[0]),
|
||||
],
|
||||
Padding(padding: EdgeInsets.all(2)),
|
||||
_getTitle(memories[0]),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
@ -108,3 +120,56 @@ class MemoryWidget extends StatelessWidget {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
class FullScreenMemory extends StatefulWidget {
|
||||
final List<Memory> memories;
|
||||
|
||||
FullScreenMemory(this.memories, {Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_FullScreenMemoryState createState() => _FullScreenMemoryState();
|
||||
}
|
||||
|
||||
class _FullScreenMemoryState extends State<FullScreenMemory> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Material(
|
||||
type: MaterialType.transparency,
|
||||
child: Container(
|
||||
child: new Swiper(
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
final file = widget.memories[index].file;
|
||||
return Stack(children: [
|
||||
file.fileType == FileType.image
|
||||
? ZoomableImage(
|
||||
file,
|
||||
tagPrefix: "memories",
|
||||
)
|
||||
: VideoWidget(file, tagPrefix: "memories"),
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(16, 40, 16, 16),
|
||||
child: Text(
|
||||
getFormattedDate(
|
||||
DateTime.fromMicrosecondsSinceEpoch(file.creationTime)),
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
)
|
||||
]);
|
||||
},
|
||||
itemCount: widget.memories.length,
|
||||
pagination: new SwiperPagination(
|
||||
builder: DotSwiperPaginationBuilder(activeColor: Colors.white)),
|
||||
control: new SwiperControl(),
|
||||
loop: false,
|
||||
autoplay: true,
|
||||
autoplayDelay: 5000,
|
||||
autoplayDisableOnInteraction: true,
|
||||
layout: SwiperLayout.DEFAULT,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ class ZoomableImage extends StatefulWidget {
|
|||
this.photo, {
|
||||
Key key,
|
||||
this.shouldDisableScroll,
|
||||
this.tagPrefix,
|
||||
@required this.tagPrefix,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
|
|
|
@ -65,6 +65,16 @@ String getFormattedTime(DateTime dateTime) {
|
|||
getTime(dateTime);
|
||||
}
|
||||
|
||||
String getFormattedDate(DateTime dateTime) {
|
||||
return getDay(dateTime) +
|
||||
", " +
|
||||
getMonth(dateTime) +
|
||||
" " +
|
||||
dateTime.day.toString() +
|
||||
", " +
|
||||
dateTime.year.toString();
|
||||
}
|
||||
|
||||
String formatDuration(Duration position) {
|
||||
final ms = position.inMilliseconds;
|
||||
|
||||
|
@ -87,3 +97,20 @@ String formatDuration(Duration position) {
|
|||
|
||||
return formattedTime;
|
||||
}
|
||||
|
||||
bool isLeapYear(DateTime dateTime) {
|
||||
final year = dateTime.year;
|
||||
if (year % 4 == 0) {
|
||||
if (year % 100 == 0) {
|
||||
if (year % 400 == 0) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
21
pubspec.lock
21
pubspec.lock
|
@ -223,6 +223,20 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.7.5"
|
||||
flutter_page_indicator:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_page_indicator
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.0.3"
|
||||
flutter_swiper:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_swiper
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.6"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
|
@ -574,6 +588,13 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.2.17"
|
||||
transformer_page_view:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: transformer_page_view
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.1.6"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
@ -54,6 +54,7 @@ dependencies:
|
|||
chewie: ^0.9.10
|
||||
cached_network_image: ^2.3.0-beta
|
||||
progress_dialog: ^1.2.4
|
||||
flutter_swiper: ^1.1.6
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
|
Loading…
Add table
Reference in a new issue