Browse Source

neon: Display user avatars according to size constraints

pull/360/head
jld3103 1 year ago
parent
commit
fad22bf9df
No known key found for this signature in database
GPG Key ID: 9062417B9E8EB7B3
  1. 6
      packages/neon/neon/lib/src/pages/home.dart
  2. 6
      packages/neon/neon/lib/src/widgets/account_tile.dart
  3. 82
      packages/neon/neon/lib/src/widgets/user_avatar.dart

6
packages/neon/neon/lib/src/pages/home.dart

@ -495,10 +495,8 @@ class _HomePageState extends State<HomePage> {
AccountSettingsRoute(accountid: account.id).go(context);
},
tooltip: AppLocalizations.of(context).settingsAccount,
icon: IntrinsicWidth(
child: NeonUserAvatar(
account: account,
),
icon: NeonUserAvatar(
account: account,
),
),
],

6
packages/neon/neon/lib/src/widgets/account_tile.dart

@ -33,10 +33,8 @@ class NeonAccountTile extends StatelessWidget {
vertical: -4,
)
: null,
leading: IntrinsicWidth(
child: NeonUserAvatar(
account: account,
),
leading: NeonUserAvatar(
account: account,
),
title: ResultBuilder<NextcloudProvisioningApiUserDetails>(
stream: userDetailsBloc.userDetails,

82
packages/neon/neon/lib/src/widgets/user_avatar.dart

@ -25,6 +25,7 @@ class NeonUserAvatar extends StatefulWidget {
class _UserAvatarState extends State<NeonUserAvatar> {
late final _userStatusBloc = Provider.of<AccountsBloc>(context, listen: false).getUserStatusesBloc(widget.account);
late double size;
@override
void initState() {
@ -34,47 +35,50 @@ class _UserAvatarState extends State<NeonUserAvatar> {
}
@override
Widget build(final BuildContext context) {
final isDark = Theme.of(context).brightness == Brightness.dark;
final size = (widget.size * MediaQuery.of(context).devicePixelRatio).toInt();
return Stack(
alignment: Alignment.center,
children: [
CircleAvatar(
radius: widget.size / 2,
child: ClipOval(
child: NeonCachedApiImage(
account: widget.account,
cacheKey: 'avatar-${widget.username}-${isDark ? 'dark' : 'light'}$size',
download: () async {
if (isDark) {
return widget.account.client.core.getDarkAvatar(
userId: widget.username,
size: size,
);
} else {
return widget.account.client.core.getAvatar(
userId: widget.username,
size: size,
);
}
},
),
),
),
if (widget.showStatus) ...[
ResultBuilder<NextcloudUserStatusPublicStatus?>(
stream: _userStatusBloc.statuses.map((final statuses) => statuses[widget.username]),
builder: _userStatusIconBuilder,
),
],
],
);
}
Widget build(final BuildContext context) => LayoutBuilder(
builder: (final context, final constraints) {
final isDark = Theme.of(context).brightness == Brightness.dark;
size = constraints.constrain(Size.square(widget.size)).shortestSide;
final pixelSize = (size * MediaQuery.of(context).devicePixelRatio).toInt();
return Stack(
alignment: Alignment.center,
children: [
CircleAvatar(
radius: size / 2,
child: ClipOval(
child: NeonCachedApiImage(
account: widget.account,
cacheKey: 'avatar-${widget.username}-${isDark ? 'dark' : 'light'}$pixelSize',
download: () async {
if (isDark) {
return widget.account.client.core.getDarkAvatar(
userId: widget.username,
size: pixelSize,
);
} else {
return widget.account.client.core.getAvatar(
userId: widget.username,
size: pixelSize,
);
}
},
),
),
),
if (widget.showStatus) ...[
ResultBuilder<NextcloudUserStatusPublicStatus?>(
stream: _userStatusBloc.statuses.map((final statuses) => statuses[widget.username]),
builder: _userStatusIconBuilder,
),
],
],
);
},
);
Widget _userStatusIconBuilder(final BuildContext context, final Result<NextcloudUserStatusPublicStatus?> result) {
final hasEmoji = result.data?.icon != null;
final scaledSize = widget.size / (hasEmoji ? 2 : 3);
final scaledSize = size / (hasEmoji ? 2 : 3);
Widget? child;
Decoration? decoration;
@ -104,7 +108,7 @@ class _UserAvatarState extends State<NeonUserAvatar> {
}
return SizedBox.square(
dimension: widget.size,
dimension: size,
child: Align(
alignment: Alignment.bottomRight,
child: Container(

Loading…
Cancel
Save