Show draggable scrollbar only for galleries with a sufficient number of entries

This commit is contained in:
Vishnu Mohandas 2020-11-22 15:15:33 +05:30
parent a1e68d54a6
commit 08bb9e0870

View file

@ -47,13 +47,16 @@ class _GalleryState extends State<Gallery> {
final Logger _logger = Logger("Gallery");
final List<List<File>> _collatedFiles = List<List<File>>();
final _scrollController = ItemScrollController();
final _itemScrollController = ItemScrollController();
final _itemPositionsListener = ItemPositionsListener.create();
final _scrollKey = GlobalKey<DraggableScrollbarState>();
ScrollController _scrollController = ScrollController();
double _scrollOffset = 0;
bool _requiresLoad = false;
bool _hasLoadedAll = false;
bool _isLoadingNext = false;
bool _hasDraggableScrollbar = false;
List<File> _files;
int _lastIndex = 0;
@ -70,7 +73,9 @@ class _GalleryState extends State<Gallery> {
});
}
widget.selectedFiles.addListener(() {
setState(() {});
setState(() {
_saveScrollPosition();
});
});
if (widget.asyncLoader == null || widget.shouldLoadAll) {
_hasLoadedAll = true;
@ -119,6 +124,17 @@ class _GalleryState extends State<Gallery> {
_collateFiles();
final itemCount =
_collatedFiles.length + (widget.headerWidget == null ? 1 : 2);
_hasDraggableScrollbar = itemCount > 25 || _files.length > 50;
if (!_hasDraggableScrollbar) {
_scrollController = ScrollController(initialScrollOffset: _scrollOffset);
return ListView.builder(
itemCount: itemCount,
itemBuilder: _buildListItem,
controller: _scrollController,
cacheExtent: 1500,
addAutomaticKeepAlives: true,
);
}
return DraggableScrollbar.semicircle(
key: _scrollKey,
initialScrollIndex: _lastIndex,
@ -143,12 +159,12 @@ class _GalleryState extends State<Gallery> {
return;
}
_lastIndex = index;
_scrollController.jumpTo(index: index);
_itemScrollController.jumpTo(index: index);
},
child: ScrollablePositionedList.builder(
itemCount: itemCount,
itemBuilder: _buildListItem,
itemScrollController: _scrollController,
itemScrollController: _itemScrollController,
initialScrollIndex: _lastIndex,
minCacheExtent: 1500,
addAutomaticKeepAlives: true,
@ -202,6 +218,7 @@ class _GalleryState extends State<Gallery> {
widget.asyncLoader(_files[_files.length - 1], kLoadLimit).then((files) {
setState(() {
_isLoadingNext = false;
_saveScrollPosition();
if (files.length < kLoadLimit) {
_hasLoadedAll = true;
}
@ -210,6 +227,10 @@ class _GalleryState extends State<Gallery> {
});
}
void _saveScrollPosition() {
_scrollOffset = _scrollController.offset;
}
Widget _getDay(int timestamp) {
var date = DateTime.fromMicrosecondsSinceEpoch(timestamp);
var title = getDayAndMonth(date);