mirror of
https://github.com/ente-io/ente.git
synced 2025-07-24 04:47:32 +00:00
[mob][photos] Keep selection sheet the same until the initial top level filter of the gallery is removed. Once removed, use GalleryType.searchResult for the selection sheet
This commit is contained in:
parent
802ba55016
commit
43dc2794d7
@ -2,11 +2,14 @@ import 'package:flutter/material.dart';
|
||||
import 'package:photos/models/collection/collection.dart';
|
||||
import 'package:photos/models/gallery_type.dart';
|
||||
import "package:photos/models/ml/face/person.dart";
|
||||
import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart";
|
||||
import 'package:photos/models/selected_files.dart';
|
||||
import "package:photos/theme/effects.dart";
|
||||
import "package:photos/theme/ente_theme.dart";
|
||||
import 'package:photos/ui/components/bottom_action_bar/bottom_action_bar_widget.dart';
|
||||
import "package:photos/ui/viewer/gallery/state/gallery_files_inherited_widget.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/inherited_search_filter_data.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/search_filter_data_provider.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||
|
||||
class FileSelectionOverlayBar extends StatefulWidget {
|
||||
@ -34,10 +37,14 @@ class FileSelectionOverlayBar extends StatefulWidget {
|
||||
|
||||
class _FileSelectionOverlayBarState extends State<FileSelectionOverlayBar> {
|
||||
final ValueNotifier<bool> _hasSelectedFilesNotifier = ValueNotifier(false);
|
||||
late GalleryType _galleryType;
|
||||
SearchFilterDataProvider? _searchFilterDataProvider;
|
||||
bool? _galleryInitialFilterStillApplied;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_galleryType = widget.galleryType;
|
||||
widget.selectedFiles.addListener(_selectedFilesListener);
|
||||
}
|
||||
|
||||
@ -45,16 +52,46 @@ class _FileSelectionOverlayBarState extends State<FileSelectionOverlayBar> {
|
||||
void dispose() {
|
||||
_hasSelectedFilesNotifier.dispose();
|
||||
widget.selectedFiles.removeListener(_selectedFilesListener);
|
||||
_searchFilterDataProvider?.removeListener(
|
||||
listener: _updateGalleryTypeIfRequired,
|
||||
fromApplied: true,
|
||||
);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(covariant FileSelectionOverlayBar oldWidget) {
|
||||
super.didUpdateWidget(oldWidget);
|
||||
_galleryType = widget.galleryType;
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
super.didChangeDependencies();
|
||||
final inheritedSearchFilterData =
|
||||
InheritedSearchFilterData.maybeOf(context);
|
||||
if (inheritedSearchFilterData?.isHierarchicalSearchable ?? false) {
|
||||
_searchFilterDataProvider =
|
||||
inheritedSearchFilterData!.searchFilterDataProvider;
|
||||
|
||||
_searchFilterDataProvider!.removeListener(
|
||||
listener: _updateGalleryTypeIfRequired,
|
||||
fromApplied: true,
|
||||
);
|
||||
_searchFilterDataProvider!.addListener(
|
||||
listener: _updateGalleryTypeIfRequired,
|
||||
toApplied: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
debugPrint(
|
||||
'$runtimeType building with ${widget.selectedFiles.files.length}',
|
||||
);
|
||||
|
||||
return widget.galleryType == GalleryType.homepage
|
||||
return _galleryType == GalleryType.homepage
|
||||
? _body()
|
||||
: PopScope(
|
||||
canPop: false,
|
||||
@ -99,7 +136,7 @@ class _FileSelectionOverlayBarState extends State<FileSelectionOverlayBar> {
|
||||
),
|
||||
child: BottomActionBarWidget(
|
||||
selectedFiles: widget.selectedFiles,
|
||||
galleryType: widget.galleryType,
|
||||
galleryType: _galleryType,
|
||||
collection: widget.collection,
|
||||
person: widget.person,
|
||||
clusterID: widget.clusterID,
|
||||
@ -122,6 +159,38 @@ class _FileSelectionOverlayBarState extends State<FileSelectionOverlayBar> {
|
||||
_selectedFilesListener() {
|
||||
_hasSelectedFilesNotifier.value = widget.selectedFiles.files.isNotEmpty;
|
||||
}
|
||||
|
||||
/// This method is used to update the GalleryType if the initial filter is
|
||||
/// removed from the applied filters. As long as the inital filter is present
|
||||
/// in the applied filters, the gallery type will remain the same as the type
|
||||
/// initally passed in the widget constructor. Once the inital filter is
|
||||
/// removed, the gallery type will be updated to GalleryType.searchResults
|
||||
/// and never be updated again.
|
||||
void _updateGalleryTypeIfRequired() {
|
||||
if (_galleryInitialFilterStillApplied != null &&
|
||||
!_galleryInitialFilterStillApplied!) {
|
||||
return;
|
||||
}
|
||||
|
||||
final appliedFilters = _searchFilterDataProvider!.appliedFilters;
|
||||
final initialFilter = _searchFilterDataProvider!.initialGalleryFilter;
|
||||
bool initalFilterIsInAppliedFiters = false;
|
||||
for (HierarchicalSearchFilter filter in appliedFilters) {
|
||||
if (filter.isSameFilter(initialFilter)) {
|
||||
initalFilterIsInAppliedFiters = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!initalFilterIsInAppliedFiters) {
|
||||
setState(() {
|
||||
_galleryInitialFilterStillApplied = false;
|
||||
_galleryType = GalleryType.searchResults;
|
||||
});
|
||||
} else {
|
||||
_galleryInitialFilterStillApplied = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class SelectAllButton extends StatefulWidget {
|
||||
|
Loading…
x
Reference in New Issue
Block a user