ente/lib/ui/viewer/gallery/component/grid/lazy_grid_view.dart

114 lines
3.2 KiB
Dart
Raw Normal View History

import "dart:async";
import "package:flutter/foundation.dart";
import "package:flutter/material.dart";
import "package:photos/core/configuration.dart";
import "package:photos/core/event_bus.dart";
import "package:photos/events/clear_selections_event.dart";
2023-08-25 04:39:30 +00:00
import 'package:photos/models/file/file.dart';
import "package:photos/models/selected_files.dart";
2023-05-31 19:34:19 +00:00
import "package:photos/ui/viewer/gallery/component/grid/non_recyclable_grid_view_widget.dart";
import "package:photos/ui/viewer/gallery/component/grid/recyclable_grid_view_widget.dart";
import "package:photos/ui/viewer/gallery/gallery.dart";
2023-05-31 19:39:43 +00:00
class LazyGridView extends StatefulWidget {
final String tag;
2023-08-24 16:56:24 +00:00
final List<EnteFile> filesInGroup;
final GalleryLoader asyncLoader;
final SelectedFiles? selectedFiles;
final bool shouldRender;
final bool shouldRecycle;
final int? photoGridSize;
final bool limitSelectionToOne;
const LazyGridView(
this.tag,
2023-05-31 20:04:57 +00:00
this.filesInGroup,
this.asyncLoader,
this.selectedFiles,
this.shouldRender,
this.shouldRecycle,
this.photoGridSize, {
this.limitSelectionToOne = false,
Key? key,
}) : super(key: key);
@override
2023-05-31 19:39:43 +00:00
State<LazyGridView> createState() => _LazyGridViewState();
}
2023-05-31 19:39:43 +00:00
class _LazyGridViewState extends State<LazyGridView> {
late bool _shouldRender;
int? _currentUserID;
late StreamSubscription<ClearSelectionsEvent> _clearSelectionsEvent;
@override
void initState() {
_shouldRender = widget.shouldRender;
_currentUserID = Configuration.instance.getUserID();
widget.selectedFiles?.addListener(_selectedFilesListener);
_clearSelectionsEvent =
Bus.instance.on<ClearSelectionsEvent>().listen((event) {
if (mounted) {
setState(() {});
}
});
super.initState();
}
@override
void dispose() {
widget.selectedFiles?.removeListener(_selectedFilesListener);
_clearSelectionsEvent.cancel();
2023-07-12 10:32:37 +00:00
super.dispose();
}
@override
2023-05-31 19:39:43 +00:00
void didUpdateWidget(LazyGridView oldWidget) {
super.didUpdateWidget(oldWidget);
2023-05-31 20:04:57 +00:00
if (!listEquals(widget.filesInGroup, oldWidget.filesInGroup)) {
_shouldRender = widget.shouldRender;
}
}
@override
Widget build(BuildContext context) {
if (widget.shouldRecycle) {
return RecyclableGridViewWidget(
shouldRender: _shouldRender,
2023-05-31 20:04:57 +00:00
filesInGroup: widget.filesInGroup,
photoGridSize: widget.photoGridSize!,
limitSelectionToOne: widget.limitSelectionToOne,
tag: widget.tag,
asyncLoader: widget.asyncLoader,
selectedFiles: widget.selectedFiles,
currentUserID: _currentUserID,
);
} else {
return NonRecyclableGridViewWidget(
shouldRender: _shouldRender,
2023-05-31 20:04:57 +00:00
filesInGroup: widget.filesInGroup,
photoGridSize: widget.photoGridSize!,
limitSelectionToOne: widget.limitSelectionToOne,
tag: widget.tag,
asyncLoader: widget.asyncLoader,
selectedFiles: widget.selectedFiles,
currentUserID: _currentUserID,
);
}
}
void _selectedFilesListener() {
bool shouldRefresh = false;
2023-05-31 20:04:57 +00:00
for (final file in widget.filesInGroup) {
if (widget.selectedFiles!.isPartOfLastSelected(file)) {
shouldRefresh = true;
}
}
if (shouldRefresh && mounted) {
setState(() {});
}
}
}