Exernalize multiselect state

This commit is contained in:
Matthias Rupp 2022-10-08 13:08:56 +02:00
parent 6b84534632
commit 3c807ae86e
2 changed files with 25 additions and 18 deletions

View File

@ -23,7 +23,6 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
ItemPositionsListener.create(); ItemPositionsListener.create();
bool _scrolling = false; bool _scrolling = false;
bool _multiselect = false;
Set<String> _selectedAssets = HashSet(); Set<String> _selectedAssets = HashSet();
List<AssetResponseDto> get _assets { List<AssetResponseDto> get _assets {
@ -46,8 +45,8 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
.toSet(); .toSet();
} }
void _callSelectionListener() { void _callSelectionListener(bool selectionActive) {
widget.listener?.call(_multiselect, _getSelectedAssets()); widget.listener?.call(selectionActive, _getSelectedAssets());
} }
void _selectAssets(List<AssetResponseDto> assets) { void _selectAssets(List<AssetResponseDto> assets) {
@ -55,9 +54,7 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
for (var e in assets) { for (var e in assets) {
_selectedAssets.add(e.id); _selectedAssets.add(e.id);
} }
_callSelectionListener(true);
_multiselect = true;
_callSelectionListener();
}); });
} }
@ -66,26 +63,20 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
for (var e in assets) { for (var e in assets) {
_selectedAssets.remove(e.id); _selectedAssets.remove(e.id);
} }
_callSelectionListener(_selectedAssets.isNotEmpty);
if (_selectedAssets.isEmpty) {
_multiselect = false;
}
_callSelectionListener();
}); });
} }
void _deselectAll() { void _deselectAll() {
setState(() { setState(() {
_multiselect = false;
_selectedAssets.clear(); _selectedAssets.clear();
}); });
_callSelectionListener(); _callSelectionListener(false);
} }
bool _allAssetsSelected(List<AssetResponseDto> assets) { bool _allAssetsSelected(List<AssetResponseDto> assets) {
return _multiselect && return widget.selectionActive &&
assets.firstWhereOrNull((e) => !_selectedAssets.contains(e.id)) == null; assets.firstWhereOrNull((e) => !_selectedAssets.contains(e.id)) == null;
} }
@ -104,7 +95,7 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
return ThumbnailImage( return ThumbnailImage(
asset: asset, asset: asset,
assetList: _assets, assetList: _assets,
multiselectEnabled: _multiselect, multiselectEnabled: widget.selectionActive,
isSelected: _selectedAssets.contains(asset.id), isSelected: _selectedAssets.contains(asset.id),
onSelect: () => _selectAssets([asset]), onSelect: () => _selectAssets([asset]),
onDeselect: () => _deselectAssets([asset]), onDeselect: () => _deselectAssets([asset]),
@ -137,7 +128,7 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
BuildContext context, String title, List<AssetResponseDto> assets) { BuildContext context, String title, List<AssetResponseDto> assets) {
return DailyTitleText( return DailyTitleText(
isoDate: title, isoDate: title,
multiselectEnabled: _multiselect, multiselectEnabled: widget.selectionActive,
onSelect: () => _selectAssets(assets), onSelect: () => _selectAssets(assets),
onDeselect: () => _deselectAssets(assets), onDeselect: () => _deselectAssets(assets),
selected: _allAssetsSelected(assets), selected: _allAssetsSelected(assets),
@ -227,12 +218,23 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
); );
} }
@override
void didUpdateWidget(ImmichAssetGrid oldWidget) {
super.didUpdateWidget(oldWidget);
if (!widget.selectionActive) {
setState(() {
_selectedAssets.clear();
});
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
children: [ children: [
_buildAssetGrid(), _buildAssetGrid(),
if (_multiselect) _buildMultiSelectIndicator(), if (widget.selectionActive) _buildMultiSelectIndicator(),
], ],
); );
} }
@ -244,6 +246,7 @@ class ImmichAssetGrid extends StatefulWidget {
final double margin; final double margin;
final bool showStorageIndicator; final bool showStorageIndicator;
final ImmichAssetGridSelectionListener? listener; final ImmichAssetGridSelectionListener? listener;
final bool selectionActive;
ImmichAssetGrid({ ImmichAssetGrid({
super.key, super.key,
@ -252,6 +255,7 @@ class ImmichAssetGrid extends StatefulWidget {
required this.showStorageIndicator, required this.showStorageIndicator,
this.listener, this.listener,
this.margin = 5.0, this.margin = 5.0,
this.selectionActive = false
}); });
@override @override

View File

@ -48,10 +48,12 @@ class HomePage extends HookConsumerWidget {
void onShareAssets() { void onShareAssets() {
ref.watch(shareServiceProvider).shareAssets(selection.value.toList()); ref.watch(shareServiceProvider).shareAssets(selection.value.toList());
multiselectEnabled.value = false;
} }
void onDelete() { void onDelete() {
ref.watch(assetProvider.notifier).deleteAssets(selection.value); ref.watch(assetProvider.notifier).deleteAssets(selection.value);
multiselectEnabled.value = false;
} }
return SafeArea( return SafeArea(
@ -82,6 +84,7 @@ class HomePage extends HookConsumerWidget {
showStorageIndicator: appSettingService showStorageIndicator: appSettingService
.getSetting(AppSettingsEnum.storageIndicator), .getSetting(AppSettingsEnum.storageIndicator),
listener: selectionListener, listener: selectionListener,
selectionActive: multiselectEnabled.value,
), ),
), ),
if (multiselectEnabled.value) ...[ if (multiselectEnabled.value) ...[