mirror of
https://github.com/immich-app/immich.git
synced 2025-07-31 15:08:44 -04:00
chore: styling for asset_viewer bottom sheet (#20006)
bottom sheet styling
This commit is contained in:
parent
53acf08263
commit
137f0d48c0
@ -1,9 +1,11 @@
|
|||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/user.provider.dart';
|
||||||
|
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
class DriftRecentlyTakenPage extends StatelessWidget {
|
class DriftRecentlyTakenPage extends StatelessWidget {
|
||||||
@ -29,7 +31,9 @@ class DriftRecentlyTakenPage extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
child: const Timeline(),
|
child: Timeline(
|
||||||
|
appBar: MesmerizingSliverAppBar(title: 'recently_taken'.t()),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/user.provider.dart';
|
||||||
|
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
class DriftVideoPage extends StatelessWidget {
|
class DriftVideoPage extends StatelessWidget {
|
||||||
@ -27,7 +29,9 @@ class DriftVideoPage extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
child: const Timeline(),
|
child: Timeline(
|
||||||
|
appBar: MesmerizingSliverAppBar(title: 'videos'.t()),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
import 'package:immich_mobile/constants/enums.dart';
|
import 'package:immich_mobile/constants/enums.dart';
|
||||||
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
||||||
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
||||||
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
|
||||||
import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart';
|
|
||||||
import 'package:immich_mobile/presentation/widgets/action_buttons/share_action_button.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/action_buttons/share_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/providers/infrastructure/asset_viewer/current_asset.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart';
|
||||||
@ -39,7 +37,6 @@ class ViewerBottomBar extends ConsumerWidget {
|
|||||||
|
|
||||||
final actions = <Widget>[
|
final actions = <Widget>[
|
||||||
const ShareActionButton(source: ActionSource.viewer),
|
const ShareActionButton(source: ActionSource.viewer),
|
||||||
const _EditActionButton(),
|
|
||||||
if (asset.hasRemote && isOwner)
|
if (asset.hasRemote && isOwner)
|
||||||
const ArchiveActionButton(source: ActionSource.viewer),
|
const ArchiveActionButton(source: ActionSource.viewer),
|
||||||
];
|
];
|
||||||
@ -86,15 +83,3 @@ class ViewerBottomBar extends ConsumerWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _EditActionButton extends ConsumerWidget {
|
|
||||||
const _EditActionButton();
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
|
||||||
return BaseActionButton(
|
|
||||||
iconData: Icons.tune_outlined,
|
|
||||||
label: 'edit'.t(context: context),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -73,6 +73,7 @@ class AssetDetailBottomSheet extends ConsumerWidget {
|
|||||||
expand: false,
|
expand: false,
|
||||||
shouldCloseOnMinExtent: false,
|
shouldCloseOnMinExtent: false,
|
||||||
resizeOnScroll: false,
|
resizeOnScroll: false,
|
||||||
|
backgroundColor: context.isDarkTheme ? Colors.black : Colors.white,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -84,14 +85,18 @@ class _AssetDetailBottomSheet extends ConsumerWidget {
|
|||||||
final dateTime = asset.createdAt.toLocal();
|
final dateTime = asset.createdAt.toLocal();
|
||||||
final date = DateFormat.yMMMEd(ctx.locale.toLanguageTag()).format(dateTime);
|
final date = DateFormat.yMMMEd(ctx.locale.toLanguageTag()).format(dateTime);
|
||||||
final time = DateFormat.jm(ctx.locale.toLanguageTag()).format(dateTime);
|
final time = DateFormat.jm(ctx.locale.toLanguageTag()).format(dateTime);
|
||||||
return '$date$_kSeparator$time';
|
final timezone = dateTime.timeZoneOffset.isNegative
|
||||||
|
? 'UTC-${dateTime.timeZoneOffset.inHours.abs().toString().padLeft(2, '0')}:${(dateTime.timeZoneOffset.inMinutes.abs() % 60).toString().padLeft(2, '0')}'
|
||||||
|
: 'UTC+${dateTime.timeZoneOffset.inHours.toString().padLeft(2, '0')}:${(dateTime.timeZoneOffset.inMinutes.abs() % 60).toString().padLeft(2, '0')}';
|
||||||
|
return '$date$_kSeparator$time $timezone';
|
||||||
}
|
}
|
||||||
|
|
||||||
String _getFileInfo(BaseAsset asset, ExifInfo? exifInfo) {
|
String _getFileInfo(BaseAsset asset, ExifInfo? exifInfo) {
|
||||||
final height = asset.height ?? exifInfo?.height;
|
final height = asset.height ?? exifInfo?.height;
|
||||||
final width = asset.width ?? exifInfo?.width;
|
final width = asset.width ?? exifInfo?.width;
|
||||||
final resolution =
|
final resolution = (width != null && height != null)
|
||||||
(width != null && height != null) ? "$width x $height" : null;
|
? "${width.toInt()} x ${height.toInt()}"
|
||||||
|
: null;
|
||||||
final fileSize =
|
final fileSize =
|
||||||
exifInfo?.fileSize != null ? formatBytes(exifInfo!.fileSize!) : null;
|
exifInfo?.fileSize != null ? formatBytes(exifInfo!.fileSize!) : null;
|
||||||
|
|
||||||
@ -150,46 +155,46 @@ class _AssetDetailBottomSheet extends ConsumerWidget {
|
|||||||
// Asset Date and Time
|
// Asset Date and Time
|
||||||
_SheetTile(
|
_SheetTile(
|
||||||
title: _getDateTime(context, asset),
|
title: _getDateTime(context, asset),
|
||||||
titleStyle: context.textTheme.bodyLarge?.copyWith(
|
titleStyle: context.textTheme.bodyMedium?.copyWith(
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w600,
|
||||||
fontSize: 16,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SheetLocationDetails(),
|
const SheetLocationDetails(),
|
||||||
// Details header
|
// Details header
|
||||||
_SheetTile(
|
_SheetTile(
|
||||||
title: 'exif_bottom_sheet_details'.t(context: context),
|
title: 'exif_bottom_sheet_details'.t(context: context),
|
||||||
titleStyle: context.textTheme.labelLarge,
|
titleStyle: context.textTheme.labelMedium?.copyWith(
|
||||||
|
color: context.textTheme.labelMedium?.color?.withAlpha(200),
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
// File info
|
// File info
|
||||||
_SheetTile(
|
_SheetTile(
|
||||||
title: asset.name,
|
title: asset.name,
|
||||||
titleStyle: context.textTheme.labelLarge
|
titleStyle: context.textTheme.labelLarge,
|
||||||
?.copyWith(fontWeight: FontWeight.w600),
|
|
||||||
leading: Icon(
|
leading: Icon(
|
||||||
asset.isImage ? Icons.image_outlined : Icons.videocam_outlined,
|
asset.isImage ? Icons.image_outlined : Icons.videocam_outlined,
|
||||||
size: 30,
|
size: 24,
|
||||||
color: context.textTheme.labelLarge?.color,
|
color: context.textTheme.labelLarge?.color,
|
||||||
),
|
),
|
||||||
subtitle: _getFileInfo(asset, exifInfo),
|
subtitle: _getFileInfo(asset, exifInfo),
|
||||||
subtitleStyle: context.textTheme.labelLarge?.copyWith(
|
subtitleStyle: context.textTheme.bodyMedium?.copyWith(
|
||||||
color: context.textTheme.labelLarge?.color?.withAlpha(200),
|
color: context.textTheme.bodyMedium?.color?.withAlpha(155),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
// Camera info
|
// Camera info
|
||||||
if (cameraTitle != null)
|
if (cameraTitle != null)
|
||||||
_SheetTile(
|
_SheetTile(
|
||||||
title: cameraTitle,
|
title: cameraTitle,
|
||||||
titleStyle: context.textTheme.labelLarge
|
titleStyle: context.textTheme.labelLarge,
|
||||||
?.copyWith(fontWeight: FontWeight.w600),
|
|
||||||
leading: Icon(
|
leading: Icon(
|
||||||
Icons.camera_outlined,
|
Icons.camera_outlined,
|
||||||
size: 30,
|
size: 24,
|
||||||
color: context.textTheme.labelLarge?.color,
|
color: context.textTheme.labelLarge?.color,
|
||||||
),
|
),
|
||||||
subtitle: _getCameraInfoSubtitle(exifInfo),
|
subtitle: _getCameraInfoSubtitle(exifInfo),
|
||||||
subtitleStyle: context.textTheme.labelLarge?.copyWith(
|
subtitleStyle: context.textTheme.bodyMedium?.copyWith(
|
||||||
color: context.textTheme.labelLarge?.color?.withAlpha(200),
|
color: context.textTheme.bodyMedium?.color?.withAlpha(155),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -95,7 +95,10 @@ class _SheetLocationDetailsState extends ConsumerState<SheetLocationDetails> {
|
|||||||
padding: const EdgeInsets.only(bottom: 16),
|
padding: const EdgeInsets.only(bottom: 16),
|
||||||
child: Text(
|
child: Text(
|
||||||
"exif_bottom_sheet_location".t(context: context),
|
"exif_bottom_sheet_location".t(context: context),
|
||||||
style: context.textTheme.labelLarge,
|
style: context.textTheme.labelMedium?.copyWith(
|
||||||
|
color: context.textTheme.labelMedium?.color?.withAlpha(200),
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
ExifMap(
|
ExifMap(
|
||||||
@ -109,15 +112,13 @@ class _SheetLocationDetailsState extends ConsumerState<SheetLocationDetails> {
|
|||||||
padding: const EdgeInsets.only(bottom: 4.0),
|
padding: const EdgeInsets.only(bottom: 4.0),
|
||||||
child: Text(
|
child: Text(
|
||||||
locationName,
|
locationName,
|
||||||
style: context.textTheme.bodyLarge?.copyWith(
|
style: context.textTheme.labelLarge,
|
||||||
fontWeight: FontWeight.w500,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
coordinates,
|
coordinates,
|
||||||
style: context.textTheme.labelLarge?.copyWith(
|
style: context.textTheme.labelMedium?.copyWith(
|
||||||
color: context.textTheme.labelLarge?.color?.withAlpha(150),
|
color: context.textTheme.labelMedium?.color?.withAlpha(150),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -14,6 +14,7 @@ class BaseBottomSheet extends ConsumerStatefulWidget {
|
|||||||
final bool expand;
|
final bool expand;
|
||||||
final bool shouldCloseOnMinExtent;
|
final bool shouldCloseOnMinExtent;
|
||||||
final bool resizeOnScroll;
|
final bool resizeOnScroll;
|
||||||
|
final Color? backgroundColor;
|
||||||
|
|
||||||
const BaseBottomSheet({
|
const BaseBottomSheet({
|
||||||
super.key,
|
super.key,
|
||||||
@ -26,6 +27,7 @@ class BaseBottomSheet extends ConsumerStatefulWidget {
|
|||||||
this.expand = true,
|
this.expand = true,
|
||||||
this.shouldCloseOnMinExtent = true,
|
this.shouldCloseOnMinExtent = true,
|
||||||
this.resizeOnScroll = true,
|
this.resizeOnScroll = true,
|
||||||
|
this.backgroundColor,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -69,8 +71,8 @@ class _BaseDraggableScrollableSheetState
|
|||||||
shouldCloseOnMinExtent: widget.shouldCloseOnMinExtent,
|
shouldCloseOnMinExtent: widget.shouldCloseOnMinExtent,
|
||||||
builder: (BuildContext context, ScrollController scrollController) {
|
builder: (BuildContext context, ScrollController scrollController) {
|
||||||
return Card(
|
return Card(
|
||||||
color: context.colorScheme.surfaceContainerHigh,
|
color: widget.backgroundColor ??
|
||||||
surfaceTintColor: context.colorScheme.surfaceContainerHigh,
|
context.colorScheme.surfaceContainerHigh,
|
||||||
borderOnForeground: false,
|
borderOnForeground: false,
|
||||||
clipBehavior: Clip.antiAlias,
|
clipBehavior: Clip.antiAlias,
|
||||||
elevation: 6.0,
|
elevation: 6.0,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user