mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2025-07-11 16:40:43 +00:00
ML-236 Exposure offset for equipment profiles (#238)
* Set `targetSdkVersion ` to 35 * unified zoom icons * expose exposure and zoom ranges * added list tile to set exposure offset for equipment profile * added translations * Update metering_screen.png * use latest m3 packages * fixed iap stub * added missing field
This commit is contained in:
parent
02184529ed
commit
dfe10493b8
18 changed files with 892 additions and 824 deletions
|
@ -20,6 +20,7 @@ class EquipmentProfilesStorageService {
|
||||||
List<ApertureValue>? apertureValues,
|
List<ApertureValue>? apertureValues,
|
||||||
List<ShutterSpeedValue>? shutterSpeedValues,
|
List<ShutterSpeedValue>? shutterSpeedValues,
|
||||||
double? lensZoom,
|
double? lensZoom,
|
||||||
|
double? exposureOffset,
|
||||||
bool? isUsed,
|
bool? isUsed,
|
||||||
}) async {}
|
}) async {}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ dependencies:
|
||||||
m3_lightmeter_resources:
|
m3_lightmeter_resources:
|
||||||
git:
|
git:
|
||||||
url: "https://github.com/vodemn/m3_lightmeter_resources"
|
url: "https://github.com/vodemn/m3_lightmeter_resources"
|
||||||
ref: v2.1.0
|
ref: v2.2.0
|
||||||
shared_preferences:
|
shared_preferences:
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
"calibrationMessageCameraOnly": "Die Genauigkeit der Messungen sind vollständig von der Kamera des Geräts abhängig. Deshalb ist es empfehlenswert diese App zu testen und EV-Kalibrationswerte einzustellen, die korrekte Messungen produzieren.",
|
"calibrationMessageCameraOnly": "Die Genauigkeit der Messungen sind vollständig von der Kamera des Geräts abhängig. Deshalb ist es empfehlenswert diese App zu testen und EV-Kalibrationswerte einzustellen, die korrekte Messungen produzieren.",
|
||||||
"camera": "Kamera",
|
"camera": "Kamera",
|
||||||
"lightSensor": "Lichtsensor",
|
"lightSensor": "Lichtsensor",
|
||||||
"showEv100": "EV\u2081\u2080\u2080 anzeigen",
|
"showEv100": "EV₁₀₀ anzeigen",
|
||||||
"meteringScreenLayout": "Messansicht Layout",
|
"meteringScreenLayout": "Messansicht Layout",
|
||||||
"meteringScreenLayoutHint": "Verstecke Elemente von der Messansicht, damit sie nicht den Platz für Belichtungspaare verschwenden.",
|
"meteringScreenLayoutHint": "Verstecke Elemente von der Messansicht, damit sie nicht den Platz für Belichtungspaare verschwenden.",
|
||||||
"meteringScreenLayoutHintEquipmentProfiles": "Ausrüstungsprofil Auswahl",
|
"meteringScreenLayoutHintEquipmentProfiles": "Ausrüstungsprofil Auswahl",
|
||||||
|
@ -66,6 +66,8 @@
|
||||||
"isoValuesFilterDescription": "Wähle die anzuzeigenden ISO Werte aus. (Beispielsweise die Meistverwendeten)",
|
"isoValuesFilterDescription": "Wähle die anzuzeigenden ISO Werte aus. (Beispielsweise die Meistverwendeten)",
|
||||||
"lensZoom": "Objektiv-Zoom",
|
"lensZoom": "Objektiv-Zoom",
|
||||||
"lensZoomDescription": "Wähle den Zoom, relativ zur Handykamera, dass mit dem Sucher der Kamera übereinstimmt.",
|
"lensZoomDescription": "Wähle den Zoom, relativ zur Handykamera, dass mit dem Sucher der Kamera übereinstimmt.",
|
||||||
|
"exposureOffset": "Belichtungskorrektur",
|
||||||
|
"exposureOffsetDescription": "Stellen Sie die Belichtungskorrektur ein, um die genauesten Ergebnisse für die jeweilige Kamera zu erzielen.",
|
||||||
"equipmentProfile": "Ausrüstungsprofil",
|
"equipmentProfile": "Ausrüstungsprofil",
|
||||||
"equipmentProfiles": "Ausrüstungsprofile",
|
"equipmentProfiles": "Ausrüstungsprofile",
|
||||||
"tapToAdd": "Tippe zum Hinzufügen",
|
"tapToAdd": "Tippe zum Hinzufügen",
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
"calibrationMessageCameraOnly": "The accuracy of the readings measured by this application depends entirely on the rear camera of the device. Therefore, consider testing this application and setting up an EV calibration value that will give you the desired measurement results.",
|
"calibrationMessageCameraOnly": "The accuracy of the readings measured by this application depends entirely on the rear camera of the device. Therefore, consider testing this application and setting up an EV calibration value that will give you the desired measurement results.",
|
||||||
"camera": "Camera",
|
"camera": "Camera",
|
||||||
"lightSensor": "Light sensor",
|
"lightSensor": "Light sensor",
|
||||||
"showEv100": "Show EV\u2081\u2080\u2080",
|
"showEv100": "Show EV₁₀₀",
|
||||||
"meteringScreenLayout": "Metering screen layout",
|
"meteringScreenLayout": "Metering screen layout",
|
||||||
"meteringScreenLayoutHint": "Hide elements on the metering screen that you don't need so that they don't waste exposure pairs list space.",
|
"meteringScreenLayoutHint": "Hide elements on the metering screen that you don't need so that they don't waste exposure pairs list space.",
|
||||||
"meteringScreenLayoutHintEquipmentProfiles": "Equipment profile picker",
|
"meteringScreenLayoutHintEquipmentProfiles": "Equipment profile picker",
|
||||||
|
@ -66,6 +66,8 @@
|
||||||
"isoValuesFilterDescription": "Select the ISO values to display. These may be your most commonly used values or those supported by your camera.",
|
"isoValuesFilterDescription": "Select the ISO values to display. These may be your most commonly used values or those supported by your camera.",
|
||||||
"lensZoom": "Lens zoom",
|
"lensZoom": "Lens zoom",
|
||||||
"lensZoomDescription": "Set the zoom level relative to the phone's camera to match your camera's viewfinder.",
|
"lensZoomDescription": "Set the zoom level relative to the phone's camera to match your camera's viewfinder.",
|
||||||
|
"exposureOffset": "Exposure offset",
|
||||||
|
"exposureOffsetDescription": "Set the exposure offset to get the most accurate results for the given camera.",
|
||||||
"equipmentProfile": "Equipment profile",
|
"equipmentProfile": "Equipment profile",
|
||||||
"equipmentProfiles": "Equipment profiles",
|
"equipmentProfiles": "Equipment profiles",
|
||||||
"tapToAdd": "Tap to add",
|
"tapToAdd": "Tap to add",
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
"calibrationMessageCameraOnly": "La précision des lectures mesurées par cette application dépend entièrement de la caméra arrière de l'appareil. Par conséquent, envisagez de tester cette application et de configurer une valeur d'étalonnage EV qui vous donnera les résultats de mesure souhaités.",
|
"calibrationMessageCameraOnly": "La précision des lectures mesurées par cette application dépend entièrement de la caméra arrière de l'appareil. Par conséquent, envisagez de tester cette application et de configurer une valeur d'étalonnage EV qui vous donnera les résultats de mesure souhaités.",
|
||||||
"camera": "Caméra",
|
"camera": "Caméra",
|
||||||
"lightSensor": "Capteur de lumière",
|
"lightSensor": "Capteur de lumière",
|
||||||
"showEv100": "Montrer EV\u2081\u2080\u2080",
|
"showEv100": "Montrer EV₁₀₀",
|
||||||
"meteringScreenLayout": "Disposition de l'écran de mesure",
|
"meteringScreenLayout": "Disposition de l'écran de mesure",
|
||||||
"meteringScreenLayoutHint": "Masquer les éléments sur l'écran de mesure dont vous n'avez pas besoin pour qu'ils ne gaspillent pas de l'espace dans les paires d'exposition.",
|
"meteringScreenLayoutHint": "Masquer les éléments sur l'écran de mesure dont vous n'avez pas besoin pour qu'ils ne gaspillent pas de l'espace dans les paires d'exposition.",
|
||||||
"meteringScreenLayoutHintEquipmentProfiles": "Sélecteur de profil de l'équipement",
|
"meteringScreenLayoutHintEquipmentProfiles": "Sélecteur de profil de l'équipement",
|
||||||
|
@ -66,6 +66,8 @@
|
||||||
"isoValuesFilterDescription": "Sélectionnez les valeurs ISO à afficher. Ce sont peut-être vos valeurs les plus couramment utilisées ou celles prises en charge par votre caméra.",
|
"isoValuesFilterDescription": "Sélectionnez les valeurs ISO à afficher. Ce sont peut-être vos valeurs les plus couramment utilisées ou celles prises en charge par votre caméra.",
|
||||||
"lensZoom": "Zoom sur l'objectif",
|
"lensZoom": "Zoom sur l'objectif",
|
||||||
"lensZoomDescription": "Réglez le niveau de zoom par rapport à l'appareil photo du téléphone pour qu'il corresponde au viseur de votre appareil photo.",
|
"lensZoomDescription": "Réglez le niveau de zoom par rapport à l'appareil photo du téléphone pour qu'il corresponde au viseur de votre appareil photo.",
|
||||||
|
"exposureOffset": "Décalage d’exposition",
|
||||||
|
"exposureOffsetDescription": "Définissez le décalage d’exposition pour obtenir les résultats les plus précis selon l’appareil photo.",
|
||||||
"equipmentProfile": "Profil de l'équipement",
|
"equipmentProfile": "Profil de l'équipement",
|
||||||
"equipmentProfiles": "Profils de l'équipement",
|
"equipmentProfiles": "Profils de l'équipement",
|
||||||
"tapToAdd": "Appuie pour ajouter",
|
"tapToAdd": "Appuie pour ajouter",
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
"calibrationMessageCameraOnly": "Точность измерений данного приложения полностью зависит от точности камеры вашего устройства. Поэтому рекомендуется самостоятельно подобрать калибровочное значение, которое даст желаемый результат измерений.",
|
"calibrationMessageCameraOnly": "Точность измерений данного приложения полностью зависит от точности камеры вашего устройства. Поэтому рекомендуется самостоятельно подобрать калибровочное значение, которое даст желаемый результат измерений.",
|
||||||
"camera": "Камера",
|
"camera": "Камера",
|
||||||
"lightSensor": "Датчик освещённости",
|
"lightSensor": "Датчик освещённости",
|
||||||
"showEv100": "Показывать EV\u2081\u2080\u2080",
|
"showEv100": "Показывать EV₁₀₀",
|
||||||
"meteringScreenLayout": "Элементы главного экрана",
|
"meteringScreenLayout": "Элементы главного экрана",
|
||||||
"meteringScreenLayoutHint": "Здесь вы можете скрыть некоторые ненужные или неиспользуемые элементы с главного экрана.",
|
"meteringScreenLayoutHint": "Здесь вы можете скрыть некоторые ненужные или неиспользуемые элементы с главного экрана.",
|
||||||
"meteringScreenLayoutHintEquipmentProfiles": "Выбор профиля оборудования",
|
"meteringScreenLayoutHintEquipmentProfiles": "Выбор профиля оборудования",
|
||||||
|
@ -66,6 +66,8 @@
|
||||||
"isoValuesFilterDescription": "Выберите значения ISO для отображения. Это может быть наиболее часто используемые значения или значения, поддерживаемые вашей камерой.",
|
"isoValuesFilterDescription": "Выберите значения ISO для отображения. Это может быть наиболее часто используемые значения или значения, поддерживаемые вашей камерой.",
|
||||||
"lensZoom": "Зум объектива",
|
"lensZoom": "Зум объектива",
|
||||||
"lensZoomDescription": "Установите уровень зума относительно камеры телефона, чтобы он соответствовал видоискателю вашей камеры.",
|
"lensZoomDescription": "Установите уровень зума относительно камеры телефона, чтобы он соответствовал видоискателю вашей камеры.",
|
||||||
|
"exposureOffset": "Смещение экспозиции",
|
||||||
|
"exposureOffsetDescription": "Установите смещение экспозиции для получения наиболее точных результатов с данной камерой.",
|
||||||
"equipmentProfile": "Оборудование",
|
"equipmentProfile": "Оборудование",
|
||||||
"equipmentProfiles": "Профили оборудования",
|
"equipmentProfiles": "Профили оборудования",
|
||||||
"tapToAdd": "Нажмите, чтобы добавить",
|
"tapToAdd": "Нажмите, чтобы добавить",
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
"calibrationMessageCameraOnly": "此应用测量读数的准确性取决于设备的后置摄像头。如需更精确的测量结果或测量结果存在偏差,请手动校准 EV 。",
|
"calibrationMessageCameraOnly": "此应用测量读数的准确性取决于设备的后置摄像头。如需更精确的测量结果或测量结果存在偏差,请手动校准 EV 。",
|
||||||
"camera": "摄像头",
|
"camera": "摄像头",
|
||||||
"lightSensor": "光线传感器",
|
"lightSensor": "光线传感器",
|
||||||
"showEv100": "显示 EV\u2081\u2080\u2080",
|
"showEv100": "显示 EV₁₀₀",
|
||||||
"meteringScreenLayout": "布局",
|
"meteringScreenLayout": "布局",
|
||||||
"meteringScreenLayoutHint": "隐藏不需要的元素,让主界面更加整洁",
|
"meteringScreenLayoutHint": "隐藏不需要的元素,让主界面更加整洁",
|
||||||
"meteringScreenLayoutHintEquipmentProfiles": "选择设备配置",
|
"meteringScreenLayoutHintEquipmentProfiles": "选择设备配置",
|
||||||
|
@ -66,6 +66,8 @@
|
||||||
"isoValuesFilterDescription": "选择要显示的 ISO 范围。",
|
"isoValuesFilterDescription": "选择要显示的 ISO 范围。",
|
||||||
"lensZoom": "镜头变焦",
|
"lensZoom": "镜头变焦",
|
||||||
"lensZoomDescription": "设置相对于手机摄像头的变焦焦距,使其与相机取景相匹配。",
|
"lensZoomDescription": "设置相对于手机摄像头的变焦焦距,使其与相机取景相匹配。",
|
||||||
|
"exposureOffset": "曝光补偿",
|
||||||
|
"exposureOffsetDescription": "设置曝光补偿,以获得针对所用相机的最准确结果。",
|
||||||
"equipmentProfile": "设备配置",
|
"equipmentProfile": "设备配置",
|
||||||
"equipmentProfiles": "设备配置",
|
"equipmentProfiles": "设备配置",
|
||||||
"tapToAdd": "点击添加",
|
"tapToAdd": "点击添加",
|
||||||
|
|
|
@ -73,13 +73,13 @@ class EquipmentProfilesProviderState extends State<EquipmentProfilesProvider> {
|
||||||
final oldProfile = _customProfiles[profile.id]!.value;
|
final oldProfile = _customProfiles[profile.id]!.value;
|
||||||
await widget.storageService.updateProfile(
|
await widget.storageService.updateProfile(
|
||||||
id: profile.id,
|
id: profile.id,
|
||||||
name: oldProfile.name != profile.name ? profile.name : null,
|
name: oldProfile.name.changedOrNull(profile.name),
|
||||||
apertureValues: oldProfile.apertureValues != profile.apertureValues ? profile.apertureValues : null,
|
apertureValues: oldProfile.apertureValues.changedOrNull(profile.apertureValues),
|
||||||
shutterSpeedValues:
|
shutterSpeedValues: oldProfile.shutterSpeedValues.changedOrNull(profile.shutterSpeedValues),
|
||||||
oldProfile.shutterSpeedValues != profile.shutterSpeedValues ? profile.shutterSpeedValues : null,
|
isoValues: oldProfile.isoValues.changedOrNull(profile.isoValues),
|
||||||
isoValues: oldProfile.isoValues != profile.isoValues ? profile.isoValues : null,
|
ndValues: oldProfile.ndValues.changedOrNull(profile.ndValues),
|
||||||
ndValues: oldProfile.ndValues != profile.ndValues ? profile.ndValues : null,
|
lensZoom: oldProfile.lensZoom.changedOrNull(profile.lensZoom),
|
||||||
lensZoom: oldProfile.lensZoom != profile.lensZoom ? profile.lensZoom : null,
|
exposureOffset: oldProfile.exposureOffset.changedOrNull(profile.exposureOffset),
|
||||||
);
|
);
|
||||||
_customProfiles[profile.id] = (value: profile, isUsed: _customProfiles[profile.id]!.isUsed);
|
_customProfiles[profile.id] = (value: profile, isUsed: _customProfiles[profile.id]!.isUsed);
|
||||||
setState(() {});
|
setState(() {});
|
||||||
|
@ -183,3 +183,9 @@ class EquipmentProfiles extends InheritedModel<_EquipmentProfilesModelAspect> {
|
||||||
const DeepCollectionEquality().equals(oldWidget.profiles, profiles));
|
const DeepCollectionEquality().equals(oldWidget.profiles, profiles));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension on Object {
|
||||||
|
T? changedOrNull<T>(T newValue) {
|
||||||
|
return this != newValue ? newValue : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -42,6 +42,7 @@ class EquipmentProfileEditBloc extends Bloc<EquipmentProfileEditEvent, Equipment
|
||||||
isoValues: profile.isoValues,
|
isoValues: profile.isoValues,
|
||||||
ndValues: profile.ndValues,
|
ndValues: profile.ndValues,
|
||||||
lensZoom: profile.lensZoom,
|
lensZoom: profile.lensZoom,
|
||||||
|
exposureOffset: profile.exposureOffset,
|
||||||
canSave: false,
|
canSave: false,
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
|
@ -60,6 +61,8 @@ class EquipmentProfileEditBloc extends Bloc<EquipmentProfileEditEvent, Equipment
|
||||||
await _onNdValuesChanged(e, emit);
|
await _onNdValuesChanged(e, emit);
|
||||||
case final EquipmentProfileLensZoomChangedEvent e:
|
case final EquipmentProfileLensZoomChangedEvent e:
|
||||||
await _onLensZoomChanged(e, emit);
|
await _onLensZoomChanged(e, emit);
|
||||||
|
case final EquipmentProfileExposureOffsetChangedEvent e:
|
||||||
|
await _onExposureOffsetChanged(e, emit);
|
||||||
case EquipmentProfileSaveEvent():
|
case EquipmentProfileSaveEvent():
|
||||||
await _onSave(event, emit);
|
await _onSave(event, emit);
|
||||||
case EquipmentProfileCopyEvent():
|
case EquipmentProfileCopyEvent():
|
||||||
|
@ -131,6 +134,16 @@ class EquipmentProfileEditBloc extends Bloc<EquipmentProfileEditEvent, Equipment
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _onExposureOffsetChanged(EquipmentProfileExposureOffsetChangedEvent event, Emitter emit) async {
|
||||||
|
_newEquipmentProfile = _newEquipmentProfile.copyWith(exposureOffset: event.exposureOffset);
|
||||||
|
emit(
|
||||||
|
state.copyWith(
|
||||||
|
exposureOffset: event.exposureOffset,
|
||||||
|
canSave: _canSave(state.name, event.exposureOffset),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> _onSave(EquipmentProfileSaveEvent _, Emitter emit) async {
|
Future<void> _onSave(EquipmentProfileSaveEvent _, Emitter emit) async {
|
||||||
emit(state.copyWith(isLoading: true));
|
emit(state.copyWith(isLoading: true));
|
||||||
if (_isEdit) {
|
if (_isEdit) {
|
||||||
|
@ -143,6 +156,7 @@ class EquipmentProfileEditBloc extends Bloc<EquipmentProfileEditEvent, Equipment
|
||||||
shutterSpeedValues: state.shutterSpeedValues,
|
shutterSpeedValues: state.shutterSpeedValues,
|
||||||
isoValues: state.isoValues,
|
isoValues: state.isoValues,
|
||||||
lensZoom: state.lensZoom,
|
lensZoom: state.lensZoom,
|
||||||
|
exposureOffset: state.exposureOffset,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
@ -155,6 +169,7 @@ class EquipmentProfileEditBloc extends Bloc<EquipmentProfileEditEvent, Equipment
|
||||||
shutterSpeedValues: state.shutterSpeedValues,
|
shutterSpeedValues: state.shutterSpeedValues,
|
||||||
isoValues: state.isoValues,
|
isoValues: state.isoValues,
|
||||||
lensZoom: state.lensZoom,
|
lensZoom: state.lensZoom,
|
||||||
|
exposureOffset: state.exposureOffset,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -173,6 +188,6 @@ class EquipmentProfileEditBloc extends Bloc<EquipmentProfileEditEvent, Equipment
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _canSave(String name, double? lensZoom) {
|
bool _canSave(String name, double? lensZoom) {
|
||||||
return name.isNotEmpty && lensZoom != null && _newEquipmentProfile != _originalEquipmentProfile;
|
return name.isNotEmpty && _newEquipmentProfile != _originalEquipmentProfile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,12 @@ class EquipmentProfileLensZoomChangedEvent extends EquipmentProfileEditEvent {
|
||||||
const EquipmentProfileLensZoomChangedEvent(this.lensZoom);
|
const EquipmentProfileLensZoomChangedEvent(this.lensZoom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class EquipmentProfileExposureOffsetChangedEvent extends EquipmentProfileEditEvent {
|
||||||
|
final double exposureOffset;
|
||||||
|
|
||||||
|
const EquipmentProfileExposureOffsetChangedEvent(this.exposureOffset);
|
||||||
|
}
|
||||||
|
|
||||||
class EquipmentProfileSaveEvent extends EquipmentProfileEditEvent {
|
class EquipmentProfileSaveEvent extends EquipmentProfileEditEvent {
|
||||||
const EquipmentProfileSaveEvent();
|
const EquipmentProfileSaveEvent();
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,9 +10,11 @@ import 'package:lightmeter/screens/equipment_profile_edit/components/slider_pick
|
||||||
import 'package:lightmeter/screens/equipment_profile_edit/event_equipment_profile_edit.dart';
|
import 'package:lightmeter/screens/equipment_profile_edit/event_equipment_profile_edit.dart';
|
||||||
import 'package:lightmeter/screens/equipment_profile_edit/flow_equipment_profile_edit.dart';
|
import 'package:lightmeter/screens/equipment_profile_edit/flow_equipment_profile_edit.dart';
|
||||||
import 'package:lightmeter/screens/equipment_profile_edit/state_equipment_profile_edit.dart';
|
import 'package:lightmeter/screens/equipment_profile_edit/state_equipment_profile_edit.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/camera_container/bloc_container_camera.dart';
|
||||||
import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart';
|
import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart';
|
||||||
import 'package:lightmeter/screens/shared/text_field/widget_text_field.dart';
|
import 'package:lightmeter/screens/shared/text_field/widget_text_field.dart';
|
||||||
import 'package:lightmeter/utils/double_to_zoom.dart';
|
import 'package:lightmeter/utils/double_to_zoom.dart';
|
||||||
|
import 'package:lightmeter/utils/to_string_signed.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
class EquipmentProfileEditScreen extends StatefulWidget {
|
class EquipmentProfileEditScreen extends StatefulWidget {
|
||||||
|
@ -108,6 +110,7 @@ class _EquipmentProfileEditScreenState extends State<EquipmentProfileEditScreen>
|
||||||
_ApertureValuesListTileBuilder(),
|
_ApertureValuesListTileBuilder(),
|
||||||
_ShutterSpeedValuesListTileBuilder(),
|
_ShutterSpeedValuesListTileBuilder(),
|
||||||
_LensZoomListTileBuilder(),
|
_LensZoomListTileBuilder(),
|
||||||
|
_ExposureOffsetListTileBuilder(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -246,7 +249,7 @@ class _LensZoomListTileBuilder extends StatelessWidget {
|
||||||
title: S.of(context).lensZoom,
|
title: S.of(context).lensZoom,
|
||||||
description: S.of(context).lensZoomDescription,
|
description: S.of(context).lensZoomDescription,
|
||||||
value: state.lensZoom,
|
value: state.lensZoom,
|
||||||
range: const RangeValues(1, 7),
|
range: CameraContainerBloc.zoomMaxRange,
|
||||||
valueAdapter: (context, value) => value.toZoom(context),
|
valueAdapter: (context, value) => value.toZoom(context),
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
context.read<EquipmentProfileEditBloc>().add(EquipmentProfileLensZoomChangedEvent(value));
|
context.read<EquipmentProfileEditBloc>().add(EquipmentProfileLensZoomChangedEvent(value));
|
||||||
|
@ -255,3 +258,24 @@ class _LensZoomListTileBuilder extends StatelessWidget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _ExposureOffsetListTileBuilder extends StatelessWidget {
|
||||||
|
const _ExposureOffsetListTileBuilder();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BlocBuilder<EquipmentProfileEditBloc, EquipmentProfileEditState>(
|
||||||
|
builder: (context, state) => SliderPickerListTile(
|
||||||
|
icon: Icons.light_mode_outlined,
|
||||||
|
title: S.of(context).exposureOffset,
|
||||||
|
description: S.of(context).exposureOffsetDescription,
|
||||||
|
value: state.exposureOffset,
|
||||||
|
range: CameraContainerBloc.exposureMaxRange,
|
||||||
|
valueAdapter: (context, value) => S.of(context).evValue(value.toStringSignedAsFixed(1)),
|
||||||
|
onChanged: (value) {
|
||||||
|
context.read<EquipmentProfileEditBloc>().add(EquipmentProfileExposureOffsetChangedEvent(value));
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ class EquipmentProfileEditState {
|
||||||
final List<ShutterSpeedValue> shutterSpeedValues;
|
final List<ShutterSpeedValue> shutterSpeedValues;
|
||||||
final List<IsoValue> isoValues;
|
final List<IsoValue> isoValues;
|
||||||
final double lensZoom;
|
final double lensZoom;
|
||||||
|
final double exposureOffset;
|
||||||
final bool canSave;
|
final bool canSave;
|
||||||
final bool isLoading;
|
final bool isLoading;
|
||||||
final EquipmentProfile? profileToCopy;
|
final EquipmentProfile? profileToCopy;
|
||||||
|
@ -18,6 +19,7 @@ class EquipmentProfileEditState {
|
||||||
required this.shutterSpeedValues,
|
required this.shutterSpeedValues,
|
||||||
required this.isoValues,
|
required this.isoValues,
|
||||||
required this.lensZoom,
|
required this.lensZoom,
|
||||||
|
required this.exposureOffset,
|
||||||
required this.canSave,
|
required this.canSave,
|
||||||
this.isLoading = false,
|
this.isLoading = false,
|
||||||
this.profileToCopy,
|
this.profileToCopy,
|
||||||
|
@ -30,6 +32,7 @@ class EquipmentProfileEditState {
|
||||||
List<ShutterSpeedValue>? shutterSpeedValues,
|
List<ShutterSpeedValue>? shutterSpeedValues,
|
||||||
List<IsoValue>? isoValues,
|
List<IsoValue>? isoValues,
|
||||||
double? lensZoom,
|
double? lensZoom,
|
||||||
|
double? exposureOffset,
|
||||||
bool? canSave,
|
bool? canSave,
|
||||||
bool? isLoading,
|
bool? isLoading,
|
||||||
EquipmentProfile? profileToCopy,
|
EquipmentProfile? profileToCopy,
|
||||||
|
@ -41,6 +44,7 @@ class EquipmentProfileEditState {
|
||||||
shutterSpeedValues: shutterSpeedValues ?? this.shutterSpeedValues,
|
shutterSpeedValues: shutterSpeedValues ?? this.shutterSpeedValues,
|
||||||
isoValues: isoValues ?? this.isoValues,
|
isoValues: isoValues ?? this.isoValues,
|
||||||
lensZoom: lensZoom ?? this.lensZoom,
|
lensZoom: lensZoom ?? this.lensZoom,
|
||||||
|
exposureOffset: exposureOffset ?? this.exposureOffset,
|
||||||
canSave: canSave ?? this.canSave,
|
canSave: canSave ?? this.canSave,
|
||||||
isLoading: isLoading ?? this.isLoading,
|
isLoading: isLoading ?? this.isLoading,
|
||||||
profileToCopy: profileToCopy ?? this.profileToCopy,
|
profileToCopy: profileToCopy ?? this.profileToCopy,
|
||||||
|
|
|
@ -30,11 +30,11 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
|
||||||
CameraDescription? _camera;
|
CameraDescription? _camera;
|
||||||
CameraController? _cameraController;
|
CameraController? _cameraController;
|
||||||
|
|
||||||
static const _maxZoom = 7.0;
|
static const zoomMaxRange = RangeValues(1, 7);
|
||||||
RangeValues? _zoomRange;
|
RangeValues? _zoomRange;
|
||||||
double _currentZoom = 1.0;
|
double _currentZoom = 1.0;
|
||||||
|
|
||||||
static const _exposureMaxRange = RangeValues(-4, 4);
|
static const exposureMaxRange = RangeValues(-4, 4);
|
||||||
RangeValues? _exposureOffsetRange;
|
RangeValues? _exposureOffsetRange;
|
||||||
double _exposureStep = 0.1;
|
double _exposureStep = 0.1;
|
||||||
double _currentExposureOffset = 0.0;
|
double _currentExposureOffset = 0.0;
|
||||||
|
@ -90,8 +90,10 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
|
||||||
case final communication_states.EquipmentProfileChangedState communicationState:
|
case final communication_states.EquipmentProfileChangedState communicationState:
|
||||||
if (state is CameraActiveState) {
|
if (state is CameraActiveState) {
|
||||||
add(ZoomChangedEvent(communicationState.profile.lensZoom));
|
add(ZoomChangedEvent(communicationState.profile.lensZoom));
|
||||||
|
add(ExposureOffsetChangedEvent(communicationState.profile.exposureOffset));
|
||||||
} else {
|
} else {
|
||||||
_currentZoom = communicationState.profile.lensZoom;
|
_currentZoom = communicationState.profile.lensZoom;
|
||||||
|
_currentExposureOffset = communicationState.profile.exposureOffset;
|
||||||
}
|
}
|
||||||
case communication_states.SettingsOpenedState():
|
case communication_states.SettingsOpenedState():
|
||||||
_settingsOpened = true;
|
_settingsOpened = true;
|
||||||
|
@ -153,8 +155,8 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
|
||||||
cameraController.getExposureOffsetStepSize(),
|
cameraController.getExposureOffsetStepSize(),
|
||||||
]).then((value) {
|
]).then((value) {
|
||||||
_exposureOffsetRange = RangeValues(
|
_exposureOffsetRange = RangeValues(
|
||||||
math.max(_exposureMaxRange.start, value[0]),
|
math.max(exposureMaxRange.start, value[0]),
|
||||||
math.min(_exposureMaxRange.end, value[1]),
|
math.min(exposureMaxRange.end, value[1]),
|
||||||
);
|
);
|
||||||
_currentExposureOffset = 0.0;
|
_currentExposureOffset = 0.0;
|
||||||
_exposureStep = value[2] == 0 ? 0.1 : value[2];
|
_exposureStep = value[2] == 0 ? 0.1 : value[2];
|
||||||
|
@ -168,7 +170,7 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
|
||||||
]).then((value) {
|
]).then((value) {
|
||||||
_zoomRange = RangeValues(
|
_zoomRange = RangeValues(
|
||||||
math.max(1.0, value[0]),
|
math.max(1.0, value[0]),
|
||||||
math.min(_maxZoom, value[1]),
|
math.min(zoomMaxRange.end, value[1]),
|
||||||
);
|
);
|
||||||
if (_currentZoom < _zoomRange!.start || _currentZoom > _zoomRange!.end) {
|
if (_currentZoom < _zoomRange!.start || _currentZoom > _zoomRange!.end) {
|
||||||
_currentZoom = _zoomRange!.start;
|
_currentZoom = _zoomRange!.start;
|
||||||
|
|
|
@ -21,7 +21,7 @@ class ZoomSlider extends StatelessWidget {
|
||||||
range: range,
|
range: range,
|
||||||
value: value,
|
value: value,
|
||||||
onChanged: onChanged,
|
onChanged: onChanged,
|
||||||
icon: Icons.search_outlined,
|
icon: Icons.zoom_in_outlined,
|
||||||
defaultValue: EquipmentProfiles.selectedOf(context).lensZoom,
|
defaultValue: EquipmentProfiles.selectedOf(context).lensZoom,
|
||||||
rulerValueAdapter: (value) => value.toStringAsFixed(0),
|
rulerValueAdapter: (value) => value.toStringAsFixed(0),
|
||||||
valueAdapter: (value) => value.toZoom(context),
|
valueAdapter: (value) => value.toZoom(context),
|
||||||
|
|
12
pubspec.lock
12
pubspec.lock
|
@ -829,20 +829,20 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: "v2.1.3"
|
ref: "v2.2.0"
|
||||||
resolved-ref: "4575586ff6114b780ca651b7ac7c272a4a4801eb"
|
resolved-ref: f8a0ab311a696b53d7172412922ce5c69b68fd4e
|
||||||
url: "https://github.com/vodemn/m3_lightmeter_iap"
|
url: "https://github.com/vodemn/m3_lightmeter_iap"
|
||||||
source: git
|
source: git
|
||||||
version: "2.1.3+30"
|
version: "2.2.0+31"
|
||||||
m3_lightmeter_resources:
|
m3_lightmeter_resources:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: "v2.1.0"
|
ref: "v2.2.0"
|
||||||
resolved-ref: "0e6eefe534adce851df639dcd28463a9089e5b92"
|
resolved-ref: a337627f92989d20ba9173f747255fa25262ca4e
|
||||||
url: "https://github.com/vodemn/m3_lightmeter_resources"
|
url: "https://github.com/vodemn/m3_lightmeter_resources"
|
||||||
source: git
|
source: git
|
||||||
version: "2.1.0+9"
|
version: "2.2.0+10"
|
||||||
macros:
|
macros:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -32,11 +32,11 @@ dependencies:
|
||||||
m3_lightmeter_iap:
|
m3_lightmeter_iap:
|
||||||
git:
|
git:
|
||||||
url: "https://github.com/vodemn/m3_lightmeter_iap"
|
url: "https://github.com/vodemn/m3_lightmeter_iap"
|
||||||
ref: v2.1.3
|
ref: v2.2.0
|
||||||
m3_lightmeter_resources:
|
m3_lightmeter_resources:
|
||||||
git:
|
git:
|
||||||
url: "https://github.com/vodemn/m3_lightmeter_resources"
|
url: "https://github.com/vodemn/m3_lightmeter_resources"
|
||||||
ref: v2.1.0
|
ref: v2.2.0
|
||||||
material_color_utilities: 0.12.0
|
material_color_utilities: 0.12.0
|
||||||
package_info_plus: 8.1.3
|
package_info_plus: 8.1.3
|
||||||
permission_handler: 11.3.1
|
permission_handler: 11.3.1
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
defaults -currentHost write -g AppleFontSmoothing -int 0
|
defaults -currentHost write -g AppleFontSmoothing -int 0
|
||||||
goldens=$(find ./test -name "*_golden_test.dart" -print)
|
goldens=$(find ./test -name "*_golden_test.dart" -print)
|
||||||
for f in $goldens; do
|
for f in $goldens; do
|
||||||
flutter test "$f" --dart-define cameraStubImage=assets/camera_stub_image.jpg --update-goldens
|
fvm flutter test "$f" --dart-define cameraStubImage=assets/camera_stub_image.jpg --update-goldens
|
||||||
done
|
done
|
||||||
defaults -currentHost write -g AppleFontSmoothing -int 3
|
defaults -currentHost write -g AppleFontSmoothing -int 3
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
Loading…
Reference in a new issue