This commit is contained in:
Vadim 2023-05-11 15:01:21 +02:00
parent 9ef55be2df
commit 87fceee150
12 changed files with 116 additions and 96 deletions

View file

@ -40,7 +40,8 @@ class Application extends StatelessWidget {
providers: [ providers: [
Provider.value(value: env.copyWith(hasLightSensor: snapshot.data![1] as bool)), Provider.value(value: env.copyWith(hasLightSensor: snapshot.data![1] as bool)),
Provider( Provider(
create: (_) => UserPreferencesService(snapshot.data![0] as SharedPreferences),), create: (_) => UserPreferencesService(snapshot.data![0] as SharedPreferences),
),
Provider(create: (_) => const CaffeineService()), Provider(create: (_) => const CaffeineService()),
Provider(create: (_) => const HapticsService()), Provider(create: (_) => const HapticsService()),
Provider(create: (_) => PermissionsService()), Provider(create: (_) => PermissionsService()),

View file

@ -4,7 +4,8 @@ typedef MeteringScreenLayoutConfig = Map<MeteringScreenLayoutFeature, bool>;
extension MeteringScreenLayoutConfigJson on MeteringScreenLayoutConfig { extension MeteringScreenLayoutConfigJson on MeteringScreenLayoutConfig {
static MeteringScreenLayoutConfig fromJson(Map<String, dynamic> data) => data.map( static MeteringScreenLayoutConfig fromJson(Map<String, dynamic> data) => data.map(
(key, value) => MapEntry(MeteringScreenLayoutFeature.values[int.parse(key)], value as bool),); (key, value) => MapEntry(MeteringScreenLayoutFeature.values[int.parse(key)], value as bool),
);
Map<String, dynamic> toJson() => map((key, value) => MapEntry(key.index.toString(), value)); Map<String, dynamic> toJson() => map((key, value) => MapEntry(key.index.toString(), value));
} }

View file

@ -29,4 +29,3 @@ extension SupportedLocaleExtension on SupportedLocale {
} }
} }
} }

View file

@ -65,14 +65,16 @@ class EquipmentProfileProviderState extends State<EquipmentProfileProvider> {
/// Creates a default equipment profile /// Creates a default equipment profile
void addProfile(String name) { void addProfile(String name) {
_customProfiles.add(EquipmentProfileData( _customProfiles.add(
id: const Uuid().v1(), EquipmentProfileData(
name: name, id: const Uuid().v1(),
apertureValues: ApertureValue.values, name: name,
ndValues: NdValue.values, apertureValues: ApertureValue.values,
shutterSpeedValues: ShutterSpeedValue.values, ndValues: NdValue.values,
isoValues: IsoValue.values, shutterSpeedValues: ShutterSpeedValue.values,
),); isoValues: IsoValue.values,
),
);
_refreshSavedProfiles(); _refreshSavedProfiles();
} }

View file

@ -144,21 +144,23 @@ class MeteringBloc extends Bloc<MeteringEvent, MeteringState> {
void _emitMeasuredState(Emitter emit) { void _emitMeasuredState(Emitter emit) {
final ev = _ev100 + log2(_iso.value / 100) - _nd.stopReduction; final ev = _ev100 + log2(_iso.value / 100) - _nd.stopReduction;
emit(_isMeteringInProgress emit(
? MeteringInProgressState( _isMeteringInProgress
ev: ev, ? MeteringInProgressState(
film: _film, ev: ev,
iso: _iso, film: _film,
nd: _nd, iso: _iso,
exposurePairs: _buildExposureValues(ev), nd: _nd,
) exposurePairs: _buildExposureValues(ev),
: MeteringEndedState( )
ev: ev, : MeteringEndedState(
film: _film, ev: ev,
iso: _iso, film: _film,
nd: _nd, iso: _iso,
exposurePairs: _buildExposureValues(ev), nd: _nd,
),); exposurePairs: _buildExposureValues(ev),
),
);
} }
List<ExposurePair> _buildExposureValues(double ev) { List<ExposurePair> _buildExposureValues(double ev) {
@ -199,8 +201,10 @@ class MeteringBloc extends Bloc<MeteringEvent, MeteringState> {
shutterSpeedOffset = 0; shutterSpeedOffset = 0;
} }
final int itemsCount = min(_apertureValues.length + shutterSpeedOffset, final int itemsCount = min(
_shutterSpeedValues.length + apertureOffset,) - _apertureValues.length + shutterSpeedOffset,
_shutterSpeedValues.length + apertureOffset,
) -
max(apertureOffset, shutterSpeedOffset); max(apertureOffset, shutterSpeedOffset);
if (itemsCount < 0) { if (itemsCount < 0) {

View file

@ -41,9 +41,11 @@ class MeteringBottomControls extends StatelessWidget {
child: Center( child: Center(
child: IconButton( child: IconButton(
onPressed: onSwitchEvSourceType, onPressed: onSwitchEvSourceType,
icon: Icon(context.watch<EvSourceType>() != EvSourceType.camera icon: Icon(
? Icons.camera_rear context.watch<EvSourceType>() != EvSourceType.camera
: Icons.wb_incandescent,), ? Icons.camera_rear
: Icons.wb_incandescent,
),
), ),
), ),
) )

View file

@ -161,13 +161,15 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
} }
void _emitActiveState(Emitter emit) { void _emitActiveState(Emitter emit) {
emit(CameraActiveState( emit(
zoomRange: _zoomRange!, CameraActiveState(
currentZoom: _currentZoom, zoomRange: _zoomRange!,
exposureOffsetRange: _exposureOffsetRange!, currentZoom: _currentZoom,
exposureOffsetStep: _exposureStep, exposureOffsetRange: _exposureOffsetRange!,
currentExposureOffset: _currentExposureOffset, exposureOffsetStep: _exposureStep,
),); currentExposureOffset: _currentExposureOffset,
),
);
} }
Future<double?> _takePhoto() async { Future<double?> _takePhoto() async {

View file

@ -154,9 +154,10 @@ class _CameraControlsBuilder extends StatelessWidget {
error: state.error, error: state.error,
onReset: () { onReset: () {
context.read<CameraContainerBloc>().add( context.read<CameraContainerBloc>().add(
state.error == CameraErrorType.permissionNotGranted state.error == CameraErrorType.permissionNotGranted
? const OpenAppSettingsEvent() ? const OpenAppSettingsEvent()
: const InitializeEvent(),); : const InitializeEvent(),
);
}, },
); );
} else { } else {

View file

@ -64,25 +64,29 @@ class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProvide
_closedOpacityAnimation = Tween<double>( _closedOpacityAnimation = Tween<double>(
begin: 1, begin: 1,
end: 0, end: 0,
).animate(CurvedAnimation( ).animate(
parent: _animationController, CurvedAnimation(
curve: const Interval( parent: _animationController,
0, curve: const Interval(
0.8, 0,
curve: Curves.ease, 0.8,
curve: Curves.ease,
),
), ),
),); );
_openedOpacityAnimation = Tween<double>( _openedOpacityAnimation = Tween<double>(
begin: 0, begin: 0,
end: 1, end: 1,
).animate(CurvedAnimation( ).animate(
parent: _animationController, CurvedAnimation(
curve: const Interval( parent: _animationController,
0.8, curve: const Interval(
1.0, 0.8,
curve: Curves.easeInOut, 1.0,
curve: Curves.easeInOut,
),
), ),
),); );
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
final mediaQuery = MediaQuery.of(context); final mediaQuery = MediaQuery.of(context);

View file

@ -36,7 +36,9 @@ class CalibrationDialogBloc extends Bloc<CalibrationDialogEvent, CalibrationDial
} }
void _onLightSensorEvCalibrationChanged( void _onLightSensorEvCalibrationChanged(
LightSensorEvCalibrationChangedEvent event, Emitter emit,) { LightSensorEvCalibrationChangedEvent event,
Emitter emit,
) {
_lightSensorEvCalibration = event.value; _lightSensorEvCalibration = event.value;
emit(CalibrationDialogState(_cameraEvCalibration, _lightSensorEvCalibration)); emit(CalibrationDialogState(_cameraEvCalibration, _lightSensorEvCalibration));
} }

View file

@ -13,7 +13,8 @@ class EquipmentProfilesListTile extends StatelessWidget {
title: Text(S.of(context).equipmentProfiles), title: Text(S.of(context).equipmentProfiles),
onTap: () { onTap: () {
Navigator.of(context).push<EquipmentProfileData>( Navigator.of(context).push<EquipmentProfileData>(
MaterialPageRoute(builder: (_) => const EquipmentProfilesScreen()),); MaterialPageRoute(builder: (_) => const EquipmentProfilesScreen()),
);
}, },
); );
} }

View file

@ -28,47 +28,48 @@ class _PrimaryColorDialogPickerState extends State<PrimaryColorDialogPicker> {
titlePadding: Dimens.dialogIconTitlePadding, titlePadding: Dimens.dialogIconTitlePadding,
title: Text(S.of(context).choosePrimaryColor), title: Text(S.of(context).choosePrimaryColor),
content: SizedBox( content: SizedBox(
height: Dimens.grid48, height: Dimens.grid48,
width: double.maxFinite, width: double.maxFinite,
child: Stack( child: Stack(
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
controller: _scrollController, controller: _scrollController,
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
child: Row( child: Row(
children: List.generate( children: List.generate(
ThemeProvider.primaryColorsList.length, ThemeProvider.primaryColorsList.length,
(index) { (index) {
final color = ThemeProvider.primaryColorsList[index]; final color = ThemeProvider.primaryColorsList[index];
return Padding( return Padding(
padding: EdgeInsets.only(left: index == 0 ? 0 : Dimens.paddingS), padding: EdgeInsets.only(left: index == 0 ? 0 : Dimens.paddingS),
child: _SelectableColorItem( child: _SelectableColorItem(
color: color, color: color,
selected: color.value == _selected.value, selected: color.value == _selected.value,
onTap: () { onTap: () {
setState(() { setState(() {
_selected = color; _selected = color;
}); });
}, },
), ),
); );
}, },
),
), ),
), ),
const Row( ),
mainAxisAlignment: MainAxisAlignment.spaceBetween, const Row(
children: [ mainAxisAlignment: MainAxisAlignment.spaceBetween,
_Cutout(), children: [
RotatedBox( _Cutout(),
quarterTurns: 2, RotatedBox(
child: _Cutout(), quarterTurns: 2,
), child: _Cutout(),
], ),
), ],
], ),
),), ],
),
),
actionsPadding: Dimens.dialogActionsPadding, actionsPadding: Dimens.dialogActionsPadding,
actions: [ actions: [
TextButton( TextButton(