ente/lib/ui/gallery.dart
2020-04-05 19:30:44 +05:30

89 lines
2.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:logger/logger.dart';
import 'package:myapp/models/photo.dart';
import 'package:myapp/photo_loader.dart';
import 'package:myapp/ui/image_widget.dart';
import 'package:provider/provider.dart';
import 'package:toast/toast.dart';
import 'change_notifier_builder.dart';
import 'detail_page.dart';
class Gallery extends StatefulWidget {
@override
_GalleryState createState() {
return _GalleryState();
}
}
class _GalleryState extends State<Gallery> {
Logger _logger = Logger();
int _crossAxisCount = 4;
PhotoLoader get photoLoader => Provider.of<PhotoLoader>(context);
@override
Widget build(BuildContext context) {
_logger.i("Build with _crossAxisCount: " + _crossAxisCount.toString());
return GestureDetector(
onScaleUpdate: (ScaleUpdateDetails details) {
_logger.i("Scale update: " + details.horizontalScale.toString());
setState(() {
if (details.horizontalScale < 1) {
_crossAxisCount = 8;
} else if (details.horizontalScale < 2) {
_crossAxisCount = 5;
} else if (details.horizontalScale < 4) {
_crossAxisCount = 4;
} else if (details.horizontalScale < 8) {
_crossAxisCount = 2;
} else {
_crossAxisCount = 1;
}
});
},
child: ChangeNotifierBuilder(
value: photoLoader,
builder: (_, __) {
return GridView.builder(
itemBuilder: _buildItem,
itemCount: photoLoader.getPhotos().length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: _crossAxisCount,
));
},
),
);
}
Widget _buildItem(BuildContext context, int index) {
var photo = photoLoader.getPhotos()[index];
return GestureDetector(
onTap: () {
routeToDetailPage(photo, context);
},
onLongPress: () {
Toast.show(photo.localPath, context);
},
child: Padding(
padding: const EdgeInsets.all(1.0),
child: ImageWidget(path: photo.thumbnailPath),
),
);
}
void routeToDetailPage(Photo photo, BuildContext context) {
final page = DetailPage(
photo: photo,
);
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) {
return page;
},
),
);
}
}