mirror of
https://github.com/ente-io/ente.git
synced 2025-07-26 03:25:52 +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/collection/collection.dart';
|
||||||
import 'package:photos/models/gallery_type.dart';
|
import 'package:photos/models/gallery_type.dart';
|
||||||
import "package:photos/models/ml/face/person.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/models/selected_files.dart';
|
||||||
import "package:photos/theme/effects.dart";
|
import "package:photos/theme/effects.dart";
|
||||||
import "package:photos/theme/ente_theme.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/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/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";
|
import "package:photos/ui/viewer/gallery/state/selection_state.dart";
|
||||||
|
|
||||||
class FileSelectionOverlayBar extends StatefulWidget {
|
class FileSelectionOverlayBar extends StatefulWidget {
|
||||||
@ -34,10 +37,14 @@ class FileSelectionOverlayBar extends StatefulWidget {
|
|||||||
|
|
||||||
class _FileSelectionOverlayBarState extends State<FileSelectionOverlayBar> {
|
class _FileSelectionOverlayBarState extends State<FileSelectionOverlayBar> {
|
||||||
final ValueNotifier<bool> _hasSelectedFilesNotifier = ValueNotifier(false);
|
final ValueNotifier<bool> _hasSelectedFilesNotifier = ValueNotifier(false);
|
||||||
|
late GalleryType _galleryType;
|
||||||
|
SearchFilterDataProvider? _searchFilterDataProvider;
|
||||||
|
bool? _galleryInitialFilterStillApplied;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
_galleryType = widget.galleryType;
|
||||||
widget.selectedFiles.addListener(_selectedFilesListener);
|
widget.selectedFiles.addListener(_selectedFilesListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,16 +52,46 @@ class _FileSelectionOverlayBarState extends State<FileSelectionOverlayBar> {
|
|||||||
void dispose() {
|
void dispose() {
|
||||||
_hasSelectedFilesNotifier.dispose();
|
_hasSelectedFilesNotifier.dispose();
|
||||||
widget.selectedFiles.removeListener(_selectedFilesListener);
|
widget.selectedFiles.removeListener(_selectedFilesListener);
|
||||||
|
_searchFilterDataProvider?.removeListener(
|
||||||
|
listener: _updateGalleryTypeIfRequired,
|
||||||
|
fromApplied: true,
|
||||||
|
);
|
||||||
super.dispose();
|
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
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
debugPrint(
|
debugPrint(
|
||||||
'$runtimeType building with ${widget.selectedFiles.files.length}',
|
'$runtimeType building with ${widget.selectedFiles.files.length}',
|
||||||
);
|
);
|
||||||
|
|
||||||
return widget.galleryType == GalleryType.homepage
|
return _galleryType == GalleryType.homepage
|
||||||
? _body()
|
? _body()
|
||||||
: PopScope(
|
: PopScope(
|
||||||
canPop: false,
|
canPop: false,
|
||||||
@ -99,7 +136,7 @@ class _FileSelectionOverlayBarState extends State<FileSelectionOverlayBar> {
|
|||||||
),
|
),
|
||||||
child: BottomActionBarWidget(
|
child: BottomActionBarWidget(
|
||||||
selectedFiles: widget.selectedFiles,
|
selectedFiles: widget.selectedFiles,
|
||||||
galleryType: widget.galleryType,
|
galleryType: _galleryType,
|
||||||
collection: widget.collection,
|
collection: widget.collection,
|
||||||
person: widget.person,
|
person: widget.person,
|
||||||
clusterID: widget.clusterID,
|
clusterID: widget.clusterID,
|
||||||
@ -122,6 +159,38 @@ class _FileSelectionOverlayBarState extends State<FileSelectionOverlayBar> {
|
|||||||
_selectedFilesListener() {
|
_selectedFilesListener() {
|
||||||
_hasSelectedFilesNotifier.value = widget.selectedFiles.files.isNotEmpty;
|
_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 {
|
class SelectAllButton extends StatefulWidget {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user