mirror of
https://github.com/immich-app/immich.git
synced 2025-07-09 03:04:16 -04:00
Exernalize multiselect state
This commit is contained in:
parent
6b84534632
commit
3c807ae86e
@ -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
|
||||||
|
@ -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) ...[
|
||||||
|
Loading…
x
Reference in New Issue
Block a user