Merge pull request #661 from ente-io/toggle-select-all-improvement
Toggle select all improvement
This commit is contained in:
commit
98e7f2c6df
1 changed files with 37 additions and 34 deletions
|
@ -62,8 +62,9 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
|
||||||
StreamSubscription<FilesUpdatedEvent> _reloadEventSubscription;
|
StreamSubscription<FilesUpdatedEvent> _reloadEventSubscription;
|
||||||
StreamSubscription<int> _currentIndexSubscription;
|
StreamSubscription<int> _currentIndexSubscription;
|
||||||
bool _shouldRender;
|
bool _shouldRender;
|
||||||
final ValueNotifier<bool> _shouldSelectAll = ValueNotifier(false);
|
final ValueNotifier<bool> _toggleSelectAllFromDay = ValueNotifier(false);
|
||||||
final ValueNotifier<bool> _showSelectAllButton = ValueNotifier(false);
|
final ValueNotifier<bool> _showSelectAllButton = ValueNotifier(false);
|
||||||
|
final ValueNotifier<bool> _areAllFromDaySelected = ValueNotifier(false);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
@ -161,6 +162,7 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
|
||||||
_reloadEventSubscription.cancel();
|
_reloadEventSubscription.cancel();
|
||||||
_currentIndexSubscription.cancel();
|
_currentIndexSubscription.cancel();
|
||||||
widget.selectedFiles.removeListener(_selectedFilesListener);
|
widget.selectedFiles.removeListener(_selectedFilesListener);
|
||||||
|
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,7 +195,7 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
|
||||||
ValueListenableBuilder(
|
ValueListenableBuilder(
|
||||||
valueListenable: _showSelectAllButton,
|
valueListenable: _showSelectAllButton,
|
||||||
builder: (context, value, _) {
|
builder: (context, value, _) {
|
||||||
return widget.selectedFiles.files.isEmpty
|
return !value
|
||||||
? const SizedBox.shrink()
|
? const SizedBox.shrink()
|
||||||
: GestureDetector(
|
: GestureDetector(
|
||||||
behavior: HitTestBehavior.translucent,
|
behavior: HitTestBehavior.translucent,
|
||||||
|
@ -201,7 +203,7 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
|
||||||
width: 48,
|
width: 48,
|
||||||
height: 44,
|
height: 44,
|
||||||
child: ValueListenableBuilder(
|
child: ValueListenableBuilder(
|
||||||
valueListenable: _shouldSelectAll,
|
valueListenable: _areAllFromDaySelected,
|
||||||
builder: (context, value, _) {
|
builder: (context, value, _) {
|
||||||
return value
|
return value
|
||||||
? const Icon(
|
? const Icon(
|
||||||
|
@ -218,7 +220,10 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
_shouldSelectAll.value = !_shouldSelectAll.value;
|
//this value has no significance
|
||||||
|
//changing only to notify the listeners
|
||||||
|
_toggleSelectAllFromDay.value =
|
||||||
|
!_toggleSelectAllFromDay.value;
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
@ -244,7 +249,8 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
|
||||||
widget.selectedFiles,
|
widget.selectedFiles,
|
||||||
index == 0,
|
index == 0,
|
||||||
_files.length > kRecycleLimit,
|
_files.length > kRecycleLimit,
|
||||||
_shouldSelectAll,
|
_toggleSelectAllFromDay,
|
||||||
|
_areAllFromDaySelected,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -255,13 +261,6 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _selectedFilesListener() {
|
void _selectedFilesListener() {
|
||||||
final filesOfGirdAsSet = widget.files.toSet();
|
|
||||||
//to disable the 'all selected' state of the icon when every file is
|
|
||||||
//unselected one by one after selecting all using the icon
|
|
||||||
if (!widget.selectedFiles.files
|
|
||||||
.any((element) => filesOfGirdAsSet.contains(element))) {
|
|
||||||
_shouldSelectAll.value = false;
|
|
||||||
}
|
|
||||||
if (widget.selectedFiles.files.isEmpty) {
|
if (widget.selectedFiles.files.isEmpty) {
|
||||||
_showSelectAllButton.value = false;
|
_showSelectAllButton.value = false;
|
||||||
} else {
|
} else {
|
||||||
|
@ -272,21 +271,23 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
|
||||||
|
|
||||||
class LazyLoadingGridView extends StatefulWidget {
|
class LazyLoadingGridView extends StatefulWidget {
|
||||||
final String tag;
|
final String tag;
|
||||||
final List<File> files;
|
final List<File> filesInDay;
|
||||||
final GalleryLoader asyncLoader;
|
final GalleryLoader asyncLoader;
|
||||||
final SelectedFiles selectedFiles;
|
final SelectedFiles selectedFiles;
|
||||||
final bool shouldRender;
|
final bool shouldRender;
|
||||||
final bool shouldRecycle;
|
final bool shouldRecycle;
|
||||||
final ValueNotifier shouldSelectAll;
|
final ValueNotifier toggleSelectAllFromDay;
|
||||||
|
final ValueNotifier areAllFilesSelected;
|
||||||
|
|
||||||
LazyLoadingGridView(
|
LazyLoadingGridView(
|
||||||
this.tag,
|
this.tag,
|
||||||
this.files,
|
this.filesInDay,
|
||||||
this.asyncLoader,
|
this.asyncLoader,
|
||||||
this.selectedFiles,
|
this.selectedFiles,
|
||||||
this.shouldRender,
|
this.shouldRender,
|
||||||
this.shouldRecycle,
|
this.shouldRecycle,
|
||||||
this.shouldSelectAll, {
|
this.toggleSelectAllFromDay,
|
||||||
|
this.areAllFilesSelected, {
|
||||||
Key key,
|
Key key,
|
||||||
}) : super(key: key ?? UniqueKey());
|
}) : super(key: key ?? UniqueKey());
|
||||||
|
|
||||||
|
@ -301,7 +302,6 @@ class _LazyLoadingGridViewState extends State<LazyLoadingGridView> {
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
_shouldRender = widget.shouldRender;
|
_shouldRender = widget.shouldRender;
|
||||||
widget.shouldSelectAll.addListener(_shouldSelectAllListener);
|
|
||||||
widget.selectedFiles.addListener(_selectedFilesListener);
|
widget.selectedFiles.addListener(_selectedFilesListener);
|
||||||
_clearSelectionsEvent =
|
_clearSelectionsEvent =
|
||||||
Bus.instance.on<ClearSelectionsEvent>().listen((event) {
|
Bus.instance.on<ClearSelectionsEvent>().listen((event) {
|
||||||
|
@ -309,21 +309,23 @@ class _LazyLoadingGridViewState extends State<LazyLoadingGridView> {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
widget.toggleSelectAllFromDay.addListener(_toggleSelectAllFromDayListener);
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
widget.selectedFiles.removeListener(_selectedFilesListener);
|
widget.selectedFiles.removeListener(_selectedFilesListener);
|
||||||
widget.shouldSelectAll.removeListener(_shouldSelectAllListener);
|
|
||||||
_clearSelectionsEvent.cancel();
|
_clearSelectionsEvent.cancel();
|
||||||
|
widget.toggleSelectAllFromDay
|
||||||
|
.removeListener(_toggleSelectAllFromDayListener);
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void didUpdateWidget(LazyLoadingGridView oldWidget) {
|
void didUpdateWidget(LazyLoadingGridView oldWidget) {
|
||||||
super.didUpdateWidget(oldWidget);
|
super.didUpdateWidget(oldWidget);
|
||||||
if (!listEquals(widget.files, oldWidget.files)) {
|
if (!listEquals(widget.filesInDay, oldWidget.filesInDay)) {
|
||||||
_shouldRender = widget.shouldRender;
|
_shouldRender = widget.shouldRender;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -350,7 +352,7 @@ class _LazyLoadingGridViewState extends State<LazyLoadingGridView> {
|
||||||
},
|
},
|
||||||
child: _shouldRender
|
child: _shouldRender
|
||||||
? _getGridView()
|
? _getGridView()
|
||||||
: PlaceHolderWidget(widget.files.length),
|
: PlaceHolderWidget(widget.filesInDay.length),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -365,7 +367,7 @@ class _LazyLoadingGridViewState extends State<LazyLoadingGridView> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: PlaceHolderWidget(widget.files.length),
|
child: PlaceHolderWidget(widget.filesInDay.length),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return _getGridView();
|
return _getGridView();
|
||||||
|
@ -378,9 +380,9 @@ class _LazyLoadingGridViewState extends State<LazyLoadingGridView> {
|
||||||
physics:
|
physics:
|
||||||
const NeverScrollableScrollPhysics(), // to disable GridView's scrolling
|
const NeverScrollableScrollPhysics(), // to disable GridView's scrolling
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
return _buildFile(context, widget.files[index]);
|
return _buildFile(context, widget.filesInDay[index]);
|
||||||
},
|
},
|
||||||
itemCount: widget.files.length,
|
itemCount: widget.filesInDay.length,
|
||||||
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
||||||
crossAxisSpacing: 2,
|
crossAxisSpacing: 2,
|
||||||
mainAxisSpacing: 2,
|
mainAxisSpacing: 2,
|
||||||
|
@ -450,9 +452,9 @@ class _LazyLoadingGridViewState extends State<LazyLoadingGridView> {
|
||||||
void _routeToDetailPage(File file, BuildContext context) {
|
void _routeToDetailPage(File file, BuildContext context) {
|
||||||
final page = DetailPage(
|
final page = DetailPage(
|
||||||
DetailPageConfiguration(
|
DetailPageConfiguration(
|
||||||
List.unmodifiable(widget.files),
|
List.unmodifiable(widget.filesInDay),
|
||||||
widget.asyncLoader,
|
widget.asyncLoader,
|
||||||
widget.files.indexOf(file),
|
widget.filesInDay.indexOf(file),
|
||||||
widget.tag,
|
widget.tag,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -460,8 +462,13 @@ class _LazyLoadingGridViewState extends State<LazyLoadingGridView> {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _selectedFilesListener() {
|
void _selectedFilesListener() {
|
||||||
|
if (widget.selectedFiles.files.containsAll(widget.filesInDay.toSet())) {
|
||||||
|
widget.areAllFilesSelected.value = true;
|
||||||
|
} else {
|
||||||
|
widget.areAllFilesSelected.value = false;
|
||||||
|
}
|
||||||
bool shouldRefresh = false;
|
bool shouldRefresh = false;
|
||||||
for (final file in widget.files) {
|
for (final file in widget.filesInDay) {
|
||||||
if (widget.selectedFiles.isPartOfLastSelected(file)) {
|
if (widget.selectedFiles.isPartOfLastSelected(file)) {
|
||||||
shouldRefresh = true;
|
shouldRefresh = true;
|
||||||
}
|
}
|
||||||
|
@ -471,17 +478,13 @@ class _LazyLoadingGridViewState extends State<LazyLoadingGridView> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _shouldSelectAllListener() {
|
void _toggleSelectAllFromDayListener() {
|
||||||
if (widget.shouldSelectAll.value && mounted) {
|
if (widget.selectedFiles.files.containsAll(widget.filesInDay.toSet())) {
|
||||||
setState(() {
|
setState(() {
|
||||||
widget.selectedFiles.selectAll(widget.files.toSet());
|
widget.selectedFiles.unSelectAll(widget.filesInDay.toSet());
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
if (mounted) {
|
widget.selectedFiles.selectAll(widget.filesInDay.toSet());
|
||||||
setState(() {
|
|
||||||
widget.selectedFiles.unSelectAll(widget.files.toSet());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue