m3_lightmeter/lib/screens/logbook/screen_logbook.dart

104 lines
3.3 KiB
Dart
Raw Normal View History

2025-07-09 19:48:24 +00:00
import 'package:flutter/material.dart';
2025-07-10 13:43:54 +00:00
import 'package:lightmeter/generated/l10n.dart';
2025-07-09 19:48:24 +00:00
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';
2025-07-10 14:05:35 +00:00
import 'package:lightmeter/screens/logbook/components/grid_tile/widget_grid_tile_logbook_photo.dart';
2025-07-10 14:23:37 +00:00
import 'package:lightmeter/screens/shared/icon_placeholder/widget_icon_placeholder.dart';
2025-07-11 09:37:59 +00:00
import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart';
2025-07-09 19:48:24 +00:00
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(
2025-07-10 13:43:54 +00:00
title: Text(S.of(context).logbook),
2025-07-09 19:48:24 +00:00
slivers: [
2025-07-11 09:37:59 +00:00
SliverToBoxAdapter(
child: Card(
margin: const EdgeInsets.symmetric(horizontal: Dimens.paddingM),
child: Padding(
padding: const EdgeInsets.symmetric(vertical: Dimens.paddingM),
child: SwitchListTile(
secondary: const Icon(Icons.book_outlined),
title: Text(S.of(context).saveNewPhotos),
value: LogbookPhotos.isEnabledOf(context),
onChanged: LogbookPhotosProvider.of(context).saveLogbookPhotos,
),
),
),
),
2025-07-09 19:48:24 +00:00
_PicturesGridBuilder(
2025-07-11 09:37:59 +00:00
values: LogbookPhotos.of(context),
2025-07-09 19:48:24 +00:00
onEdit: _editProfile,
),
SliverToBoxAdapter(
child: SizedBox(height: MediaQuery.paddingOf(context).bottom),
),
],
);
}
2025-07-09 22:08:57 +00:00
void _editProfile(LogbookPhoto photo) {
Navigator.of(context).pushNamed(
NavigationRoutes.logbookPhotoEditScreen.name,
arguments: photo,
);
}
2025-07-09 19:48:24 +00:00
}
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) {
2025-07-10 14:23:37 +00:00
if (values.isEmpty) {
return SliverFillRemaining(
hasScrollBody: false,
child: Center(
child: IconPlaceholder(
icon: Icons.photo_outlined,
text: S.of(context).noPhotos,
),
),
);
}
2025-07-10 14:05:35 +00:00
return SliverPadding(
2025-07-11 09:37:59 +00:00
padding: const EdgeInsets.all(Dimens.paddingM),
2025-07-10 14:05:35 +00:00
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],
2025-07-09 22:08:57 +00:00
onTap: () => onEdit(values[index]),
2025-07-10 14:05:35 +00:00
),
childCount: values.length,
),
2025-07-09 19:48:24 +00:00
),
);
}
}