import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/data/models/photography_values/photography_value.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/settings/screen_settings.dart'; import 'components/bottom_controls/widget_bottom_controls.dart'; import 'components/camera/widget_exposure_slider.dart'; import 'components/camera/widget_zoom_camera.dart'; import 'components/exposure_pairs_list/widget_list_exposure_pairs.dart'; import 'components/topbar/widget_topbar.dart'; import 'bloc_metering.dart'; import 'event_metering.dart'; import 'state_metering.dart'; class MeteringScreen extends StatefulWidget { const MeteringScreen({super.key}); @override State createState() => _MeteringScreenState(); } class _MeteringScreenState extends State { double topBarOverflow = 0.0; @override void didChangeDependencies() { super.didChangeDependencies(); context.read().add(StopTypeChangedEvent(context.watch())); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Theme.of(context).colorScheme.background, body: BlocBuilder( builder: (context, state) { return Stack( children: [ Column( children: [ MeteringTopBar( fastest: state.fastest, slowest: state.slowest, ev: state.ev, iso: state.iso, nd: state.nd, onIsoChanged: (value) => context.read().add(IsoChangedEvent(value)), onNdChanged: (value) => context.read().add(NdChangedEvent(value)), onCutoutLayout: (value) => topBarOverflow = value, ), Expanded( child: LayoutBuilder( builder: (context, constraints) => OverflowBox( alignment: Alignment.bottomCenter, maxHeight: constraints.maxHeight + topBarOverflow.abs(), maxWidth: constraints.maxWidth, child: Padding( padding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), child: Row( children: [ Expanded( child: Padding( padding: topBarOverflow >= 0 ? EdgeInsets.only(top: topBarOverflow) : EdgeInsets.zero, child: ExposurePairsList(state.exposurePairs), ), ), const SizedBox(width: Dimens.grid8), Expanded( child: Padding( padding: const EdgeInsets.symmetric(vertical: Dimens.paddingM).add( topBarOverflow <= 0 ? EdgeInsets.only(top: -topBarOverflow) : EdgeInsets.zero), child: Column( children: const [ Expanded(child: CameraExposureSlider()), SizedBox(height: Dimens.grid24), CameraZoomSlider(), ], ), ), ), ], ), ), ), ), ), MeteringBottomControls( onMeasure: () => context.read().add(const MeasureEvent()), onSettings: () { Navigator.push(context, MaterialPageRoute(builder: (context) => const SettingsScreen())); }, ), ], ), ], ); }, ), ); } }