Selaa lähdekoodia

Display memories from previous years

Vishnu Mohandas 5 vuotta sitten
vanhempi
commit
755664a8de
6 muutettua tiedostoa jossa 141 lisäystä ja 26 poistoa
  1. 2 1
      lib/ui/home_widget.dart
  2. 89 24
      lib/ui/memories_widget.dart
  3. 1 1
      lib/ui/zoomable_image.dart
  4. 27 0
      lib/utils/date_time_util.dart
  5. 21 0
      pubspec.lock
  6. 1 0
      pubspec.yaml

+ 2 - 1
lib/ui/home_widget.dart

@@ -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()));

+ 89 - 24
lib/ui/memories_widget.dart

@@ -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,
+        ),
+      ),
+    );
+  }
+}

+ 1 - 1
lib/ui/zoomable_image.dart

@@ -18,7 +18,7 @@ class ZoomableImage extends StatefulWidget {
     this.photo, {
     Key key,
     this.shouldDisableScroll,
-    this.tagPrefix,
+    @required this.tagPrefix,
   }) : super(key: key);
 
   @override

+ 27 - 0
lib/utils/date_time_util.dart

@@ -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 - 0
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:

+ 1 - 0
pubspec.yaml

@@ -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: