reorganized grid related files
This commit is contained in:
parent
a89de0fb0c
commit
96aedf0dc2
7 changed files with 98 additions and 100 deletions
|
@ -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);
|
|
||||||
}
|
|
|
@ -1,6 +1,6 @@
|
||||||
import 'dart:math' as math;
|
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/foundation.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
42
lib/widgets/album/grid/list_section_layout.dart
Normal file
42
lib/widgets/album/grid/list_section_layout.dart
Normal file
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,13 @@
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:aves/labs/sliver_known_extent_list.dart';
|
|
||||||
import 'package:aves/model/collection_lens.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/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/material.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
|
|
||||||
|
@ -106,43 +110,55 @@ class CollectionListSliver extends StatelessWidget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class SectionLayout {
|
class GridThumbnail extends StatelessWidget {
|
||||||
final dynamic sectionKey;
|
final CollectionLens collection;
|
||||||
final int firstIndex, lastIndex;
|
final int index;
|
||||||
final double minOffset, maxOffset;
|
final ImageEntry entry;
|
||||||
final double headerExtent, tileExtent;
|
final double tileExtent;
|
||||||
final IndexedWidgetBuilder builder;
|
final GestureTapCallback onTap;
|
||||||
|
|
||||||
const SectionLayout({
|
const GridThumbnail({
|
||||||
@required this.sectionKey,
|
Key key,
|
||||||
@required this.firstIndex,
|
this.collection,
|
||||||
@required this.lastIndex,
|
this.index,
|
||||||
@required this.minOffset,
|
this.entry,
|
||||||
@required this.maxOffset,
|
this.tileExtent,
|
||||||
@required this.headerExtent,
|
this.onTap,
|
||||||
@required this.tileExtent,
|
}) : super(key: key);
|
||||||
@required this.builder,
|
|
||||||
});
|
|
||||||
|
|
||||||
bool hasChild(int index) => firstIndex <= index && index <= lastIndex;
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
bool hasChildAtOffset(double scrollOffset) => minOffset <= scrollOffset && scrollOffset <= maxOffset;
|
return GestureDetector(
|
||||||
|
key: ValueKey(entry.uri),
|
||||||
double indexToLayoutOffset(int index) {
|
onTap: () => _goToFullscreen(context),
|
||||||
return minOffset + (index == firstIndex ? 0 : headerExtent + (index - firstIndex - 1) * tileExtent);
|
child: MetaData(
|
||||||
|
metaData: ThumbnailMetadata(index, entry),
|
||||||
|
child: Thumbnail(
|
||||||
|
entry: entry,
|
||||||
|
extent: tileExtent,
|
||||||
|
heroTag: collection.heroTag(entry),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
double indexToMaxScrollOffset(int index) {
|
void _goToFullscreen(BuildContext context) {
|
||||||
return minOffset + headerExtent + (index - firstIndex) * tileExtent;
|
Navigator.push(
|
||||||
}
|
context,
|
||||||
|
TransparentMaterialPageRoute(
|
||||||
int getMinChildIndexForScrollOffset(double scrollOffset) {
|
pageBuilder: (c, a, sa) => MultiFullscreenPage(
|
||||||
scrollOffset -= minOffset + headerExtent;
|
collection: collection,
|
||||||
return firstIndex + (scrollOffset < 0 ? 0 : (scrollOffset / tileExtent).floor());
|
initialEntry: entry,
|
||||||
}
|
),
|
||||||
|
),
|
||||||
int getMaxChildIndexForScrollOffset(double scrollOffset) {
|
);
|
||||||
scrollOffset -= minOffset + headerExtent;
|
|
||||||
return firstIndex + (scrollOffset < 0 ? 0 : (scrollOffset / tileExtent).ceil() - 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
|
@ -2,7 +2,7 @@ import 'dart:math';
|
||||||
import 'dart:ui' as ui;
|
import 'dart:ui' as ui;
|
||||||
|
|
||||||
import 'package:aves/model/image_entry.dart';
|
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/thumbnail.dart';
|
||||||
import 'package:aves/widgets/album/tile_extent_manager.dart';
|
import 'package:aves/widgets/album/tile_extent_manager.dart';
|
||||||
import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart';
|
import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart';
|
||||||
|
|
|
@ -2,10 +2,10 @@ import 'package:aves/model/collection_lens.dart';
|
||||||
import 'package:aves/model/filters/favourite.dart';
|
import 'package:aves/model/filters/favourite.dart';
|
||||||
import 'package:aves/model/filters/mime.dart';
|
import 'package:aves/model/filters/mime.dart';
|
||||||
import 'package:aves/model/mime_types.dart';
|
import 'package:aves/model/mime_types.dart';
|
||||||
import 'package:aves/widgets/album/collection_app_bar.dart';
|
import 'package:aves/widgets/album/app_bar.dart';
|
||||||
import 'package:aves/widgets/album/collection_list_sliver.dart';
|
|
||||||
import 'package:aves/widgets/album/collection_page.dart';
|
import 'package:aves/widgets/album/collection_page.dart';
|
||||||
import 'package:aves/widgets/album/empty.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/grid/scaling.dart';
|
||||||
import 'package:aves/widgets/album/tile_extent_manager.dart';
|
import 'package:aves/widgets/album/tile_extent_manager.dart';
|
||||||
import 'package:aves/widgets/common/scroll_thumb.dart';
|
import 'package:aves/widgets/common/scroll_thumb.dart';
|
||||||
|
|
Loading…
Reference in a new issue