From 14e00d78b4fed760770d852286dde4295e852ae3 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 18 Feb 2022 16:10:19 +0900 Subject: [PATCH] bin: size in drawer --- lib/l10n/app_en.arb | 1 + lib/l10n/app_fr.arb | 1 + lib/l10n/app_ko.arb | 1 + lib/model/filters/trash.dart | 2 +- lib/widgets/common/action_mixins/size_aware.dart | 2 +- lib/widgets/drawer/app_drawer.dart | 9 +++++++-- lib/widgets/drawer/collection_nav_tile.dart | 16 ++++++++++++++-- untranslated.json | 4 ++++ 8 files changed, 30 insertions(+), 6 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 1a1990cc3..d71b62195 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -109,6 +109,7 @@ "entryInfoActionEditTags": "Edit tags", "entryInfoActionRemoveMetadata": "Remove metadata", + "filterBinLabel": "Recycle bin", "filterFavouriteLabel": "Favourite", "filterLocationEmptyLabel": "Unlocated", "filterTagEmptyLabel": "Untagged", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index f56873916..b8f9bbc9e 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -81,6 +81,7 @@ "entryInfoActionEditTags": "Modifier les libellés", "entryInfoActionRemoveMetadata": "Retirer les métadonnées", + "filterBinLabel": "Corbeille", "filterFavouriteLabel": "Favori", "filterLocationEmptyLabel": "Sans lieu", "filterTagEmptyLabel": "Sans libellé", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 17664e153..b8bcf8e73 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -81,6 +81,7 @@ "entryInfoActionEditTags": "태그 수정", "entryInfoActionRemoveMetadata": "메타데이터 삭제", + "filterBinLabel": "휴지통", "filterFavouriteLabel": "즐겨찾기", "filterLocationEmptyLabel": "장소 없음", "filterTagEmptyLabel": "태그 없음", diff --git a/lib/model/filters/trash.dart b/lib/model/filters/trash.dart index b2e9da0c8..a8f902c85 100644 --- a/lib/model/filters/trash.dart +++ b/lib/model/filters/trash.dart @@ -25,7 +25,7 @@ class TrashFilter extends CollectionFilter { String get universalLabel => type; @override - String getLabel(BuildContext context) => context.l10n.binPageTitle; + String getLabel(BuildContext context) => context.l10n.filterBinLabel; @override Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(AIcons.bin, size: size); diff --git a/lib/widgets/common/action_mixins/size_aware.dart b/lib/widgets/common/action_mixins/size_aware.dart index 35c880bd5..bb6a983c4 100644 --- a/lib/widgets/common/action_mixins/size_aware.dart +++ b/lib/widgets/common/action_mixins/size_aware.dart @@ -29,7 +29,7 @@ mixin SizeAwareMixin { if (free == null) return true; late int needed; - int sumSize(sum, entry) => sum + entry.sizeBytes ?? 0; + int sumSize(sum, entry) => sum + (entry.sizeBytes ?? 0); switch (moveType) { case MoveType.copy: case MoveType.export: diff --git a/lib/widgets/drawer/app_drawer.dart b/lib/widgets/drawer/app_drawer.dart index 45665b918..2d08bb60a 100644 --- a/lib/widgets/drawer/app_drawer.dart +++ b/lib/widgets/drawer/app_drawer.dart @@ -11,6 +11,7 @@ import 'package:aves/model/source/tag.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/file_utils.dart'; import 'package:aves/widgets/about/about_page.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/media_query.dart'; @@ -56,7 +57,7 @@ class AppDrawer extends StatelessWidget { ..._buildPageLinks(context), if (settings.enableBin) ...[ const Divider(), - binTile, + binTile(context), ], if (!kReleaseMode) ...[ const Divider(), @@ -253,11 +254,15 @@ class AppDrawer extends StatelessWidget { ]; } - Widget get binTile { + Widget binTile(BuildContext context) { + final source = context.read(); + final trashSize = source.trashedEntries.fold(0, (sum, entry) => sum + (entry.sizeBytes ?? 0)); + const filter = TrashFilter.instance; return CollectionNavTile( leading: const DrawerFilterIcon(filter: filter), title: const DrawerFilterTitle(filter: filter), + trailing: Text(formatFileSize(context.l10n.localeName, trashSize, round: 0)), filter: filter, isSelected: () => currentCollection?.filters.contains(filter) ?? false, ); diff --git a/lib/widgets/drawer/collection_nav_tile.dart b/lib/widgets/drawer/collection_nav_tile.dart index 17dc8a213..8d264f276 100644 --- a/lib/widgets/drawer/collection_nav_tile.dart +++ b/lib/widgets/drawer/collection_nav_tile.dart @@ -37,7 +37,20 @@ class CollectionNavTile extends StatelessWidget { child: ListTile( leading: leading, title: title, - trailing: trailing, + trailing: trailing != null + ? Builder( + builder: (context) { + final trailingColor = IconTheme.of(context).color!.withOpacity(.6); + return IconTheme.merge( + data: IconThemeData(color: trailingColor), + child: DefaultTextStyle.merge( + style: TextStyle(color: trailingColor), + child: trailing!, + ), + ); + }, + ) + : null, dense: dense, onTap: () => _goToCollection(context), selected: context.currentRouteName == CollectionPage.routeName && isSelected(), @@ -84,7 +97,6 @@ class AlbumNavTile extends StatelessWidget { ? const Icon( AIcons.removableStorage, size: 16, - color: Colors.grey, ) : null, filter: filter, diff --git a/untranslated.json b/untranslated.json index 2f843b39a..cfa5917f9 100644 --- a/untranslated.json +++ b/untranslated.json @@ -3,6 +3,7 @@ "timeDays", "entryActionConvert", "entryActionRestore", + "filterBinLabel", "binEntriesConfirmationDialogMessage", "collectionActionEmptyBin", "binPageTitle", @@ -13,6 +14,7 @@ "es": [ "timeDays", "entryActionRestore", + "filterBinLabel", "binEntriesConfirmationDialogMessage", "collectionActionEmptyBin", "binPageTitle", @@ -24,6 +26,7 @@ "timeDays", "entryActionConvert", "entryActionRestore", + "filterBinLabel", "binEntriesConfirmationDialogMessage", "collectionActionEmptyBin", "binPageTitle", @@ -35,6 +38,7 @@ "timeDays", "entryActionConvert", "entryActionRestore", + "filterBinLabel", "binEntriesConfirmationDialogMessage", "collectionActionEmptyBin", "binPageTitle",