nc-photos/app/lib/widget/search_landing/view.dart

165 lines
3.6 KiB
Dart
Raw Normal View History

2023-07-16 13:30:23 +02:00
part of '../search_landing.dart';
class _PersonItemView extends StatelessWidget {
const _PersonItemView({
required this.account,
required this.item,
this.onTap,
});
@override
Widget build(BuildContext context) {
final content = Padding(
padding: const EdgeInsets.all(4),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Center(
child: ClipRRect(
borderRadius: BorderRadius.circular(72 / 2),
child: PersonThumbnail(
dimension: 72,
account: account,
person: item.person,
coverUrl: item.coverUrl,
),
),
),
const SizedBox(height: 8),
Expanded(child: _LabelView(label: item.name)),
],
),
);
if (onTap != null) {
return InkWell(
onTap: onTap,
child: content,
);
} else {
return content;
}
}
final Account account;
final _PersonItem item;
final VoidCallback? onTap;
}
class _PlaceItemView extends StatelessWidget {
const _PlaceItemView({
required this.account,
required this.item,
this.onTap,
});
@override
Widget build(BuildContext context) {
final content = Padding(
padding: const EdgeInsets.all(4),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Center(
child: _LocationCoverImage(
dimension: 72,
account: account,
coverUrl: item.coverUrl,
),
),
const SizedBox(height: 8),
Expanded(child: _LabelView(label: item.name)),
],
),
);
if (onTap != null) {
return InkWell(
onTap: onTap,
child: content,
);
} else {
return content;
}
}
final Account account;
final _PlaceItem item;
final VoidCallback? onTap;
}
class _LabelView extends StatelessWidget {
const _LabelView({
required this.label,
});
@override
Widget build(BuildContext context) {
return SizedBox(
width: 88,
child: Text(
label + "\n",
style: Theme.of(context).textTheme.bodyMedium,
textAlign: TextAlign.center,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
);
}
final String label;
}
2023-07-16 13:30:23 +02:00
class _LocationCoverPlaceholder extends StatelessWidget {
const _LocationCoverPlaceholder();
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8),
child: Icon(
Icons.location_on,
color: Theme.of(context).listPlaceholderForegroundColor,
),
);
}
}
class _LocationCoverImage extends StatelessWidget {
const _LocationCoverImage({
required this.dimension,
required this.account,
required this.coverUrl,
});
@override
Widget build(BuildContext context) {
Widget cover;
try {
cover = NetworkRectThumbnail(
account: account,
imageUrl: coverUrl!,
errorBuilder: (_) => const _LocationCoverPlaceholder(),
);
} catch (_) {
cover = const FittedBox(
child: _LocationCoverPlaceholder(),
);
}
return SizedBox.square(
dimension: dimension,
child: ClipRRect(
borderRadius: BorderRadius.circular(dimension / 2),
child: Container(
color: Theme.of(context).listPlaceholderBackgroundColor,
constraints: const BoxConstraints.expand(),
child: cover,
),
),
);
}
final double dimension;
final Account account;
final String? coverUrl;
}