A framework for building convergent cross-platform Nextcloud clients using Flutter.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.1 KiB

part of '../neon_files.dart';
3 years ago
class FilePreview extends StatelessWidget {
const FilePreview({
required this.bloc,
required this.details,
this.size = const Size.square(40),
3 years ago
this.color,
this.borderRadius,
this.withBackground = false,
3 years ago
super.key,
}) : assert(
(borderRadius != null && withBackground) || borderRadius == null,
'withBackground needs to be true when borderRadius is set',
);
3 years ago
final FilesBloc bloc;
final FileDetails details;
final Size size;
3 years ago
final Color? color;
final BorderRadius? borderRadius;
final bool withBackground;
3 years ago
int get width => size.width.toInt();
int get height => size.height.toInt();
3 years ago
@override
Widget build(final BuildContext context) {
3 years ago
final color = this.color ?? Theme.of(context).colorScheme.primary;
return SizedBox.fromSize(
size: size,
3 years ago
child: StreamBuilder<bool?>(
stream: bloc.options.showPreviewsOption.stream,
builder: (final context, final showPreviewsSnapshot) {
if ((showPreviewsSnapshot.data ?? false) && (details.hasPreview ?? false)) {
final account = Provider.of<AccountsBloc>(context, listen: false).activeAccount.value!;
final child = NeonCachedApiImage(
account: account,
cacheKey: 'preview-${details.path.join('/')}-$width-$height',
etag: details.etag,
download: () async => account.client.core.getPreview(
file: details.path.join('/'),
x: width,
y: height,
),
3 years ago
);
if (withBackground) {
return NeonImageWrapper(
color: Colors.white,
borderRadius: borderRadius,
child: child,
);
}
return child;
3 years ago
}
if (details.isDirectory) {
return Icon(
MdiIcons.folder,
color: color,
size: size.shortestSide,
3 years ago
);
}
return FileIcon(
details.name,
color: color,
size: size.shortestSide,
3 years ago
);
},
),
);
}
}