From 7f3386c8d0385d9bdc614cf78f9a1dc5937a577a Mon Sep 17 00:00:00 2001 From: idubnori Date: Thu, 4 Dec 2025 23:47:16 +0900 Subject: [PATCH] feat: add configurator button to viewer kebab menu --- i18n/en.json | 1 + .../asset_viewer/top_app_bar.widget.dart | 20 +++++++++++++++++-- .../viewer_kebab_menu.widget.dart | 6 +++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/i18n/en.json b/i18n/en.json index 8ec590ec61..4b7984bbc6 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -1727,6 +1727,7 @@ "removed_photo_from_memory": "Removed photo from memory", "removed_tagged_assets": "Removed tag from {count, plural, one {# asset} other {# assets}}", "rename": "Rename", + "reorder_buttons": "Reorder buttons", "repair": "Repair", "repair_no_results_message": "Untracked and missing files will show up here", "replace_with_upload": "Replace with upload", diff --git a/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart index 918ed8a223..96b42da6c8 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart @@ -14,6 +14,7 @@ import 'package:immich_mobile/presentation/widgets/action_buttons/favorite_actio import 'package:immich_mobile/presentation/widgets/action_buttons/motion_photo_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/unfavorite_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart'; +import 'package:immich_mobile/presentation/widgets/asset_viewer/quick_action_configurator.widget.dart'; import 'package:immich_mobile/presentation/widgets/asset_viewer/viewer_kebab_menu.widget.dart'; import 'package:immich_mobile/providers/activity.provider.dart'; import 'package:immich_mobile/providers/cast.provider.dart'; @@ -65,6 +66,21 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget { final isCasting = ref.watch(castProvider.select((c) => c.isCasting)); + Future openConfigurator() async { + final viewerNotifier = ref.read(assetViewerProvider.notifier); + + viewerNotifier.setBottomSheet(true); + + await showModalBottomSheet( + context: context, + isScrollControlled: true, + enableDrag: false, + builder: (sheetContext) => const FractionallySizedBox(heightFactor: 0.75, child: QuickActionConfigurator()), + ).whenComplete(() { + viewerNotifier.setBottomSheet(false); + }); + } + final actions = [ if (asset.isRemoteOnly) const DownloadActionButton(source: ActionSource.viewer, menuItem: true), if (isCasting || (asset.hasRemote)) const CastActionButton(menuItem: true), @@ -90,12 +106,12 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget { if (asset.hasRemote && isOwner && asset.isFavorite) const UnFavoriteActionButton(source: ActionSource.viewer, menuItem: true), if (asset.isMotionPhoto) const MotionPhotoActionButton(menuItem: true), - const ViewerKebabMenu(), + ViewerKebabMenu(onConfigureButtons: openConfigurator), ]; final lockedViewActions = [ if (isCasting || (asset.hasRemote)) const CastActionButton(menuItem: true), - const ViewerKebabMenu(), + ViewerKebabMenu(onConfigureButtons: openConfigurator), ]; return IgnorePointer( diff --git a/mobile/lib/presentation/widgets/asset_viewer/viewer_kebab_menu.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/viewer_kebab_menu.widget.dart index b228c0331b..b740df7f37 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/viewer_kebab_menu.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/viewer_kebab_menu.widget.dart @@ -8,7 +8,9 @@ import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_bu import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart'; class ViewerKebabMenu extends ConsumerWidget { - const ViewerKebabMenu({super.key}); + final VoidCallback onConfigureButtons; + + const ViewerKebabMenu({super.key, required this.onConfigureButtons}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -24,6 +26,8 @@ class ViewerKebabMenu extends ConsumerWidget { iconData: Icons.info_outline, onPressed: () => EventStream.shared.emit(const ViewerOpenBottomSheetEvent()), ), + const Divider(height: 0), + BaseActionButton(label: 'reorder_buttons'.tr(), iconData: Icons.tune, onPressed: onConfigureButtons), ]; return MenuAnchor(