m3_lightmeter/lib/screens/logbook/screen_logbook.dart
2025-07-10 16:23:37 +02:00

89 lines
2.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/navigation/routes.dart';
import 'package:lightmeter/platform_config.dart';
import 'package:lightmeter/providers/logbook_photos_provider.dart';
import 'package:lightmeter/res/dimens.dart';
import 'package:lightmeter/screens/logbook/components/grid_tile/widget_grid_tile_logbook_photo.dart';
import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart';
import 'package:lightmeter/screens/shared/icon_placeholder/widget_icon_placeholder.dart';
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
class LogbookScreen extends StatefulWidget {
const LogbookScreen({super.key});
@override
State<LogbookScreen> createState() => _LogbookScreenState();
}
class _LogbookScreenState extends State<LogbookScreen> with SingleTickerProviderStateMixin {
@override
Widget build(BuildContext context) {
return SliverScreen(
title: Text(S.of(context).logbook),
slivers: [
_PicturesGridBuilder(
values: LogbookPhotos.of(context, listen: true),
onEdit: _editProfile,
),
SliverToBoxAdapter(
child: SizedBox(height: MediaQuery.paddingOf(context).bottom),
),
],
);
}
void _editProfile(LogbookPhoto photo) {
Navigator.of(context).pushNamed(
NavigationRoutes.logbookPhotoEditScreen.name,
arguments: photo,
);
}
}
class _PicturesGridBuilder extends StatelessWidget {
final List<LogbookPhoto> values;
final void Function(LogbookPhoto photo) onEdit;
static const int _crossAxisCount = 3;
const _PicturesGridBuilder({
required this.values,
required this.onEdit,
});
@override
Widget build(BuildContext context) {
if (values.isEmpty) {
return SliverFillRemaining(
hasScrollBody: false,
child: Center(
child: IconPlaceholder(
icon: Icons.photo_outlined,
text: S.of(context).noPhotos,
),
),
);
}
return SliverPadding(
padding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM),
sliver: SliverGrid(
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent:
(MediaQuery.sizeOf(context).width - Dimens.paddingS * (_crossAxisCount - 1) - Dimens.paddingM * 2) /
_crossAxisCount,
mainAxisSpacing: Dimens.paddingS,
crossAxisSpacing: Dimens.paddingS,
childAspectRatio: PlatformConfig.cameraPreviewAspectRatio,
),
delegate: SliverChildBuilderDelegate(
(_, int index) => LogbookPhotoGridTile(
photo: values[index],
onTap: () => onEdit(values[index]),
),
childCount: values.length,
),
),
);
}
}