From 3ef5cde4dafb946e70a34f437191239c0622962d Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 29 Nov 2020 19:07:35 +0900 Subject: [PATCH] various minor fixes --- lib/ref/xmp.dart | 5 +- lib/widgets/about/licenses.dart | 1 + .../collection/grid/list_section_layout.dart | 7 +- .../collection/thumbnail_collection.dart | 21 ++++-- lib/widgets/common/scaling.dart | 65 +++++++++---------- lib/widgets/common/tile_extent_manager.dart | 9 +-- .../filter_grids/common/filter_grid_page.dart | 17 +++-- 7 files changed, 73 insertions(+), 52 deletions(-) diff --git a/lib/ref/xmp.dart b/lib/ref/xmp.dart index 55ddc7eda..858eeddc4 100644 --- a/lib/ref/xmp.dart +++ b/lib/ref/xmp.dart @@ -4,11 +4,13 @@ class XMP { // cf https://exiftool.org/TagNames/XMP.html static const Map namespaces = { - 'aux': 'Auxiliary Exif', + 'aux': 'Exif Aux', 'Camera': 'Camera', 'crs': 'Camera Raw Settings', 'dc': 'Dublin Core', 'exif': 'Exif', + 'exifEX': 'Exif Ex', + 'GettyImagesGIFT': 'Getty Images', 'GIMP': 'GIMP', 'illustrator': 'Illustrator', 'Iptc4xmpCore': 'IPTC Core', @@ -19,6 +21,7 @@ class XMP { 'pdfx': 'PDF/X', 'photomechanic': 'Photo Mechanic', 'photoshop': 'Photoshop', + 'plus': 'PLUS', 'tiff': 'TIFF', 'xmp': 'Basic', 'xmpBJ': 'Basic Job Ticket', diff --git a/lib/widgets/about/licenses.dart b/lib/widgets/about/licenses.dart index 3138ee81c..583366ab6 100644 --- a/lib/widgets/about/licenses.dart +++ b/lib/widgets/about/licenses.dart @@ -87,6 +87,7 @@ class _LicensesState extends State { Widget _buildHeader() { return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsetsDirectional.only(start: 8), diff --git a/lib/widgets/collection/grid/list_section_layout.dart b/lib/widgets/collection/grid/list_section_layout.dart index 540beee50..34665e056 100644 --- a/lib/widgets/collection/grid/list_section_layout.dart +++ b/lib/widgets/collection/grid/list_section_layout.dart @@ -3,7 +3,6 @@ import 'dart:math'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/collection/grid/header_generic.dart'; -import 'package:aves/widgets/collection/thumbnail_collection.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -15,14 +14,14 @@ class SectionedListLayoutProvider extends StatelessWidget { final Widget Function(ImageEntry entry) thumbnailBuilder; final Widget child; - SectionedListLayoutProvider({ + const SectionedListLayoutProvider({ @required this.collection, @required this.scrollableWidth, @required this.tileExtent, + @required this.columnCount, @required this.thumbnailBuilder, @required this.child, - }) : assert(scrollableWidth != 0), - columnCount = max((scrollableWidth / tileExtent).round(), ThumbnailCollection.columnCountMin); + }) : assert(scrollableWidth != 0); @override Widget build(BuildContext context) { diff --git a/lib/widgets/collection/thumbnail_collection.dart b/lib/widgets/collection/thumbnail_collection.dart index d1c1fa12d..59343b08b 100644 --- a/lib/widgets/collection/thumbnail_collection.dart +++ b/lib/widgets/collection/thumbnail_collection.dart @@ -31,9 +31,9 @@ class ThumbnailCollection extends StatelessWidget { final ValueNotifier _isScrollingNotifier = ValueNotifier(false); final GlobalKey _scrollableKey = GlobalKey(); - static const columnCountMin = 2; static const columnCountDefault = 4; static const extentMin = 46.0; + static const spacing = 0.0; @override Widget build(BuildContext context) { @@ -47,11 +47,10 @@ class ThumbnailCollection extends StatelessWidget { final tileExtentManager = TileExtentManager( settingsRouteKey: context.currentRouteName, - columnCountMin: columnCountMin, + extentNotifier: _tileExtentNotifier, columnCountDefault: columnCountDefault, extentMin: extentMin, - extentNotifier: _tileExtentNotifier, - spacing: 0, + spacing: spacing, )..applyTileExtent(viewportSize: viewportSize); final cacheExtent = tileExtentManager.getEffectiveExtentMax(viewportSize) * 2; @@ -77,7 +76,18 @@ class ThumbnailCollection extends StatelessWidget { scrollableKey: _scrollableKey, appBarHeightNotifier: _appBarHeightNotifier, viewportSize: viewportSize, - showScaledGrid: true, + gridBuilder: (center, extent, child) => CustomPaint( + // painting the thumbnail half-border on top of the grid yields artifacts, + // so we use a `foregroundPainter` to cover them instead + foregroundPainter: GridPainter( + center: center, + extent: extent, + spacing: tileExtentManager.spacing, + strokeWidth: DecoratedThumbnail.borderWidth * 2, + color: DecoratedThumbnail.borderColor, + ), + child: child, + ), scaledBuilder: (entry, extent) => DecoratedThumbnail( entry: entry, extent: extent, @@ -98,6 +108,7 @@ class ThumbnailCollection extends StatelessWidget { collection: collection, scrollableWidth: viewportSize.width, tileExtent: tileExtent, + columnCount: tileExtentManager.getEffectiveColumnCountForExtent(viewportSize, tileExtent), thumbnailBuilder: (entry) => GridThumbnail( key: ValueKey(entry.contentId), collection: collection, diff --git a/lib/widgets/common/scaling.dart b/lib/widgets/common/scaling.dart index 9f1cc5cb1..6e74ed431 100644 --- a/lib/widgets/common/scaling.dart +++ b/lib/widgets/common/scaling.dart @@ -2,7 +2,6 @@ import 'dart:math'; import 'dart:ui' as ui; import 'package:aves/theme/durations.dart'; -import 'package:aves/widgets/collection/thumbnail/decorated.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/common/tile_extent_manager.dart'; import 'package:flutter/material.dart'; @@ -20,7 +19,7 @@ class GridScaleGestureDetector extends StatefulWidget { final GlobalKey scrollableKey; final ValueNotifier appBarHeightNotifier; final Size viewportSize; - final bool showScaledGrid; + final Widget Function(Offset center, double extent, Widget child) gridBuilder; final Widget Function(T item, double extent) scaledBuilder; final Rect Function(BuildContext context, T item) getScaledItemTileRect; final void Function(T item) onScaled; @@ -31,7 +30,7 @@ class GridScaleGestureDetector extends StatefulWidget { @required this.scrollableKey, @required this.appBarHeightNotifier, @required this.viewportSize, - @required this.showScaledGrid, + this.gridBuilder, @required this.scaledBuilder, @required this.getScaledItemTileRect, @required this.onScaled, @@ -56,10 +55,6 @@ class _GridScaleGestureDetectorState extends State extends State ScaleOverlay( builder: (extent) => widget.scaledBuilder(_metadata.item, extent), center: thumbnailCenter, - gridWidth: gridWidth, - spacing: tileExtentManager.spacing, + viewportWidth: gridWidth, + gridBuilder: widget.gridBuilder, scaledExtentNotifier: _scaledExtentNotifier, - showScaledGrid: widget.showScaledGrid, ), ); Overlay.of(scrollableContext).insert(_overlayEntry); @@ -133,7 +127,16 @@ class _GridScaleGestureDetectorState extends State extends State scaledExtentNotifier; - final bool showScaledGrid; + final Widget Function(Offset center, double extent, Widget child) gridBuilder; const ScaleOverlay({ @required this.builder, @required this.center, - @required this.gridWidth, - @required this.spacing, + @required this.viewportWidth, @required this.scaledExtentNotifier, - @required this.showScaledGrid, + this.gridBuilder, }); @override @@ -180,7 +181,7 @@ class _ScaleOverlayState extends State { Offset get center => widget.center; - double get gridWidth => widget.gridWidth; + double get gridWidth => widget.viewportWidth; @override void initState() { @@ -241,16 +242,7 @@ class _ScaleOverlayState extends State { ), ], ); - if (widget.showScaledGrid) { - child = CustomPaint( - painter: GridPainter( - center: clampedCenter, - extent: extent, - spacing: widget.spacing, - ), - child: child, - ); - } + child = widget.gridBuilder?.call(clampedCenter, extent, child) ?? child; return child; }, ), @@ -263,31 +255,36 @@ class _ScaleOverlayState extends State { class GridPainter extends CustomPainter { final Offset center; final double extent, spacing; + final double strokeWidth; + final Color color; const GridPainter({ @required this.center, @required this.extent, - @required this.spacing, + this.spacing = 0.0, + this.strokeWidth = 1.0, + @required this.color, }); @override void paint(Canvas canvas, Size size) { + final radius = extent * 3; final paint = Paint() - ..strokeWidth = DecoratedThumbnail.borderWidth + ..strokeWidth = strokeWidth ..shader = ui.Gradient.radial( center, - size.width * .7, + radius, [ - DecoratedThumbnail.borderColor, + color, Colors.transparent, ], [ - min(.5, 2 * extent / size.width), + extent / radius, 1, ], ); void draw(Offset topLeft) { - for (var i = -2; i <= 3; i++) { + for (var i = -1; i <= 2; i++) { final ref = (extent + spacing) * i; canvas.drawLine(Offset(0, topLeft.dy + ref), Offset(size.width, topLeft.dy + ref), paint); canvas.drawLine(Offset(topLeft.dx + ref, 0), Offset(topLeft.dx + ref, size.height), paint); diff --git a/lib/widgets/common/tile_extent_manager.dart b/lib/widgets/common/tile_extent_manager.dart index 5001f84a2..a5e3bc1ac 100644 --- a/lib/widgets/common/tile_extent_manager.dart +++ b/lib/widgets/common/tile_extent_manager.dart @@ -6,15 +6,16 @@ import 'package:flutter/widgets.dart'; class TileExtentManager { final String settingsRouteKey; final int columnCountMin, columnCountDefault; - final double spacing, extentMin; + final double spacing, extentMin, extentMax; final ValueNotifier extentNotifier; const TileExtentManager({ @required this.settingsRouteKey, - @required this.columnCountMin, + @required this.extentNotifier, + this.columnCountMin = 2, @required this.columnCountDefault, @required this.extentMin, - @required this.extentNotifier, + this.extentMax = 300, @required this.spacing, }); @@ -46,7 +47,7 @@ class TileExtentManager { return newExtent; } - double _extentMax(Size viewportSize) => (viewportSize.shortestSide - spacing * (columnCountMin - 1)) / columnCountMin; + double _extentMax(Size viewportSize) => min(extentMax, (viewportSize.shortestSide - spacing * (columnCountMin - 1)) / columnCountMin); double _columnCountForExtent(Size viewportSize, double extent) => (viewportSize.width + spacing) / (extent + spacing); diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index c6a3a7862..fe8df8890 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -37,6 +37,8 @@ class FilterGridPage extends StatelessWidget { final ValueNotifier _tileExtentNotifier = ValueNotifier(0); final GlobalKey _scrollableKey = GlobalKey(); + static const columnCountDefault = 2; + static const extentMin = 60.0; static const spacing = 8.0; FilterGridPage({ @@ -71,10 +73,9 @@ class FilterGridPage extends StatelessWidget { final tileExtentManager = TileExtentManager( settingsRouteKey: settingsRouteKey ?? context.currentRouteName, - columnCountMin: 2, - columnCountDefault: 2, - extentMin: 60, extentNotifier: _tileExtentNotifier, + columnCountDefault: columnCountDefault, + extentMin: extentMin, spacing: spacing, )..applyTileExtent(viewportSize: viewportSize); @@ -98,7 +99,15 @@ class FilterGridPage extends StatelessWidget { scrollableKey: _scrollableKey, appBarHeightNotifier: _appBarHeightNotifier, viewportSize: viewportSize, - showScaledGrid: true, + gridBuilder: (center, extent, child) => CustomPaint( + painter: GridPainter( + center: center, + extent: extent, + spacing: tileExtentManager.spacing, + color: Colors.grey.shade700, + ), + child: child, + ), scaledBuilder: (item, extent) { final filter = item.filter; return SizedBox(