mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2025-09-18 15:36:42 +00:00
show pinhole shutter speed (wip)
This commit is contained in:
parent
424e4b4d29
commit
f260d8d5ca
10 changed files with 82 additions and 26 deletions
|
@ -62,6 +62,7 @@
|
||||||
"apertureValuesFilterDescription": "Wählen Sie den Blendenbereich für Ihr Objektiv",
|
"apertureValuesFilterDescription": "Wählen Sie den Blendenbereich für Ihr Objektiv",
|
||||||
"ndFilters": "ND Filter",
|
"ndFilters": "ND Filter",
|
||||||
"ndFiltersFilterDescription": "Wählen Sie verfügbare ND-Filter",
|
"ndFiltersFilterDescription": "Wählen Sie verfügbare ND-Filter",
|
||||||
|
"shutterSpeed": "Belichtungszeit",
|
||||||
"shutterSpeedValues": "Belichtungszeiten",
|
"shutterSpeedValues": "Belichtungszeiten",
|
||||||
"shutterSpeedValue": "Belichtungszeit",
|
"shutterSpeedValue": "Belichtungszeit",
|
||||||
"shutterSpeedValuesFilterDescription": "Wählen Sie den Verschlusszeitenbereich für Ihre Kamera",
|
"shutterSpeedValuesFilterDescription": "Wählen Sie den Verschlusszeitenbereich für Ihre Kamera",
|
||||||
|
|
|
@ -62,6 +62,7 @@
|
||||||
"apertureValuesFilterDescription": "Select aperture range for your lens",
|
"apertureValuesFilterDescription": "Select aperture range for your lens",
|
||||||
"ndFilters": "ND filters",
|
"ndFilters": "ND filters",
|
||||||
"ndFiltersFilterDescription": "Select available ND filters",
|
"ndFiltersFilterDescription": "Select available ND filters",
|
||||||
|
"shutterSpeed": "Shutter speed",
|
||||||
"shutterSpeedValues": "Shutter speed values",
|
"shutterSpeedValues": "Shutter speed values",
|
||||||
"shutterSpeedValue": "Shutter speed value",
|
"shutterSpeedValue": "Shutter speed value",
|
||||||
"shutterSpeedValuesFilterDescription": "Select shutter speed range for your camera",
|
"shutterSpeedValuesFilterDescription": "Select shutter speed range for your camera",
|
||||||
|
|
|
@ -62,6 +62,7 @@
|
||||||
"apertureValuesFilterDescription": "Sélectionnez la plage d'ouverture pour votre objectif",
|
"apertureValuesFilterDescription": "Sélectionnez la plage d'ouverture pour votre objectif",
|
||||||
"ndFilters": "Filtres ND",
|
"ndFilters": "Filtres ND",
|
||||||
"ndFiltersFilterDescription": "Sélectionnez les filtres ND disponibles",
|
"ndFiltersFilterDescription": "Sélectionnez les filtres ND disponibles",
|
||||||
|
"shutterSpeed": "Vitesse d'obturation",
|
||||||
"shutterSpeedValues": "Valeurs de la vitesse d'obturation",
|
"shutterSpeedValues": "Valeurs de la vitesse d'obturation",
|
||||||
"shutterSpeedValue": "Valeur de la vitesse d'obturation",
|
"shutterSpeedValue": "Valeur de la vitesse d'obturation",
|
||||||
"shutterSpeedValuesFilterDescription": "Sélectionnez la plage de vitesses pour votre appareil",
|
"shutterSpeedValuesFilterDescription": "Sélectionnez la plage de vitesses pour votre appareil",
|
||||||
|
|
|
@ -62,6 +62,7 @@
|
||||||
"apertureValuesFilterDescription": "Wybierz zakres przysłony dla swojego obiektywu",
|
"apertureValuesFilterDescription": "Wybierz zakres przysłony dla swojego obiektywu",
|
||||||
"ndFilters": "Filtry ND",
|
"ndFilters": "Filtry ND",
|
||||||
"ndFiltersFilterDescription": "Wybierz dostępne filtry ND",
|
"ndFiltersFilterDescription": "Wybierz dostępne filtry ND",
|
||||||
|
"shutterSpeed": "Czas naświetlania",
|
||||||
"shutterSpeedValues": "Czasy naświetlania",
|
"shutterSpeedValues": "Czasy naświetlania",
|
||||||
"shutterSpeedValue": "Czas naświetlania",
|
"shutterSpeedValue": "Czas naświetlania",
|
||||||
"shutterSpeedValuesFilterDescription": "Wybierz zakres czasów naświetlania dla swojej kamery",
|
"shutterSpeedValuesFilterDescription": "Wybierz zakres czasów naświetlania dla swojej kamery",
|
||||||
|
|
|
@ -62,6 +62,7 @@
|
||||||
"apertureValuesFilterDescription": "Выберите диапазон диафрагмы для вашего объектива",
|
"apertureValuesFilterDescription": "Выберите диапазон диафрагмы для вашего объектива",
|
||||||
"ndFilters": "ND фильтры",
|
"ndFilters": "ND фильтры",
|
||||||
"ndFiltersFilterDescription": "Выберите доступные ND фильтры",
|
"ndFiltersFilterDescription": "Выберите доступные ND фильтры",
|
||||||
|
"shutterSpeed": "Выдержка",
|
||||||
"shutterSpeedValues": "Значения выдержки",
|
"shutterSpeedValues": "Значения выдержки",
|
||||||
"shutterSpeedValue": "Значение выдержки",
|
"shutterSpeedValue": "Значение выдержки",
|
||||||
"shutterSpeedValuesFilterDescription": "Выберите диапазон выдержек для вашей камеры",
|
"shutterSpeedValuesFilterDescription": "Выберите диапазон выдержек для вашей камеры",
|
||||||
|
|
|
@ -62,6 +62,7 @@
|
||||||
"apertureValuesFilterDescription": "选择镜头光圈范围",
|
"apertureValuesFilterDescription": "选择镜头光圈范围",
|
||||||
"ndFilters": "ND 滤镜",
|
"ndFilters": "ND 滤镜",
|
||||||
"ndFiltersFilterDescription": "选择可用的 ND 滤镜",
|
"ndFiltersFilterDescription": "选择可用的 ND 滤镜",
|
||||||
|
"shutterSpeed": "快门速度",
|
||||||
"shutterSpeedValues": "快门速度",
|
"shutterSpeedValues": "快门速度",
|
||||||
"shutterSpeedValue": "快门速度",
|
"shutterSpeedValue": "快门速度",
|
||||||
"shutterSpeedValuesFilterDescription": "选择相机快门范围",
|
"shutterSpeedValuesFilterDescription": "选择相机快门范围",
|
||||||
|
|
|
@ -6,6 +6,7 @@ import 'package:lightmeter/data/models/exposure_pair.dart';
|
||||||
import 'package:lightmeter/data/models/feature.dart';
|
import 'package:lightmeter/data/models/feature.dart';
|
||||||
import 'package:lightmeter/data/models/metering_screen_layout_config.dart';
|
import 'package:lightmeter/data/models/metering_screen_layout_config.dart';
|
||||||
import 'package:lightmeter/platform_config.dart';
|
import 'package:lightmeter/platform_config.dart';
|
||||||
|
import 'package:lightmeter/providers/equipment_profile_provider.dart';
|
||||||
import 'package:lightmeter/providers/remote_config_provider.dart';
|
import 'package:lightmeter/providers/remote_config_provider.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
import 'package:lightmeter/screens/metering/components/camera_container/bloc_container_camera.dart';
|
import 'package:lightmeter/screens/metering/components/camera_container/bloc_container_camera.dart';
|
||||||
|
@ -125,7 +126,10 @@ class CameraContainer extends StatelessWidget {
|
||||||
enabledFeaturesHeight += Dimens.readingContainerSingleValueHeight;
|
enabledFeaturesHeight += Dimens.readingContainerSingleValueHeight;
|
||||||
enabledFeaturesHeight += Dimens.paddingS;
|
enabledFeaturesHeight += Dimens.paddingS;
|
||||||
}
|
}
|
||||||
if (context.meteringFeature(MeteringScreenLayoutFeature.extremeExposurePairs)) {
|
if (EquipmentProfiles.selectedOf(context) is PinholeEquipmentProfile) {
|
||||||
|
enabledFeaturesHeight += Dimens.readingContainerSingleValueHeight;
|
||||||
|
enabledFeaturesHeight += Dimens.paddingS;
|
||||||
|
} else if (context.meteringFeature(MeteringScreenLayoutFeature.extremeExposurePairs)) {
|
||||||
enabledFeaturesHeight += Dimens.readingContainerDoubleValueHeight;
|
enabledFeaturesHeight += Dimens.readingContainerDoubleValueHeight;
|
||||||
enabledFeaturesHeight += Dimens.paddingS;
|
enabledFeaturesHeight += Dimens.paddingS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
|
import 'package:lightmeter/providers/films_provider.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shared/reading_value_container/widget_container_reading_value.dart';
|
||||||
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
|
class ShutterSpeedContainer extends StatelessWidget {
|
||||||
|
final ShutterSpeedValue? shutterSpeedValue;
|
||||||
|
|
||||||
|
const ShutterSpeedContainer({
|
||||||
|
required this.shutterSpeedValue,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return ReadingValueContainer.singleValue(
|
||||||
|
value: ReadingValue(
|
||||||
|
label: S.of(context).shutterSpeed,
|
||||||
|
value: _shutterSpeed(context),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
String _shutterSpeed(BuildContext context) {
|
||||||
|
if (shutterSpeedValue case final shutterSpeedValue?) {
|
||||||
|
return Films.selectedOf(context).reciprocityFailure(shutterSpeedValue).toString();
|
||||||
|
} else {
|
||||||
|
return '-';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,6 +11,7 @@ import 'package:lightmeter/screens/metering/components/shared/readings_container
|
||||||
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/iso_picker/widget_picker_iso.dart';
|
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/iso_picker/widget_picker_iso.dart';
|
||||||
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/lightmeter_pro_badge/widget_badge_lightmeter_pro.dart';
|
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/lightmeter_pro_badge/widget_badge_lightmeter_pro.dart';
|
||||||
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/nd_picker/widget_picker_nd.dart';
|
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/nd_picker/widget_picker_nd.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/shutter_speed_container/widget_container_shutter_speed.dart';
|
||||||
import 'package:lightmeter/utils/context_utils.dart';
|
import 'package:lightmeter/utils/context_utils.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
|
@ -45,7 +46,10 @@ class ReadingsContainer extends StatelessWidget {
|
||||||
const EquipmentProfilePicker(),
|
const EquipmentProfilePicker(),
|
||||||
const _InnerPadding(),
|
const _InnerPadding(),
|
||||||
],
|
],
|
||||||
if (context.meteringFeature(MeteringScreenLayoutFeature.extremeExposurePairs)) ...[
|
if (EquipmentProfiles.selectedOf(context) is PinholeEquipmentProfile) ...[
|
||||||
|
ShutterSpeedContainer(shutterSpeedValue: fastest?.shutterSpeed),
|
||||||
|
const _InnerPadding(),
|
||||||
|
] else if (context.meteringFeature(MeteringScreenLayoutFeature.extremeExposurePairs)) ...[
|
||||||
ExtremeExposurePairsContainer(
|
ExtremeExposurePairsContainer(
|
||||||
fastest: fastest,
|
fastest: fastest,
|
||||||
slowest: slowest,
|
slowest: slowest,
|
||||||
|
|
|
@ -169,12 +169,22 @@ class MeteringContainerBuidler extends StatelessWidget {
|
||||||
static List<ExposurePair> buildExposureValues(
|
static List<ExposurePair> buildExposureValues(
|
||||||
double ev,
|
double ev,
|
||||||
StopType stopType,
|
StopType stopType,
|
||||||
EquipmentProfile equipmentProfile,
|
IEquipmentProfile equipmentProfile,
|
||||||
) {
|
) {
|
||||||
if (ev.isNaN || ev.isInfinite) {
|
if (ev.isNaN || ev.isInfinite) {
|
||||||
return List.empty();
|
return List.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (equipmentProfile.id != "" && equipmentProfile is PinholeEquipmentProfile) {
|
||||||
|
final t = pow(equipmentProfile.aperture, 2) / pow(2, ev);
|
||||||
|
return [
|
||||||
|
ExposurePair(
|
||||||
|
ApertureValue(equipmentProfile.aperture, StopType.full),
|
||||||
|
ShutterSpeedValue(t, false, StopType.full),
|
||||||
|
),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/// Depending on the `stopType` the exposure pairs list length is multiplied by 1,2 or 3
|
/// Depending on the `stopType` the exposure pairs list length is multiplied by 1,2 or 3
|
||||||
final int evSteps = (ev * (stopType.index + 1)).round();
|
final int evSteps = (ev * (stopType.index + 1)).round();
|
||||||
|
|
||||||
|
@ -236,31 +246,31 @@ class MeteringContainerBuidler extends StatelessWidget {
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Full equipment profile, nothing to cut
|
/// Full equipment profile, nothing to cut
|
||||||
if (equipmentProfile.id == "") {
|
if (equipmentProfile.id != "" && equipmentProfile is EquipmentProfile) {
|
||||||
return exposurePairs;
|
final equipmentApertureValues = equipmentProfile.apertureValues.whereStopType(stopType);
|
||||||
|
final equipmentShutterSpeedValues = equipmentProfile.shutterSpeedValues.whereStopType(stopType);
|
||||||
|
|
||||||
|
final startCutEV = max(
|
||||||
|
exposurePairs.first.aperture.difference(equipmentApertureValues.first),
|
||||||
|
exposurePairs.first.shutterSpeed.difference(equipmentShutterSpeedValues.first),
|
||||||
|
);
|
||||||
|
final endCutEV = max(
|
||||||
|
equipmentApertureValues.last.difference(exposurePairs.last.aperture),
|
||||||
|
equipmentShutterSpeedValues.last != ShutterSpeedValue.values.last
|
||||||
|
? equipmentShutterSpeedValues.last.difference(exposurePairs.last.shutterSpeed)
|
||||||
|
: double.negativeInfinity,
|
||||||
|
);
|
||||||
|
|
||||||
|
final startCut = (startCutEV * (stopType.index + 1)).round().clamp(0, itemsCount);
|
||||||
|
final endCut = (endCutEV * (stopType.index + 1)).round().clamp(0, itemsCount);
|
||||||
|
|
||||||
|
if (startCut > itemsCount - endCut) {
|
||||||
|
return const [];
|
||||||
|
}
|
||||||
|
return exposurePairs.sublist(startCut, itemsCount - endCut);
|
||||||
}
|
}
|
||||||
|
|
||||||
final equipmentApertureValues = equipmentProfile.apertureValues.whereStopType(stopType);
|
return exposurePairs;
|
||||||
final equipmentShutterSpeedValues = equipmentProfile.shutterSpeedValues.whereStopType(stopType);
|
|
||||||
|
|
||||||
final startCutEV = max(
|
|
||||||
exposurePairs.first.aperture.difference(equipmentApertureValues.first),
|
|
||||||
exposurePairs.first.shutterSpeed.difference(equipmentShutterSpeedValues.first),
|
|
||||||
);
|
|
||||||
final endCutEV = max(
|
|
||||||
equipmentApertureValues.last.difference(exposurePairs.last.aperture),
|
|
||||||
equipmentShutterSpeedValues.last != ShutterSpeedValue.values.last
|
|
||||||
? equipmentShutterSpeedValues.last.difference(exposurePairs.last.shutterSpeed)
|
|
||||||
: double.negativeInfinity,
|
|
||||||
);
|
|
||||||
|
|
||||||
final startCut = (startCutEV * (stopType.index + 1)).round().clamp(0, itemsCount);
|
|
||||||
final endCut = (endCutEV * (stopType.index + 1)).round().clamp(0, itemsCount);
|
|
||||||
|
|
||||||
if (startCut > itemsCount - endCut) {
|
|
||||||
return const [];
|
|
||||||
}
|
|
||||||
return exposurePairs.sublist(startCut, itemsCount - endCut);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue