From dbbc5738cee673afd771ebbf485c2c88d423db9c Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Sun, 4 Dec 2022 22:00:43 +0300 Subject: [PATCH] Recalculate EV on Iso change --- .../metering/components/topbar/topbar.dart | 4 +++- lib/screens/metering/metering_bloc.dart | 16 ++++++++++++++-- lib/screens/metering/metering_event.dart | 8 ++++++++ lib/screens/metering/metering_screen.dart | 1 + lib/utils/log_2.dart | 3 +++ 5 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 lib/utils/log_2.dart diff --git a/lib/screens/metering/components/topbar/topbar.dart b/lib/screens/metering/components/topbar/topbar.dart index 006cbf8..b9df605 100644 --- a/lib/screens/metering/components/topbar/topbar.dart +++ b/lib/screens/metering/components/topbar/topbar.dart @@ -18,6 +18,7 @@ class MeteringTopBar extends StatelessWidget { final double ev; final IsoValue iso; final double nd; + final ValueChanged onIsoChanged; MeteringTopBar({ required this.fastest, @@ -25,6 +26,7 @@ class MeteringTopBar extends StatelessWidget { required this.ev, required this.iso, required this.nd, + required this.onIsoChanged, super.key, }); @@ -108,7 +110,7 @@ class MeteringTopBar extends StatelessWidget { _isoDialogKey.currentState?.close(); }, onSelect: (value) { - _isoDialogKey.currentState?.close(); + _isoDialogKey.currentState?.close().then((_) => onIsoChanged(value)); }, ), ), diff --git a/lib/screens/metering/metering_bloc.dart b/lib/screens/metering/metering_bloc.dart index 0a08fa2..e469211 100644 --- a/lib/screens/metering/metering_bloc.dart +++ b/lib/screens/metering/metering_bloc.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:lightmeter/models/exposure_pair.dart'; import 'package:lightmeter/models/photography_value.dart'; +import 'package:lightmeter/utils/log_2.dart'; import 'metering_event.dart'; import 'metering_state.dart'; @@ -24,11 +25,23 @@ class MeteringBloc extends Bloc { exposurePairs: [], ), ) { + on(_onIsoChanged); on(_onMeasure); add(const MeasureEvent()); } + void _onIsoChanged(IsoChangedEvent event, Emitter emit) { + final ev = state.ev + log2(event.isoValue.value / state.iso.value); + emit(MeteringState( + iso: event.isoValue, + ev: ev, + evCompensation: state.evCompensation, + nd: state.nd, + exposurePairs: _buildExposureValues(ev), + )); + } + /// https://www.scantips.com/lights/exposurecalc.html void _onMeasure(_, Emitter emit) { double log2(double x) => log(x) / log(2); @@ -39,14 +52,13 @@ class MeteringBloc extends Bloc { final evAtSystemIso = log2(pow(aperture.value, 2).toDouble()) - log2(shutterSpeed.value); final ev = evAtSystemIso - log2(iso.value / state.iso.value); - final exposurePairs = _buildExposureValues(ev); emit(MeteringState( iso: state.iso, ev: ev, evCompensation: state.evCompensation, nd: state.nd, - exposurePairs: exposurePairs, + exposurePairs: _buildExposureValues(ev), )); } diff --git a/lib/screens/metering/metering_event.dart b/lib/screens/metering/metering_event.dart index d165a52..ecc5e9f 100644 --- a/lib/screens/metering/metering_event.dart +++ b/lib/screens/metering/metering_event.dart @@ -1,7 +1,15 @@ +import 'package:lightmeter/models/photography_value.dart'; + abstract class MeteringEvent { const MeteringEvent(); } +class IsoChangedEvent extends MeteringEvent { + final IsoValue isoValue; + + const IsoChangedEvent(this.isoValue); +} + class MeasureEvent extends MeteringEvent { const MeasureEvent(); } diff --git a/lib/screens/metering/metering_screen.dart b/lib/screens/metering/metering_screen.dart index e51d647..775edbf 100644 --- a/lib/screens/metering/metering_screen.dart +++ b/lib/screens/metering/metering_screen.dart @@ -112,6 +112,7 @@ class _MeteringScreenState extends State { ev: state.ev, iso: state.iso, nd: state.nd, + onIsoChanged: (value) => context.read().add(IsoChangedEvent(value)), ); } diff --git a/lib/utils/log_2.dart b/lib/utils/log_2.dart new file mode 100644 index 0000000..83b847f --- /dev/null +++ b/lib/utils/log_2.dart @@ -0,0 +1,3 @@ +import 'dart:math'; + +double log2(double x) => log(x) / log(2);