feat: add reorder buttons action button and integrate into viewer kebab menu
parent
185134953d
commit
7c3f1753f1
|
|
@ -0,0 +1,35 @@
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/presentation/widgets/action_buttons/base_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';
|
||||||
|
|
||||||
|
class ReorderButtonsActionButton extends ConsumerWidget {
|
||||||
|
const ReorderButtonsActionButton({super.key, this.originalTheme});
|
||||||
|
|
||||||
|
final ThemeData? originalTheme;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
return BaseActionButton(
|
||||||
|
label: 'reorder_buttons'.tr(),
|
||||||
|
iconData: Icons.swap_vert,
|
||||||
|
iconColor: originalTheme?.iconTheme.color,
|
||||||
|
menuItem: true,
|
||||||
|
onPressed: () async {
|
||||||
|
final viewerNotifier = ref.read(assetViewerProvider.notifier);
|
||||||
|
viewerNotifier.setBottomSheet(true);
|
||||||
|
|
||||||
|
await showModalBottomSheet<void>(
|
||||||
|
context: context,
|
||||||
|
isScrollControlled: true,
|
||||||
|
enableDrag: false,
|
||||||
|
builder: (sheetContext) => const FractionallySizedBox(heightFactor: 0.75, child: QuickActionConfigurator()),
|
||||||
|
).whenComplete(() {
|
||||||
|
viewerNotifier.setBottomSheet(false);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -10,7 +10,6 @@ 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/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/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/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/presentation/widgets/asset_viewer/viewer_kebab_menu.widget.dart';
|
||||||
import 'package:immich_mobile/providers/activity.provider.dart';
|
import 'package:immich_mobile/providers/activity.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart';
|
||||||
|
|
@ -50,21 +49,6 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget {
|
||||||
|
|
||||||
final originalTheme = context.themeData;
|
final originalTheme = context.themeData;
|
||||||
|
|
||||||
Future<void> openConfigurator() async {
|
|
||||||
final viewerNotifier = ref.read(assetViewerProvider.notifier);
|
|
||||||
|
|
||||||
viewerNotifier.setBottomSheet(true);
|
|
||||||
|
|
||||||
await showModalBottomSheet<void>(
|
|
||||||
context: context,
|
|
||||||
isScrollControlled: true,
|
|
||||||
enableDrag: false,
|
|
||||||
builder: (sheetContext) => const FractionallySizedBox(heightFactor: 0.75, child: QuickActionConfigurator()),
|
|
||||||
).whenComplete(() {
|
|
||||||
viewerNotifier.setBottomSheet(false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
final actions = <Widget>[
|
final actions = <Widget>[
|
||||||
if (asset.isMotionPhoto) const MotionPhotoActionButton(iconOnly: true),
|
if (asset.isMotionPhoto) const MotionPhotoActionButton(iconOnly: true),
|
||||||
if (album != null && album.isActivityEnabled && album.isShared)
|
if (album != null && album.isActivityEnabled && album.isShared)
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ import 'package:immich_mobile/presentation/widgets/action_buttons/trash_action_b
|
||||||
import 'package:immich_mobile/presentation/widgets/action_buttons/unarchive_action_button.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/action_buttons/unarchive_action_button.widget.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/action_buttons/unstack_action_button.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/action_buttons/unstack_action_button.widget.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/action_buttons/upload_action_button.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/action_buttons/upload_action_button.widget.dart';
|
||||||
|
import 'package:immich_mobile/presentation/widgets/action_buttons/reorder_buttons_action_button.widget.dart';
|
||||||
import 'package:immich_mobile/routing/router.dart';
|
import 'package:immich_mobile/routing/router.dart';
|
||||||
|
|
||||||
class ActionButtonContext {
|
class ActionButtonContext {
|
||||||
|
|
@ -219,6 +220,7 @@ class ViewerKebabMenuButtonContext {
|
||||||
enum ViewerKebabMenuButtonType {
|
enum ViewerKebabMenuButtonType {
|
||||||
openInfo,
|
openInfo,
|
||||||
viewInTimeline,
|
viewInTimeline,
|
||||||
|
reorderButtons,
|
||||||
cast,
|
cast,
|
||||||
download;
|
download;
|
||||||
|
|
||||||
|
|
@ -228,6 +230,7 @@ enum ViewerKebabMenuButtonType {
|
||||||
int get group => switch (this) {
|
int get group => switch (this) {
|
||||||
ViewerKebabMenuButtonType.openInfo => 0,
|
ViewerKebabMenuButtonType.openInfo => 0,
|
||||||
ViewerKebabMenuButtonType.viewInTimeline => 1,
|
ViewerKebabMenuButtonType.viewInTimeline => 1,
|
||||||
|
ViewerKebabMenuButtonType.reorderButtons => 1,
|
||||||
ViewerKebabMenuButtonType.cast => 1,
|
ViewerKebabMenuButtonType.cast => 1,
|
||||||
ViewerKebabMenuButtonType.download => 1,
|
ViewerKebabMenuButtonType.download => 1,
|
||||||
};
|
};
|
||||||
|
|
@ -244,6 +247,7 @@ enum ViewerKebabMenuButtonType {
|
||||||
context.isOwner,
|
context.isOwner,
|
||||||
ViewerKebabMenuButtonType.cast => context.isCasting || context.asset.hasRemote,
|
ViewerKebabMenuButtonType.cast => context.isCasting || context.asset.hasRemote,
|
||||||
ViewerKebabMenuButtonType.download => context.asset.isRemoteOnly,
|
ViewerKebabMenuButtonType.download => context.asset.isRemoteOnly,
|
||||||
|
ViewerKebabMenuButtonType.reorderButtons => true,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -270,6 +274,7 @@ enum ViewerKebabMenuButtonType {
|
||||||
),
|
),
|
||||||
ViewerKebabMenuButtonType.cast => const CastActionButton(menuItem: true),
|
ViewerKebabMenuButtonType.cast => const CastActionButton(menuItem: true),
|
||||||
ViewerKebabMenuButtonType.download => const DownloadActionButton(source: ActionSource.viewer, menuItem: true),
|
ViewerKebabMenuButtonType.download => const DownloadActionButton(source: ActionSource.viewer, menuItem: true),
|
||||||
|
ViewerKebabMenuButtonType.reorderButtons => ReorderButtonsActionButton(originalTheme: context.originalTheme),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue