Merge branch 'develop'

This commit is contained in:
Thibault Deckers 2025-05-14 22:20:08 +02:00
commit 5726e7bcc0
15 changed files with 116 additions and 29 deletions

View file

@ -24,4 +24,4 @@ jobs:
- name: 'Checkout Repository' - name: 'Checkout Repository'
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: 'Dependency Review' - name: 'Dependency Review'
uses: actions/dependency-review-action@38ecb5b593bf0eb19e335c03f97670f792489a8b # v4.7.0 uses: actions/dependency-review-action@da24556b548a50705dd671f47852072ea4c105d9 # v4.7.1

View file

@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
## <a id="unreleased"></a>[Unreleased] ## <a id="unreleased"></a>[Unreleased]
## <a id="v1.13.1"></a>[v1.13.1] - 2025-05-14
### Fixed
- albums: show groups to move/copy/export items
- albums: hide grouped albums containing hidden items only
## <a id="v1.13.0"></a>[v1.13.0] - 2025-05-12 ## <a id="v1.13.0"></a>[v1.13.0] - 2025-05-12
### Added ### Added

View file

@ -0,0 +1,4 @@
In v1.13.1:
- group albums
- filter by day of the week
Full changelog available on GitHub

View file

@ -0,0 +1,4 @@
In v1.13.1:
- group albums
- filter by day of the week
Full changelog available on GitHub

View file

@ -445,7 +445,7 @@
"@menuActionStats": {}, "@menuActionStats": {},
"viewDialogSortSectionTitle": "Ordenar", "viewDialogSortSectionTitle": "Ordenar",
"@viewDialogSortSectionTitle": {}, "@viewDialogSortSectionTitle": {},
"viewDialogGroupSectionTitle": "Grupo", "viewDialogGroupSectionTitle": "Secciones",
"@viewDialogGroupSectionTitle": {}, "@viewDialogGroupSectionTitle": {},
"viewDialogLayoutSectionTitle": "Disposición", "viewDialogLayoutSectionTitle": "Disposición",
"@viewDialogLayoutSectionTitle": {}, "@viewDialogLayoutSectionTitle": {},
@ -1402,5 +1402,33 @@
"editEntryLocationDialogTimeShift": "Desplazamiento de tiempo", "editEntryLocationDialogTimeShift": "Desplazamiento de tiempo",
"@editEntryLocationDialogTimeShift": {}, "@editEntryLocationDialogTimeShift": {},
"coordinateFormatDdm": "DDM", "coordinateFormatDdm": "DDM",
"@coordinateFormatDdm": {} "@coordinateFormatDdm": {},
"sortByPath": "Por ruta",
"@sortByPath": {},
"searchFormatSectionTitle": "Formatos",
"@searchFormatSectionTitle": {},
"newGroupDialogTitle": "Nuevo grupo",
"@newGroupDialogTitle": {},
"ungrouped": "No agrupado",
"@ungrouped": {},
"albumTierGroups": "Grupos",
"@albumTierGroups": {},
"groupEmpty": "Sin grupos",
"@groupEmpty": {},
"newGroupDialogNameLabel": "Nombre del grupo",
"@newGroupDialogNameLabel": {},
"createButtonLabel": "CREAR",
"@createButtonLabel": {},
"chipActionGroup": "Agrupar",
"@chipActionGroup": {},
"chipActionCreateGroup": "Crear grupo",
"@chipActionCreateGroup": {},
"groupAlreadyExists": "Ya existe el grupo",
"@groupAlreadyExists": {},
"groupPickerTitle": "Seleccionar grupo",
"@groupPickerTitle": {},
"groupPickerUseThisGroupButton": "Usar este grupo",
"@groupPickerUseThisGroupButton": {},
"sectionNone": "Sin secciones",
"@sectionNone": {}
} }

View file

@ -823,7 +823,7 @@
"@menuActionSlideshow": {}, "@menuActionSlideshow": {},
"menuActionStats": "Estatísticas", "menuActionStats": "Estatísticas",
"@menuActionStats": {}, "@menuActionStats": {},
"viewDialogGroupSectionTitle": "Agrupar", "viewDialogGroupSectionTitle": "Seccións",
"@viewDialogGroupSectionTitle": {}, "@viewDialogGroupSectionTitle": {},
"castDialogTitle": "Dispositivos de emisión", "castDialogTitle": "Dispositivos de emisión",
"@castDialogTitle": {}, "@castDialogTitle": {},
@ -1610,5 +1610,33 @@
"panoramaDisableSensorControl": "Desactivar control do sensor", "panoramaDisableSensorControl": "Desactivar control do sensor",
"@panoramaDisableSensorControl": {}, "@panoramaDisableSensorControl": {},
"settingsHiddenFiltersBanner": "As fotos e vídeos que cadren cos filtros ocultos non se amosarán na súa colección.", "settingsHiddenFiltersBanner": "As fotos e vídeos que cadren cos filtros ocultos non se amosarán na súa colección.",
"@settingsHiddenFiltersBanner": {} "@settingsHiddenFiltersBanner": {},
"createButtonLabel": "CREAR",
"@createButtonLabel": {},
"chipActionGroup": "Agrupar",
"@chipActionGroup": {},
"chipActionCreateGroup": "Crear grupo",
"@chipActionCreateGroup": {},
"albumTierGroups": "Grupos",
"@albumTierGroups": {},
"newGroupDialogTitle": "Novo grupo",
"@newGroupDialogTitle": {},
"newGroupDialogNameLabel": "Nome do grupo",
"@newGroupDialogNameLabel": {},
"groupAlreadyExists": "Xa existe o grupo",
"@groupAlreadyExists": {},
"groupEmpty": "Sen grupos",
"@groupEmpty": {},
"ungrouped": "Non agrupado",
"@ungrouped": {},
"groupPickerTitle": "Escolmar grupo",
"@groupPickerTitle": {},
"groupPickerUseThisGroupButton": "Usar este grupo",
"@groupPickerUseThisGroupButton": {},
"sectionNone": "Sen seccións",
"@sectionNone": {},
"sortByPath": "Por ruta",
"@sortByPath": {},
"searchFormatSectionTitle": "Formatos",
"@searchFormatSectionTitle": {}
} }

View file

@ -144,5 +144,19 @@
"stopTooltip": "עצור", "stopTooltip": "עצור",
"@stopTooltip": {}, "@stopTooltip": {},
"chipActionGoToExplorerPage": "הצג בסייר", "chipActionGoToExplorerPage": "הצג בסייר",
"@chipActionGoToExplorerPage": {} "@chipActionGoToExplorerPage": {},
"chipActionSetCover": "הגדר עטיפה",
"@chipActionSetCover": {},
"chipActionCreateAlbum": "צור אלבום",
"@chipActionCreateAlbum": {},
"chipActionShowCountryStates": "הצג סטטיסטיקות",
"@chipActionShowCountryStates": {},
"createButtonLabel": "צור",
"@createButtonLabel": {},
"chipActionGroup": "קבוצה",
"@chipActionGroup": {},
"chipActionCreateGroup": "צור קבוצה",
"@chipActionCreateGroup": {},
"chipActionCreateVault": "צור כספת",
"@chipActionCreateVault": {}
} }

View file

@ -46,7 +46,7 @@ mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin {
final destinationAlbumFilter = await pickAlbum( final destinationAlbumFilter = await pickAlbum(
context: context, context: context,
moveType: MoveType.export, moveType: MoveType.export,
albumTypes: {AlbumChipType.stored}, albumChipTypes: {AlbumChipType.stored},
initialGroup: null, initialGroup: null,
); );
if (destinationAlbumFilter == null || destinationAlbumFilter is! StoredAlbumFilter) return false; if (destinationAlbumFilter == null || destinationAlbumFilter is! StoredAlbumFilter) return false;
@ -379,7 +379,7 @@ mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin {
final destinationAlbumFilter = await pickAlbum( final destinationAlbumFilter = await pickAlbum(
context: context, context: context,
moveType: moveType, moveType: moveType,
albumTypes: {AlbumChipType.stored}, albumChipTypes: {AlbumChipType.stored},
initialGroup: null, initialGroup: null,
); );
if (destinationAlbumFilter == null || destinationAlbumFilter is! StoredAlbumFilter) return false; if (destinationAlbumFilter == null || destinationAlbumFilter is! StoredAlbumFilter) return false;

View file

@ -40,7 +40,7 @@ import 'package:provider/provider.dart';
Future<AlbumBaseFilter?> pickAlbum({ Future<AlbumBaseFilter?> pickAlbum({
required BuildContext context, required BuildContext context,
required MoveType? moveType, required MoveType? moveType,
required Iterable<AlbumChipType> albumTypes, required Iterable<AlbumChipType> albumChipTypes,
required Uri? initialGroup, required Uri? initialGroup,
}) async { }) async {
final source = context.read<CollectionSource>(); final source = context.read<CollectionSource>();
@ -56,7 +56,7 @@ Future<AlbumBaseFilter?> pickAlbum({
builder: (context) => _AlbumPickPage( builder: (context) => _AlbumPickPage(
source: source, source: source,
moveType: moveType, moveType: moveType,
albumChipTypes: albumTypes, albumChipTypes: albumChipTypes,
initialGroup: initialGroup, initialGroup: initialGroup,
), ),
), ),

View file

@ -97,7 +97,7 @@ class AlbumListPage extends StatelessWidget {
static List<FilterGridItem<AlbumBaseFilter>> getAlbumGridItems( static List<FilterGridItem<AlbumBaseFilter>> getAlbumGridItems(
BuildContext context, BuildContext context,
CollectionSource source, CollectionSource source,
Iterable<AlbumChipType> albumTypes, Iterable<AlbumChipType> albumChipTypes,
Uri? groupUri, Uri? groupUri,
) { ) {
final groupContent = albumGrouping.getDirectChildren(groupUri); final groupContent = albumGrouping.getDirectChildren(groupUri);
@ -110,29 +110,31 @@ class AlbumListPage extends StatelessWidget {
} }
final listedStoredAlbums = <String>{}; final listedStoredAlbums = <String>{};
if (albumTypes.contains(AlbumChipType.stored)) { if (albumChipTypes.contains(AlbumChipType.stored)) {
final allAlbums = source.rawAlbums;
if (groupUri == null) { if (groupUri == null) {
final withinGroups = whereTypeRecursively<StoredAlbumFilter>(groupContent).map((v) => v.album).toSet(); final withinGroups = whereTypeRecursively<StoredAlbumFilter>(groupContent).map((v) => v.album).toSet();
listedStoredAlbums.addAll(source.rawAlbums.whereNot(withinGroups.contains)); listedStoredAlbums.addAll(allAlbums.whereNot(withinGroups.contains));
} else { } else {
listedStoredAlbums.addAll(groupContent.whereType<StoredAlbumFilter>().map((v) => v.album)); // check that group content is listed from source, to prevent displaying hidden content
listedStoredAlbums.addAll(groupContent.whereType<StoredAlbumFilter>().map((v) => v.album).where(allAlbums.contains));
} }
} }
final listedDynamicAlbums = <DynamicAlbumFilter>{}; final listedDynamicAlbums = <DynamicAlbumFilter>{};
if (albumTypes.contains(AlbumChipType.dynamic)) { if (albumChipTypes.contains(AlbumChipType.dynamic)) {
final allDynamicAlbums = dynamicAlbums.all;
if (groupUri == null) { if (groupUri == null) {
final withinGroups = whereTypeRecursively<DynamicAlbumFilter>(groupContent).toSet(); final withinGroups = whereTypeRecursively<DynamicAlbumFilter>(groupContent).toSet();
listedDynamicAlbums.addAll(dynamicAlbums.all.whereNot(withinGroups.contains)); listedDynamicAlbums.addAll(allDynamicAlbums.whereNot(withinGroups.contains));
} else { } else {
listedDynamicAlbums.addAll(groupContent.whereType<DynamicAlbumFilter>()); // check that group content is listed from source, to prevent displaying hidden content
listedDynamicAlbums.addAll(groupContent.whereType<DynamicAlbumFilter>().where(allDynamicAlbums.contains));
} }
} }
final albumGroupFilters = <AlbumGroupFilter>{}; // always show groups, which are needed to navigate to other types
if (albumTypes.contains(AlbumChipType.group)) { final albumGroupFilters = groupContent.whereType<AlbumGroupFilter>().toSet();
albumGroupFilters.addAll(groupContent.whereType<AlbumGroupFilter>());
}
final filters = <AlbumBaseFilter>{ final filters = <AlbumBaseFilter>{
...albumGroupFilters, ...albumGroupFilters,

View file

@ -458,7 +458,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumBaseFilter>
final filter = await pickAlbum( final filter = await pickAlbum(
context: context, context: context,
moveType: null, moveType: null,
albumTypes: {AlbumChipType.group}, albumChipTypes: {AlbumChipType.group},
initialGroup: initialGroup, initialGroup: initialGroup,
); );
if (filter == null) return; if (filter == null) return;

View file

@ -473,7 +473,7 @@ class _FilterSectionedContentState<T extends CollectionFilter> extends State<_Fi
final GlobalKey scrollableKey = GlobalKey(debugLabel: 'filter-grid-page-scrollable'); final GlobalKey scrollableKey = GlobalKey(debugLabel: 'filter-grid-page-scrollable');
FilterGrouping? _grouping; FilterGroupNotifier? _groupNotifier;
@override @override
void initState() { void initState() {
@ -486,7 +486,7 @@ class _FilterSectionedContentState<T extends CollectionFilter> extends State<_Fi
void didChangeDependencies() { void didChangeDependencies() {
super.didChangeDependencies(); super.didChangeDependencies();
_unregisterDependencies(); _unregisterDependencies();
_grouping = context.read<FilterGrouping?>(); _groupNotifier = context.read<FilterGroupNotifier?>();
_registerDependencies(); _registerDependencies();
} }
@ -505,11 +505,11 @@ class _FilterSectionedContentState<T extends CollectionFilter> extends State<_Fi
} }
void _registerDependencies() { void _registerDependencies() {
_grouping?.addListener(_scrollToTop); _groupNotifier?.addListener(_scrollToTop);
} }
void _unregisterDependencies() { void _unregisterDependencies() {
_grouping?.removeListener(_scrollToTop); _groupNotifier?.removeListener(_scrollToTop);
} }
void _registerWidget(_FilterSectionedContent<T> widget) { void _registerWidget(_FilterSectionedContent<T> widget) {

View file

@ -68,7 +68,7 @@ class _DrawerAlbumTabState extends State<DrawerAlbumTab> {
final albumFilter = await pickAlbum( final albumFilter = await pickAlbum(
context: context, context: context,
moveType: null, moveType: null,
albumTypes: AlbumChipType.values, albumChipTypes: AlbumChipType.values,
initialGroup: null, initialGroup: null,
); );
if (albumFilter == null || items.contains(albumFilter)) return; if (albumFilter == null || items.contains(albumFilter)) return;

View file

@ -7,7 +7,7 @@ repository: https://github.com/deckerst/aves
# - play changelog: /whatsnew/whatsnew-en-US # - play changelog: /whatsnew/whatsnew-en-US
# - izzy changelog: /fastlane/metadata/android/en-US/changelogs/XXX01.txt # - izzy changelog: /fastlane/metadata/android/en-US/changelogs/XXX01.txt
# - libre changelog: /fastlane/metadata/android/en-US/changelogs/XXX.txt # - libre changelog: /fastlane/metadata/android/en-US/changelogs/XXX.txt
version: 1.13.0+151 version: 1.13.1+152
publish_to: none publish_to: none
environment: environment:

View file

@ -1,4 +1,4 @@
In v1.13.0: In v1.13.1:
- group albums - group albums
- filter by day of the week - filter by day of the week
Full changelog available on GitHub Full changelog available on GitHub