diff --git a/lib/widgets/album/collection_app_bar.dart b/lib/widgets/album/app_bar.dart similarity index 100% rename from lib/widgets/album/collection_app_bar.dart rename to lib/widgets/album/app_bar.dart diff --git a/lib/widgets/album/collection_section.dart b/lib/widgets/album/collection_section.dart deleted file mode 100644 index 1c3732ea3..000000000 --- a/lib/widgets/album/collection_section.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:aves/model/collection_lens.dart'; -import 'package:aves/model/image_entry.dart'; -import 'package:aves/widgets/album/grid/header_album.dart'; -import 'package:aves/widgets/album/thumbnail.dart'; -import 'package:aves/widgets/album/transparent_material_page_route.dart'; -import 'package:aves/widgets/fullscreen/fullscreen_page.dart'; -import 'package:flutter/material.dart'; - -class GridThumbnail extends StatelessWidget { - final CollectionLens collection; - final int index; - final ImageEntry entry; - final double tileExtent; - final GestureTapCallback onTap; - - const GridThumbnail({ - Key key, - this.collection, - this.index, - this.entry, - this.tileExtent, - this.onTap, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return GestureDetector( - key: ValueKey(entry.uri), - onTap: () => _goToFullscreen(context), - child: MetaData( - metaData: ThumbnailMetadata(index, entry), - child: Thumbnail( - entry: entry, - extent: tileExtent, - heroTag: collection.heroTag(entry), - ), - ), - ); - } - - void _goToFullscreen(BuildContext context) { - Navigator.push( - context, - TransparentMaterialPageRoute( - pageBuilder: (c, a, sa) => MultiFullscreenPage( - collection: collection, - initialEntry: entry, - ), - ), - ); - } -} - -// metadata to identify entry from RenderObject hit test during collection scaling -class ThumbnailMetadata { - final int index; - final ImageEntry entry; - - const ThumbnailMetadata(this.index, this.entry); -} diff --git a/lib/labs/sliver_known_extent_list.dart b/lib/widgets/album/grid/list_known_extent.dart similarity index 99% rename from lib/labs/sliver_known_extent_list.dart rename to lib/widgets/album/grid/list_known_extent.dart index 769ade9b2..21b75b769 100644 --- a/lib/labs/sliver_known_extent_list.dart +++ b/lib/widgets/album/grid/list_known_extent.dart @@ -1,6 +1,6 @@ import 'dart:math' as math; -import 'package:aves/widgets/album/collection_list_sliver.dart'; +import 'package:aves/widgets/album/grid/list_section_layout.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; diff --git a/lib/widgets/album/grid/list_section_layout.dart b/lib/widgets/album/grid/list_section_layout.dart new file mode 100644 index 000000000..0292397d2 --- /dev/null +++ b/lib/widgets/album/grid/list_section_layout.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +class SectionLayout { + final dynamic sectionKey; + final int firstIndex, lastIndex; + final double minOffset, maxOffset; + final double headerExtent, tileExtent; + final IndexedWidgetBuilder builder; + + const SectionLayout({ + @required this.sectionKey, + @required this.firstIndex, + @required this.lastIndex, + @required this.minOffset, + @required this.maxOffset, + @required this.headerExtent, + @required this.tileExtent, + @required this.builder, + }); + + bool hasChild(int index) => firstIndex <= index && index <= lastIndex; + + bool hasChildAtOffset(double scrollOffset) => minOffset <= scrollOffset && scrollOffset <= maxOffset; + + double indexToLayoutOffset(int index) { + return minOffset + (index == firstIndex ? 0 : headerExtent + (index - firstIndex - 1) * tileExtent); + } + + double indexToMaxScrollOffset(int index) { + return minOffset + headerExtent + (index - firstIndex) * tileExtent; + } + + int getMinChildIndexForScrollOffset(double scrollOffset) { + scrollOffset -= minOffset + headerExtent; + return firstIndex + (scrollOffset < 0 ? 0 : (scrollOffset / tileExtent).floor()); + } + + int getMaxChildIndexForScrollOffset(double scrollOffset) { + scrollOffset -= minOffset + headerExtent; + return firstIndex + (scrollOffset < 0 ? 0 : (scrollOffset / tileExtent).ceil() - 1); + } +} diff --git a/lib/widgets/album/collection_list_sliver.dart b/lib/widgets/album/grid/list_sliver.dart similarity index 71% rename from lib/widgets/album/collection_list_sliver.dart rename to lib/widgets/album/grid/list_sliver.dart index daf365409..3cb88f5bf 100644 --- a/lib/widgets/album/collection_list_sliver.dart +++ b/lib/widgets/album/grid/list_sliver.dart @@ -1,9 +1,13 @@ import 'dart:math'; -import 'package:aves/labs/sliver_known_extent_list.dart'; import 'package:aves/model/collection_lens.dart'; -import 'package:aves/widgets/album/collection_section.dart'; +import 'package:aves/model/image_entry.dart'; import 'package:aves/widgets/album/grid/header_generic.dart'; +import 'package:aves/widgets/album/grid/list_known_extent.dart'; +import 'package:aves/widgets/album/grid/list_section_layout.dart'; +import 'package:aves/widgets/album/thumbnail.dart'; +import 'package:aves/widgets/album/transparent_material_page_route.dart'; +import 'package:aves/widgets/fullscreen/fullscreen_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -106,43 +110,55 @@ class CollectionListSliver extends StatelessWidget { } } -class SectionLayout { - final dynamic sectionKey; - final int firstIndex, lastIndex; - final double minOffset, maxOffset; - final double headerExtent, tileExtent; - final IndexedWidgetBuilder builder; +class GridThumbnail extends StatelessWidget { + final CollectionLens collection; + final int index; + final ImageEntry entry; + final double tileExtent; + final GestureTapCallback onTap; - const SectionLayout({ - @required this.sectionKey, - @required this.firstIndex, - @required this.lastIndex, - @required this.minOffset, - @required this.maxOffset, - @required this.headerExtent, - @required this.tileExtent, - @required this.builder, - }); + const GridThumbnail({ + Key key, + this.collection, + this.index, + this.entry, + this.tileExtent, + this.onTap, + }) : super(key: key); - bool hasChild(int index) => firstIndex <= index && index <= lastIndex; - - bool hasChildAtOffset(double scrollOffset) => minOffset <= scrollOffset && scrollOffset <= maxOffset; - - double indexToLayoutOffset(int index) { - return minOffset + (index == firstIndex ? 0 : headerExtent + (index - firstIndex - 1) * tileExtent); + @override + Widget build(BuildContext context) { + return GestureDetector( + key: ValueKey(entry.uri), + onTap: () => _goToFullscreen(context), + child: MetaData( + metaData: ThumbnailMetadata(index, entry), + child: Thumbnail( + entry: entry, + extent: tileExtent, + heroTag: collection.heroTag(entry), + ), + ), + ); } - double indexToMaxScrollOffset(int index) { - return minOffset + headerExtent + (index - firstIndex) * tileExtent; - } - - int getMinChildIndexForScrollOffset(double scrollOffset) { - scrollOffset -= minOffset + headerExtent; - return firstIndex + (scrollOffset < 0 ? 0 : (scrollOffset / tileExtent).floor()); - } - - int getMaxChildIndexForScrollOffset(double scrollOffset) { - scrollOffset -= minOffset + headerExtent; - return firstIndex + (scrollOffset < 0 ? 0 : (scrollOffset / tileExtent).ceil() - 1); + void _goToFullscreen(BuildContext context) { + Navigator.push( + context, + TransparentMaterialPageRoute( + pageBuilder: (c, a, sa) => MultiFullscreenPage( + collection: collection, + initialEntry: entry, + ), + ), + ); } } + +// metadata to identify entry from RenderObject hit test during collection scaling +class ThumbnailMetadata { + final int index; + final ImageEntry entry; + + const ThumbnailMetadata(this.index, this.entry); +} diff --git a/lib/widgets/album/grid/scaling.dart b/lib/widgets/album/grid/scaling.dart index cc90ac6c9..a1908573f 100644 --- a/lib/widgets/album/grid/scaling.dart +++ b/lib/widgets/album/grid/scaling.dart @@ -2,7 +2,7 @@ import 'dart:math'; import 'dart:ui' as ui; import 'package:aves/model/image_entry.dart'; -import 'package:aves/widgets/album/collection_section.dart'; +import 'package:aves/widgets/album/grid/list_sliver.dart'; import 'package:aves/widgets/album/thumbnail.dart'; import 'package:aves/widgets/album/tile_extent_manager.dart'; import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart'; diff --git a/lib/widgets/album/thumbnail_collection.dart b/lib/widgets/album/thumbnail_collection.dart index bd98a5735..dd61e1481 100644 --- a/lib/widgets/album/thumbnail_collection.dart +++ b/lib/widgets/album/thumbnail_collection.dart @@ -2,10 +2,10 @@ import 'package:aves/model/collection_lens.dart'; import 'package:aves/model/filters/favourite.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/mime_types.dart'; -import 'package:aves/widgets/album/collection_app_bar.dart'; -import 'package:aves/widgets/album/collection_list_sliver.dart'; +import 'package:aves/widgets/album/app_bar.dart'; import 'package:aves/widgets/album/collection_page.dart'; import 'package:aves/widgets/album/empty.dart'; +import 'package:aves/widgets/album/grid/list_sliver.dart'; import 'package:aves/widgets/album/grid/scaling.dart'; import 'package:aves/widgets/album/tile_extent_manager.dart'; import 'package:aves/widgets/common/scroll_thumb.dart';