mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2024-11-21 23:10:40 +00:00
ML-70 Migrate to Dart 3 + stricter lints (#71)
* updated pub version * added lint * --code=always_use_package_imports * dart fixes * format * other lints
This commit is contained in:
parent
19a788adcb
commit
5602b1ed80
61 changed files with 259 additions and 260 deletions
|
@ -1 +1,10 @@
|
||||||
include: package:flutter_lints/flutter.yaml
|
include: package:lint/strict.yaml
|
||||||
|
|
||||||
|
|
||||||
|
linter:
|
||||||
|
rules:
|
||||||
|
use_setters_to_change_properties: false
|
||||||
|
|
||||||
|
analyzer:
|
||||||
|
exclude:
|
||||||
|
- "**/generated/**"
|
|
@ -5,24 +5,23 @@ import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
import 'package:lightmeter/data/caffeine_service.dart';
|
import 'package:lightmeter/data/caffeine_service.dart';
|
||||||
import 'package:lightmeter/data/haptics_service.dart';
|
import 'package:lightmeter/data/haptics_service.dart';
|
||||||
|
import 'package:lightmeter/data/light_sensor_service.dart';
|
||||||
import 'package:lightmeter/data/models/supported_locale.dart';
|
import 'package:lightmeter/data/models/supported_locale.dart';
|
||||||
|
import 'package:lightmeter/data/permissions_service.dart';
|
||||||
|
import 'package:lightmeter/data/shared_prefs_service.dart';
|
||||||
|
import 'package:lightmeter/environment.dart';
|
||||||
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
|
import 'package:lightmeter/providers/equipment_profile_provider.dart';
|
||||||
|
import 'package:lightmeter/providers/ev_source_type_provider.dart';
|
||||||
|
import 'package:lightmeter/providers/metering_screen_layout_provider.dart';
|
||||||
|
import 'package:lightmeter/providers/stop_type_provider.dart';
|
||||||
import 'package:lightmeter/providers/supported_locale_provider.dart';
|
import 'package:lightmeter/providers/supported_locale_provider.dart';
|
||||||
|
import 'package:lightmeter/providers/theme_provider.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/flow_metering.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/flow_settings.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
import 'data/light_sensor_service.dart';
|
|
||||||
import 'data/permissions_service.dart';
|
|
||||||
import 'data/shared_prefs_service.dart';
|
|
||||||
import 'environment.dart';
|
|
||||||
import 'generated/l10n.dart';
|
|
||||||
import 'providers/equipment_profile_provider.dart';
|
|
||||||
import 'providers/ev_source_type_provider.dart';
|
|
||||||
import 'providers/metering_screen_layout_provider.dart';
|
|
||||||
import 'providers/theme_provider.dart';
|
|
||||||
import 'screens/metering/flow_metering.dart';
|
|
||||||
import 'screens/settings/flow_settings.dart';
|
|
||||||
import 'providers/stop_type_provider.dart';
|
|
||||||
|
|
||||||
class Application extends StatelessWidget {
|
class Application extends StatelessWidget {
|
||||||
final Environment env;
|
final Environment env;
|
||||||
|
|
||||||
|
@ -33,7 +32,7 @@ class Application extends StatelessWidget {
|
||||||
return FutureBuilder(
|
return FutureBuilder(
|
||||||
future: Future.wait([
|
future: Future.wait([
|
||||||
SharedPreferences.getInstance(),
|
SharedPreferences.getInstance(),
|
||||||
Platform.isAndroid ? const LightSensorService().hasSensor() : Future.value(false),
|
if (Platform.isAndroid) const LightSensorService().hasSensor() else Future.value(false),
|
||||||
]),
|
]),
|
||||||
builder: (_, snapshot) {
|
builder: (_, snapshot) {
|
||||||
if (snapshot.data != null) {
|
if (snapshot.data != null) {
|
||||||
|
@ -41,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()),
|
||||||
|
|
|
@ -6,7 +6,7 @@ class CaffeineService {
|
||||||
const CaffeineService();
|
const CaffeineService();
|
||||||
|
|
||||||
Future<bool> isKeepScreenOn() async {
|
Future<bool> isKeepScreenOn() async {
|
||||||
return await _methodChannel.invokeMethod<bool>("isKeepScreenOn").then((value) => value!);
|
return _methodChannel.invokeMethod<bool>("isKeepScreenOn").then((value) => value!);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> keepScreenOn(bool keep) async {
|
Future<void> keepScreenOn(bool keep) async {
|
||||||
|
|
|
@ -7,5 +7,5 @@ class ExposurePair {
|
||||||
const ExposurePair(this.aperture, this.shutterSpeed);
|
const ExposurePair(this.aperture, this.shutterSpeed);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() => '${aperture.toString()} - ${shutterSpeed.toString()}';
|
String toString() => '$aperture - $shutterSpeed';
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,4 +29,3 @@ extension SupportedLocaleExtension on SupportedLocale {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
|
||||||
class PermissionsService {
|
class PermissionsService {
|
||||||
Future<PermissionStatus> checkCameraPermission() async => await Permission.camera.status;
|
Future<PermissionStatus> checkCameraPermission() async => Permission.camera.status;
|
||||||
|
|
||||||
Future<PermissionStatus> requestCameraPermission() async => Permission.camera.request();
|
Future<PermissionStatus> requestCameraPermission() async => Permission.camera.request();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,14 @@
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:lightmeter/data/models/ev_source_type.dart';
|
||||||
|
import 'package:lightmeter/data/models/film.dart';
|
||||||
|
import 'package:lightmeter/data/models/metering_screen_layout_config.dart';
|
||||||
import 'package:lightmeter/data/models/supported_locale.dart';
|
import 'package:lightmeter/data/models/supported_locale.dart';
|
||||||
|
import 'package:lightmeter/data/models/theme_type.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
import 'models/ev_source_type.dart';
|
|
||||||
import 'models/film.dart';
|
|
||||||
import 'models/metering_screen_layout_config.dart';
|
|
||||||
import 'models/theme_type.dart';
|
|
||||||
|
|
||||||
class UserPreferencesService {
|
class UserPreferencesService {
|
||||||
static const _isoKey = "iso";
|
static const _isoKey = "iso";
|
||||||
static const _ndFilterKey = "ndFilter";
|
static const _ndFilterKey = "ndFilter";
|
||||||
|
@ -87,7 +86,9 @@ class UserPreferencesService {
|
||||||
MeteringScreenLayoutConfig get meteringScreenLayout {
|
MeteringScreenLayoutConfig get meteringScreenLayout {
|
||||||
final configJson = _sharedPreferences.getString(_meteringScreenLayoutKey);
|
final configJson = _sharedPreferences.getString(_meteringScreenLayoutKey);
|
||||||
if (configJson != null) {
|
if (configJson != null) {
|
||||||
return MeteringScreenLayoutConfigJson.fromJson(json.decode(configJson));
|
return MeteringScreenLayoutConfigJson.fromJson(
|
||||||
|
json.decode(configJson) as Map<String, dynamic>,
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
MeteringScreenLayoutFeature.extremeExposurePairs: true,
|
MeteringScreenLayoutFeature.extremeExposurePairs: true,
|
||||||
|
|
|
@ -2,7 +2,7 @@ import 'package:firebase_core/firebase_core.dart';
|
||||||
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
import 'firebase_options.dart';
|
import 'package:lightmeter/firebase_options.dart';
|
||||||
|
|
||||||
Future<void> initializeFirebase() async {
|
Future<void> initializeFirebase() async {
|
||||||
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
|
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
|
||||||
|
|
|
@ -58,8 +58,6 @@ class MeteringInteractor {
|
||||||
AppSettings.openAppSettings();
|
AppSettings.openAppSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void enableHaptics(bool enable) => _userPreferencesService.haptics = enable;
|
|
||||||
|
|
||||||
Future<bool> hasAmbientLightSensor() async {
|
Future<bool> hasAmbientLightSensor() async {
|
||||||
if (Platform.isAndroid) {
|
if (Platform.isAndroid) {
|
||||||
return _lightSensorService.hasSensor();
|
return _lightSensorService.hasSensor();
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:lightmeter/application.dart';
|
||||||
import 'package:lightmeter/environment.dart';
|
import 'package:lightmeter/environment.dart';
|
||||||
|
|
||||||
import 'application.dart';
|
|
||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
runApp(const Application(Environment.dev()));
|
runApp(const Application(Environment.dev()));
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:lightmeter/application.dart';
|
||||||
import 'package:lightmeter/environment.dart';
|
import 'package:lightmeter/environment.dart';
|
||||||
|
import 'package:lightmeter/firebase.dart';
|
||||||
import 'application.dart';
|
|
||||||
import 'firebase.dart';
|
|
||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
class PlatformConfig {
|
class PlatformConfig {
|
||||||
|
const PlatformConfig._();
|
||||||
|
|
||||||
static double get cameraPreviewAspectRatio {
|
static double get cameraPreviewAspectRatio {
|
||||||
final rational = const String.fromEnvironment('cameraPreviewAspectRatio').split('/');
|
final rational = const String.fromEnvironment('cameraPreviewAspectRatio').split('/');
|
||||||
return int.parse(rational[0]) / int.parse(rational[1]);
|
return int.parse(rational[0]) / int.parse(rational[1]);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,16 +6,15 @@ import 'package:lightmeter/data/models/exposure_pair.dart';
|
||||||
import 'package:lightmeter/data/models/film.dart';
|
import 'package:lightmeter/data/models/film.dart';
|
||||||
import 'package:lightmeter/data/shared_prefs_service.dart';
|
import 'package:lightmeter/data/shared_prefs_service.dart';
|
||||||
import 'package:lightmeter/interactors/metering_interactor.dart';
|
import 'package:lightmeter/interactors/metering_interactor.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
|
||||||
import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart'
|
import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart'
|
||||||
as communication_events;
|
as communication_events;
|
||||||
import 'package:lightmeter/screens/metering/communication/state_communication_metering.dart'
|
import 'package:lightmeter/screens/metering/communication/state_communication_metering.dart'
|
||||||
as communication_states;
|
as communication_states;
|
||||||
|
import 'package:lightmeter/screens/metering/event_metering.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/state_metering.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
import 'communication/bloc_communication_metering.dart';
|
|
||||||
import 'event_metering.dart';
|
|
||||||
import 'state_metering.dart';
|
|
||||||
|
|
||||||
class MeteringBloc extends Bloc<MeteringEvent, MeteringState> {
|
class MeteringBloc extends Bloc<MeteringEvent, MeteringState> {
|
||||||
final MeteringCommunicationBloc _communicationBloc;
|
final MeteringCommunicationBloc _communicationBloc;
|
||||||
final UserPreferencesService _userPreferencesService;
|
final UserPreferencesService _userPreferencesService;
|
||||||
|
@ -145,26 +144,28 @@ 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) {
|
||||||
if (ev.isNaN || ev.isInfinite) {
|
if (ev.isNaN || ev.isInfinite) {
|
||||||
return List.empty(growable: false);
|
return List.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 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
|
||||||
|
@ -200,12 +201,14 @@ 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) {
|
||||||
return List.empty(growable: false);
|
return List.empty();
|
||||||
}
|
}
|
||||||
return List.generate(
|
return List.generate(
|
||||||
itemsCount,
|
itemsCount,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
import 'event_communication_metering.dart';
|
import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart';
|
||||||
import 'state_communication_metering.dart';
|
import 'package:lightmeter/screens/metering/communication/state_communication_metering.dart';
|
||||||
|
|
||||||
class MeteringCommunicationBloc
|
class MeteringCommunicationBloc
|
||||||
extends Bloc<MeteringCommunicationEvent, MeteringCommunicationState> {
|
extends Bloc<MeteringCommunicationEvent, MeteringCommunicationState> {
|
||||||
|
|
|
@ -73,7 +73,6 @@ class _MeteringMeasureButtonState extends State<MeteringMeasureButton> {
|
||||||
/// This key is needed to make indicator start from the same point every time
|
/// This key is needed to make indicator start from the same point every time
|
||||||
key: ValueKey(widget.isMetering),
|
key: ValueKey(widget.isMetering),
|
||||||
color: Theme.of(context).colorScheme.onSurface,
|
color: Theme.of(context).colorScheme.onSurface,
|
||||||
strokeWidth: Dimens.grid4,
|
|
||||||
value: widget.isMetering ? null : 1,
|
value: widget.isMetering ? null : 1,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
|
||||||
import 'widget_bottom_controls.dart';
|
import 'package:lightmeter/screens/metering/components/bottom_controls/widget_bottom_controls.dart';
|
||||||
|
|
||||||
class MeteringBottomControlsProvider extends StatelessWidget {
|
class MeteringBottomControlsProvider extends StatelessWidget {
|
||||||
final double? ev;
|
final double? ev;
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/data/models/ev_source_type.dart';
|
import 'package:lightmeter/data/models/ev_source_type.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/bottom_controls/components/measure_button/widget_button_measure.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'components/measure_button/widget_button_measure.dart';
|
|
||||||
|
|
||||||
class MeteringBottomControls extends StatelessWidget {
|
class MeteringBottomControls extends StatelessWidget {
|
||||||
final double? ev;
|
final double? ev;
|
||||||
final bool isMetering;
|
final bool isMetering;
|
||||||
|
@ -42,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,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
|
@ -2,23 +2,23 @@ import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:camera/camera.dart';
|
import 'package:camera/camera.dart';
|
||||||
import 'package:exif/exif.dart';
|
import 'package:exif/exif.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/interactors/metering_interactor.dart';
|
import 'package:lightmeter/interactors/metering_interactor.dart';
|
||||||
import 'package:lightmeter/screens/metering/components/camera_container/models/camera_error_type.dart';
|
|
||||||
import 'package:lightmeter/screens/metering/components/shared/ev_source_base/bloc_base_ev_source.dart';
|
|
||||||
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
|
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
|
||||||
import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart'
|
import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart'
|
||||||
as communication_event;
|
as communication_event;
|
||||||
import 'package:lightmeter/screens/metering/communication/state_communication_metering.dart'
|
import 'package:lightmeter/screens/metering/communication/state_communication_metering.dart'
|
||||||
as communication_states;
|
as communication_states;
|
||||||
|
import 'package:lightmeter/screens/metering/components/camera_container/event_container_camera.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/camera_container/models/camera_error_type.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/camera_container/state_container_camera.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/shared/ev_source_base/bloc_base_ev_source.dart';
|
||||||
import 'package:lightmeter/utils/log_2.dart';
|
import 'package:lightmeter/utils/log_2.dart';
|
||||||
|
|
||||||
import 'event_container_camera.dart';
|
|
||||||
import 'state_container_camera.dart';
|
|
||||||
|
|
||||||
class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraContainerState> {
|
class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraContainerState> {
|
||||||
final MeteringInteractor _meteringInteractor;
|
final MeteringInteractor _meteringInteractor;
|
||||||
late final _WidgetsBindingObserver _observer;
|
late final _WidgetsBindingObserver _observer;
|
||||||
|
@ -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 {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
|
||||||
import 'components/exposure_offset_slider/widget_slider_exposure_offset.dart';
|
import 'package:lightmeter/screens/metering/components/camera_container/components/camera_controls/components/exposure_offset_slider/widget_slider_exposure_offset.dart';
|
||||||
import 'components/zoom_slider/widget_slider_zoom.dart';
|
import 'package:lightmeter/screens/metering/components/camera_container/components/camera_controls/components/zoom_slider/widget_slider_zoom.dart';
|
||||||
|
|
||||||
class CameraControls extends StatelessWidget {
|
class CameraControls extends StatelessWidget {
|
||||||
final RangeValues exposureOffsetRange;
|
final RangeValues exposureOffsetRange;
|
||||||
|
|
|
@ -5,7 +5,7 @@ import 'package:flutter/services.dart';
|
||||||
class CameraView extends StatelessWidget {
|
class CameraView extends StatelessWidget {
|
||||||
final CameraController controller;
|
final CameraController controller;
|
||||||
|
|
||||||
const CameraView({required this.controller, Key? key}) : super(key: key);
|
const CameraView({required this.controller, super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
|
|
@ -4,11 +4,10 @@ import 'package:lightmeter/data/models/exposure_pair.dart';
|
||||||
import 'package:lightmeter/data/models/film.dart';
|
import 'package:lightmeter/data/models/film.dart';
|
||||||
import 'package:lightmeter/interactors/metering_interactor.dart';
|
import 'package:lightmeter/interactors/metering_interactor.dart';
|
||||||
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
|
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/camera_container/bloc_container_camera.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/camera_container/widget_container_camera.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
import 'bloc_container_camera.dart';
|
|
||||||
import 'widget_container_camera.dart';
|
|
||||||
|
|
||||||
class CameraContainerProvider extends StatelessWidget {
|
class CameraContainerProvider extends StatelessWidget {
|
||||||
final ExposurePair? fastest;
|
final ExposurePair? fastest;
|
||||||
final ExposurePair? slowest;
|
final ExposurePair? slowest;
|
||||||
|
|
|
@ -7,20 +7,19 @@ import 'package:lightmeter/features.dart';
|
||||||
import 'package:lightmeter/platform_config.dart';
|
import 'package:lightmeter/platform_config.dart';
|
||||||
import 'package:lightmeter/providers/metering_screen_layout_provider.dart';
|
import 'package:lightmeter/providers/metering_screen_layout_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/components/camera_controls/widget_camera_controls.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/camera_container/components/camera_controls_placeholder/widget_placeholder_camera_controls.dart';
|
||||||
import 'package:lightmeter/screens/metering/components/camera_container/components/camera_view/widget_camera_view.dart';
|
import 'package:lightmeter/screens/metering/components/camera_container/components/camera_view/widget_camera_view.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/camera_container/components/camera_view_placeholder/widget_placeholder_camera_view.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/camera_container/event_container_camera.dart';
|
||||||
import 'package:lightmeter/screens/metering/components/camera_container/models/camera_error_type.dart';
|
import 'package:lightmeter/screens/metering/components/camera_container/models/camera_error_type.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/camera_container/state_container_camera.dart';
|
||||||
import 'package:lightmeter/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart';
|
import 'package:lightmeter/screens/metering/components/shared/exposure_pairs_list/widget_list_exposure_pairs.dart';
|
||||||
import 'package:lightmeter/screens/metering/components/shared/metering_top_bar/widget_top_bar_metering.dart';
|
import 'package:lightmeter/screens/metering/components/shared/metering_top_bar/widget_top_bar_metering.dart';
|
||||||
import 'package:lightmeter/screens/metering/components/shared/readings_container/widget_container_readings.dart';
|
import 'package:lightmeter/screens/metering/components/shared/readings_container/widget_container_readings.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
import 'bloc_container_camera.dart';
|
|
||||||
import 'components/camera_controls/widget_camera_controls.dart';
|
|
||||||
import 'components/camera_controls_placeholder/widget_placeholder_camera_controls.dart';
|
|
||||||
import 'components/camera_view_placeholder/widget_placeholder_camera_view.dart';
|
|
||||||
import 'event_container_camera.dart';
|
|
||||||
import 'state_container_camera.dart';
|
|
||||||
|
|
||||||
class CameraContainer extends StatelessWidget {
|
class CameraContainer extends StatelessWidget {
|
||||||
final ExposurePair? fastest;
|
final ExposurePair? fastest;
|
||||||
final ExposurePair? slowest;
|
final ExposurePair? slowest;
|
||||||
|
@ -104,7 +103,7 @@ class CameraContainer extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _CameraViewBuilder extends StatelessWidget {
|
class _CameraViewBuilder extends StatelessWidget {
|
||||||
const _CameraViewBuilder({Key? key}) : super(key: key);
|
const _CameraViewBuilder();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -155,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 {
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:lightmeter/interactors/metering_interactor.dart';
|
import 'package:lightmeter/interactors/metering_interactor.dart';
|
||||||
import 'package:lightmeter/screens/metering/components/shared/ev_source_base/bloc_base_ev_source.dart';
|
|
||||||
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
|
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
|
||||||
import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart'
|
import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart'
|
||||||
as communication_event;
|
as communication_event;
|
||||||
import 'package:lightmeter/screens/metering/communication/state_communication_metering.dart'
|
import 'package:lightmeter/screens/metering/communication/state_communication_metering.dart'
|
||||||
as communication_states;
|
as communication_states;
|
||||||
|
import 'package:lightmeter/screens/metering/components/light_sensor_container/event_container_light_sensor.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/light_sensor_container/state_container_light_sensor.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/shared/ev_source_base/bloc_base_ev_source.dart';
|
||||||
import 'package:lightmeter/utils/log_2.dart';
|
import 'package:lightmeter/utils/log_2.dart';
|
||||||
|
|
||||||
import 'event_container_light_sensor.dart';
|
|
||||||
import 'state_container_light_sensor.dart';
|
|
||||||
|
|
||||||
class LightSensorContainerBloc
|
class LightSensorContainerBloc
|
||||||
extends EvSourceBlocBase<LightSensorContainerEvent, LightSensorContainerState> {
|
extends EvSourceBlocBase<LightSensorContainerEvent, LightSensorContainerState> {
|
||||||
final MeteringInteractor _meteringInteractor;
|
final MeteringInteractor _meteringInteractor;
|
||||||
|
|
|
@ -4,11 +4,10 @@ import 'package:lightmeter/data/models/exposure_pair.dart';
|
||||||
import 'package:lightmeter/data/models/film.dart';
|
import 'package:lightmeter/data/models/film.dart';
|
||||||
import 'package:lightmeter/interactors/metering_interactor.dart';
|
import 'package:lightmeter/interactors/metering_interactor.dart';
|
||||||
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
|
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/light_sensor_container/bloc_container_light_sensor.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/light_sensor_container/widget_container_light_sensor.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
import 'bloc_container_light_sensor.dart';
|
|
||||||
import 'widget_container_light_sensor.dart';
|
|
||||||
|
|
||||||
class LightSensorContainerProvider extends StatelessWidget {
|
class LightSensorContainerProvider extends StatelessWidget {
|
||||||
final ExposurePair? fastest;
|
final ExposurePair? fastest;
|
||||||
final ExposurePair? slowest;
|
final ExposurePair? slowest;
|
||||||
|
|
|
@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/data/models/exposure_pair.dart';
|
import 'package:lightmeter/data/models/exposure_pair.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
|
||||||
import 'components/empty_exposure_pairs_list/widget_list_exposure_pairs_empty.dart';
|
import 'package:lightmeter/screens/metering/components/shared/exposure_pairs_list/components/empty_exposure_pairs_list/widget_list_exposure_pairs_empty.dart';
|
||||||
import 'components/exposure_pairs_list_item/widget_item_list_exposure_pairs.dart';
|
import 'package:lightmeter/screens/metering/components/shared/exposure_pairs_list/components/exposure_pairs_list_item/widget_item_list_exposure_pairs.dart';
|
||||||
|
|
||||||
class ExposurePairsList extends StatelessWidget {
|
class ExposurePairsList extends StatelessWidget {
|
||||||
final List<ExposurePair> exposurePairs;
|
final List<ExposurePair> exposurePairs;
|
||||||
|
|
|
@ -59,7 +59,6 @@ class MeteringTopBarShape extends CustomPainter {
|
||||||
path.arcToPoint(
|
path.arcToPoint(
|
||||||
Offset(appendixWidth, size.height + appendixHeight + allowedRadius),
|
Offset(appendixWidth, size.height + appendixHeight + allowedRadius),
|
||||||
radius: circularRadius,
|
radius: circularRadius,
|
||||||
clockwise: true,
|
|
||||||
);
|
);
|
||||||
path.lineTo(appendixWidth, size.height - allowedRadius);
|
path.lineTo(appendixWidth, size.height - allowedRadius);
|
||||||
path.arcToPoint(
|
path.arcToPoint(
|
||||||
|
@ -98,7 +97,6 @@ class MeteringTopBarShape extends CustomPainter {
|
||||||
Offset(allowedRadius, -allowedRadius),
|
Offset(allowedRadius, -allowedRadius),
|
||||||
radius: Radius.circular(allowedRadius),
|
radius: Radius.circular(allowedRadius),
|
||||||
rotation: 90,
|
rotation: 90,
|
||||||
clockwise: true,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Right side with bottom corner
|
// Right side with bottom corner
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/shared/metering_top_bar/shape_top_bar_metering.dart';
|
||||||
import 'package:lightmeter/screens/metering/components/shared/readings_container/widget_container_readings.dart';
|
import 'package:lightmeter/screens/metering/components/shared/readings_container/widget_container_readings.dart';
|
||||||
|
|
||||||
import 'shape_top_bar_metering.dart';
|
|
||||||
|
|
||||||
class MeteringTopBar extends StatelessWidget {
|
class MeteringTopBar extends StatelessWidget {
|
||||||
final ReadingsContainer readingsContainer;
|
final ReadingsContainer readingsContainer;
|
||||||
final double appendixHeight;
|
final double appendixHeight;
|
||||||
|
|
|
@ -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);
|
||||||
|
@ -100,7 +104,7 @@ class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProvide
|
||||||
);
|
);
|
||||||
_sizeAnimation = _sizeTween.animate(_defaultCurvedAnimation);
|
_sizeAnimation = _sizeTween.animate(_defaultCurvedAnimation);
|
||||||
|
|
||||||
final renderBox = _key.currentContext!.findRenderObject() as RenderBox;
|
final renderBox = _key.currentContext!.findRenderObject()! as RenderBox;
|
||||||
_closedOffset = renderBox.localToGlobal(Offset.zero);
|
_closedOffset = renderBox.localToGlobal(Offset.zero);
|
||||||
_offsetAnimation = SizeTween(
|
_offsetAnimation = SizeTween(
|
||||||
begin: Size(
|
begin: Size(
|
||||||
|
@ -125,7 +129,7 @@ class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProvide
|
||||||
|
|
||||||
_elevationAnimation = Tween<double>(
|
_elevationAnimation = Tween<double>(
|
||||||
begin: 0,
|
begin: 0,
|
||||||
end: Theme.of(context).dialogTheme.elevation!,
|
end: Theme.of(context).dialogTheme.elevation,
|
||||||
).animate(_defaultCurvedAnimation);
|
).animate(_defaultCurvedAnimation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ class DialogPicker<T> extends StatefulWidget {
|
||||||
final DialogPickerItemTitleBuilder<T> itemTitleBuilder;
|
final DialogPickerItemTitleBuilder<T> itemTitleBuilder;
|
||||||
final DialogPickerItemTrailingBuilder<T>? itemTrailingBuilder;
|
final DialogPickerItemTrailingBuilder<T>? itemTrailingBuilder;
|
||||||
final VoidCallback onCancel;
|
final VoidCallback onCancel;
|
||||||
final ValueChanged onSelect;
|
final ValueChanged<T> onSelect;
|
||||||
|
|
||||||
const DialogPicker({
|
const DialogPicker({
|
||||||
required this.icon,
|
required this.icon,
|
||||||
|
@ -60,7 +60,7 @@ class _DialogPickerState<T> extends State<DialogPicker<T>> {
|
||||||
padding: Dimens.dialogIconTitlePadding,
|
padding: Dimens.dialogIconTitlePadding,
|
||||||
child: Text(
|
child: Text(
|
||||||
widget.title,
|
widget.title,
|
||||||
style: Theme.of(context).textTheme.headlineSmall!,
|
style: Theme.of(context).textTheme.headlineSmall,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -74,7 +74,7 @@ class _DialogPickerState<T> extends State<DialogPicker<T>> {
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
widget.subtitle!,
|
widget.subtitle!,
|
||||||
style: Theme.of(context).textTheme.bodyMedium!,
|
style: Theme.of(context).textTheme.bodyMedium,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -110,7 +110,6 @@ class _DialogPickerState<T> extends State<DialogPicker<T>> {
|
||||||
padding: Dimens.dialogActionsPadding,
|
padding: Dimens.dialogActionsPadding,
|
||||||
child: Row(
|
child: Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.end,
|
crossAxisAlignment: CrossAxisAlignment.end,
|
||||||
mainAxisSize: MainAxisSize.max,
|
|
||||||
children: [
|
children: [
|
||||||
const Spacer(),
|
const Spacer(),
|
||||||
TextButton(
|
TextButton(
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'components/animated_dialog/widget_dialog_animated.dart';
|
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/animated_dialog_picker/components/animated_dialog/widget_dialog_animated.dart';
|
||||||
import 'components/dialog_picker/widget_picker_dialog.dart';
|
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/animated_dialog_picker/components/dialog_picker/widget_picker_dialog.dart';
|
||||||
|
|
||||||
class AnimatedDialogPicker<T> extends StatelessWidget {
|
class AnimatedDialogPicker<T> extends StatelessWidget {
|
||||||
final _key = GlobalKey<AnimatedDialogState>();
|
final _key = GlobalKey<AnimatedDialogState>();
|
||||||
|
|
|
@ -42,7 +42,6 @@ class ReadingValueContainer extends StatelessWidget {
|
||||||
padding: const EdgeInsets.all(Dimens.paddingM),
|
padding: const EdgeInsets.all(Dimens.paddingM),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: _items,
|
children: _items,
|
||||||
),
|
),
|
||||||
|
|
|
@ -7,11 +7,10 @@ import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/providers/equipment_profile_provider.dart';
|
import 'package:lightmeter/providers/equipment_profile_provider.dart';
|
||||||
import 'package:lightmeter/providers/metering_screen_layout_provider.dart';
|
import 'package:lightmeter/providers/metering_screen_layout_provider.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/animated_dialog_picker/widget_picker_dialog_animated.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/reading_value_container/widget_container_reading_value.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
import 'components/animated_dialog_picker/widget_picker_dialog_animated.dart';
|
|
||||||
import 'components/reading_value_container/widget_container_reading_value.dart';
|
|
||||||
|
|
||||||
/// Contains a column of fastest & slowest exposure pairs + a row of ISO and ND pickers
|
/// Contains a column of fastest & slowest exposure pairs + a row of ISO and ND pickers
|
||||||
class ReadingsContainer extends StatelessWidget {
|
class ReadingsContainer extends StatelessWidget {
|
||||||
final ExposurePair? fastest;
|
final ExposurePair? fastest;
|
||||||
|
|
|
@ -7,13 +7,12 @@ import 'package:lightmeter/data/permissions_service.dart';
|
||||||
import 'package:lightmeter/data/shared_prefs_service.dart';
|
import 'package:lightmeter/data/shared_prefs_service.dart';
|
||||||
import 'package:lightmeter/interactors/metering_interactor.dart';
|
import 'package:lightmeter/interactors/metering_interactor.dart';
|
||||||
import 'package:lightmeter/providers/equipment_profile_provider.dart';
|
import 'package:lightmeter/providers/equipment_profile_provider.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/bloc_metering.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/screen_metering.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'bloc_metering.dart';
|
|
||||||
import 'communication/bloc_communication_metering.dart';
|
|
||||||
import 'screen_metering.dart';
|
|
||||||
|
|
||||||
class MeteringFlow extends StatefulWidget {
|
class MeteringFlow extends StatefulWidget {
|
||||||
const MeteringFlow({super.key});
|
const MeteringFlow({super.key});
|
||||||
|
|
||||||
|
|
|
@ -8,15 +8,14 @@ import 'package:lightmeter/environment.dart';
|
||||||
import 'package:lightmeter/providers/equipment_profile_provider.dart';
|
import 'package:lightmeter/providers/equipment_profile_provider.dart';
|
||||||
import 'package:lightmeter/providers/ev_source_type_provider.dart';
|
import 'package:lightmeter/providers/ev_source_type_provider.dart';
|
||||||
import 'package:lightmeter/providers/metering_screen_layout_provider.dart';
|
import 'package:lightmeter/providers/metering_screen_layout_provider.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/bloc_metering.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/bottom_controls/provider_bottom_controls.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/camera_container/provider_container_camera.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/components/light_sensor_container/provider_container_light_sensor.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/event_metering.dart';
|
||||||
|
import 'package:lightmeter/screens/metering/state_metering.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
import 'components/bottom_controls/provider_bottom_controls.dart';
|
|
||||||
import 'components/camera_container/provider_container_camera.dart';
|
|
||||||
import 'components/light_sensor_container/provider_container_light_sensor.dart';
|
|
||||||
import 'bloc_metering.dart';
|
|
||||||
import 'event_metering.dart';
|
|
||||||
import 'state_metering.dart';
|
|
||||||
|
|
||||||
class MeteringScreen extends StatefulWidget {
|
class MeteringScreen extends StatefulWidget {
|
||||||
const MeteringScreen({super.key});
|
const MeteringScreen({super.key});
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/about/components/report_issue/widget_list_tile_report_issue.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/about/components/source_code/widget_list_tile_source_code.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/about/components/version/widget_list_tile_version.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/about/components/write_email/widget_list_tile_write_email.dart';
|
||||||
import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart';
|
import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart';
|
||||||
|
|
||||||
import 'components/report_issue/widget_list_tile_report_issue.dart';
|
|
||||||
import 'components/source_code/widget_list_tile_source_code.dart';
|
|
||||||
import 'components/version/widget_list_tile_version.dart';
|
|
||||||
import 'components/write_email/widget_list_tile_write_email.dart';
|
|
||||||
|
|
||||||
class AboutSettingsSection extends StatelessWidget {
|
class AboutSettingsSection extends StatelessWidget {
|
||||||
const AboutSettingsSection({super.key});
|
const AboutSettingsSection({super.key});
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/interactors/settings_interactor.dart';
|
import 'package:lightmeter/interactors/settings_interactor.dart';
|
||||||
|
|
||||||
import 'bloc_list_tile_caffeine.dart';
|
import 'package:lightmeter/screens/settings/components/general/components/caffeine/bloc_list_tile_caffeine.dart';
|
||||||
import 'widget_list_tile_caffeine.dart';
|
import 'package:lightmeter/screens/settings/components/general/components/caffeine/widget_list_tile_caffeine.dart';
|
||||||
|
|
||||||
class CaffeineListTileProvider extends StatelessWidget {
|
class CaffeineListTileProvider extends StatelessWidget {
|
||||||
const CaffeineListTileProvider({super.key});
|
const CaffeineListTileProvider({super.key});
|
||||||
|
|
|
@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
|
|
||||||
import 'bloc_list_tile_caffeine.dart';
|
import 'package:lightmeter/screens/settings/components/general/components/caffeine/bloc_list_tile_caffeine.dart';
|
||||||
|
|
||||||
class CaffeineListTile extends StatelessWidget {
|
class CaffeineListTile extends StatelessWidget {
|
||||||
const CaffeineListTile({super.key});
|
const CaffeineListTile({super.key});
|
||||||
|
|
|
@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/interactors/settings_interactor.dart';
|
import 'package:lightmeter/interactors/settings_interactor.dart';
|
||||||
|
|
||||||
import 'bloc_list_tile_haptics.dart';
|
import 'package:lightmeter/screens/settings/components/general/components/haptics/bloc_list_tile_haptics.dart';
|
||||||
import 'widget_list_tile_haptics.dart';
|
import 'package:lightmeter/screens/settings/components/general/components/haptics/widget_list_tile_haptics.dart';
|
||||||
|
|
||||||
class HapticsListTileProvider extends StatelessWidget {
|
class HapticsListTileProvider extends StatelessWidget {
|
||||||
const HapticsListTileProvider({super.key});
|
const HapticsListTileProvider({super.key});
|
||||||
|
|
|
@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
|
|
||||||
import 'bloc_list_tile_haptics.dart';
|
import 'package:lightmeter/screens/settings/components/general/components/haptics/bloc_list_tile_haptics.dart';
|
||||||
|
|
||||||
class HapticsListTile extends StatelessWidget {
|
class HapticsListTile extends StatelessWidget {
|
||||||
const HapticsListTile({super.key});
|
const HapticsListTile({super.key});
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/general/components/caffeine/provider_list_tile_caffeine.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/general/components/haptics/provider_list_tile_haptics.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/general/components/language/widget_list_tile_language.dart';
|
||||||
import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart';
|
import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart';
|
||||||
|
|
||||||
import 'components/caffeine/provider_list_tile_caffeine.dart';
|
|
||||||
import 'components/haptics/provider_list_tile_haptics.dart';
|
|
||||||
import 'components/language/widget_list_tile_language.dart';
|
|
||||||
|
|
||||||
class GeneralSettingsSection extends StatelessWidget {
|
class GeneralSettingsSection extends StatelessWidget {
|
||||||
const GeneralSettingsSection({super.key});
|
const GeneralSettingsSection({super.key});
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/interactors/settings_interactor.dart';
|
import 'package:lightmeter/interactors/settings_interactor.dart';
|
||||||
|
|
||||||
import 'event_dialog_calibration.dart';
|
import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/event_dialog_calibration.dart';
|
||||||
import 'state_dialog_calibration.dart';
|
import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/state_dialog_calibration.dart';
|
||||||
|
|
||||||
class CalibrationDialogBloc extends Bloc<CalibrationDialogEvent, CalibrationDialogState> {
|
class CalibrationDialogBloc extends Bloc<CalibrationDialogEvent, CalibrationDialogState> {
|
||||||
final SettingsInteractor _settingsInteractor;
|
final SettingsInteractor _settingsInteractor;
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/interactors/settings_interactor.dart';
|
import 'package:lightmeter/interactors/settings_interactor.dart';
|
||||||
|
|
||||||
import 'bloc_dialog_calibration.dart';
|
import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/bloc_dialog_calibration.dart';
|
||||||
import 'widget_dialog_calibration.dart';
|
import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/widget_dialog_calibration.dart';
|
||||||
|
|
||||||
class CalibrationDialogProvider extends StatelessWidget {
|
class CalibrationDialogProvider extends StatelessWidget {
|
||||||
const CalibrationDialogProvider({super.key});
|
const CalibrationDialogProvider({super.key});
|
||||||
|
|
|
@ -3,13 +3,12 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/environment.dart';
|
import 'package:lightmeter/environment.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/bloc_dialog_calibration.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/event_dialog_calibration.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/state_dialog_calibration.dart';
|
||||||
import 'package:lightmeter/screens/shared/centered_slider/widget_slider_centered.dart';
|
import 'package:lightmeter/screens/shared/centered_slider/widget_slider_centered.dart';
|
||||||
import 'package:lightmeter/utils/to_string_signed.dart';
|
import 'package:lightmeter/utils/to_string_signed.dart';
|
||||||
|
|
||||||
import 'bloc_dialog_calibration.dart';
|
|
||||||
import 'event_dialog_calibration.dart';
|
|
||||||
import 'state_dialog_calibration.dart';
|
|
||||||
|
|
||||||
class CalibrationDialog extends StatelessWidget {
|
class CalibrationDialog extends StatelessWidget {
|
||||||
const CalibrationDialog({super.key});
|
const CalibrationDialog({super.key});
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/interactors/settings_interactor.dart';
|
import 'package:lightmeter/interactors/settings_interactor.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/calibration/components/calibration_dialog/provider_dialog_calibration.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'components/calibration_dialog/provider_dialog_calibration.dart';
|
|
||||||
|
|
||||||
class CalibrationListTile extends StatelessWidget {
|
class CalibrationListTile extends StatelessWidget {
|
||||||
const CalibrationListTile({super.key});
|
const CalibrationListTile({super.key});
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ class _DialogFilterState<T extends PhotographyValue> extends State<DialogFilter<
|
||||||
controlAffinity: ListTileControlAffinity.leading,
|
controlAffinity: ListTileControlAffinity.leading,
|
||||||
title: Text(
|
title: Text(
|
||||||
widget.titleAdapter(context, widget.values[index]),
|
widget.titleAdapter(context, widget.values[index]),
|
||||||
style: Theme.of(context).textTheme.bodyLarge!,
|
style: Theme.of(context).textTheme.bodyLarge,
|
||||||
),
|
),
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
|
@ -96,7 +96,7 @@ class _DialogFilterState<T extends PhotographyValue> extends State<DialogFilter<
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: _hasAnySelected
|
onPressed: _hasAnySelected
|
||||||
? () {
|
? () {
|
||||||
List<T> selectedValues = [];
|
final List<T> selectedValues = [];
|
||||||
for (int i = 0; i < widget.values.length; i++) {
|
for (int i = 0; i < widget.values.length; i++) {
|
||||||
if (checkboxValues[i]) {
|
if (checkboxValues[i]) {
|
||||||
selectedValues.add(widget.values[i]);
|
selectedValues.add(widget.values[i]);
|
||||||
|
|
|
@ -64,7 +64,6 @@ class _DialogRangePickerState<T extends PhotographyValue> extends State<DialogRa
|
||||||
_start.toDouble(),
|
_start.toDouble(),
|
||||||
_end.toDouble(),
|
_end.toDouble(),
|
||||||
),
|
),
|
||||||
min: 0,
|
|
||||||
max: widget.values.length.toDouble() - 1,
|
max: widget.values.length.toDouble() - 1,
|
||||||
divisions: widget.values.length - 1,
|
divisions: widget.values.length - 1,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_filter/widget_dialog_filter.dart';
|
||||||
import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_range_picker/widget_dialog_picker_range.dart';
|
import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_range_picker/widget_dialog_picker_range.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/components/dialog_filter/widget_dialog_filter.dart';
|
|
||||||
|
|
||||||
class EquipmentListTiles extends StatelessWidget {
|
class EquipmentListTiles extends StatelessWidget {
|
||||||
final List<ApertureValue> selectedApertureValues;
|
final List<ApertureValue> selectedApertureValues;
|
||||||
|
|
|
@ -3,11 +3,10 @@ import 'dart:math';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/scheduler.dart';
|
import 'package:flutter/scheduler.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/equipment_list_tiles/widget_list_tiles_equipments.dart';
|
||||||
import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart';
|
import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
import 'components/equipment_list_tiles/widget_list_tiles_equipments.dart';
|
|
||||||
|
|
||||||
class EquipmentProfileContainer extends StatefulWidget {
|
class EquipmentProfileContainer extends StatefulWidget {
|
||||||
final EquipmentProfileData data;
|
final EquipmentProfileData data;
|
||||||
final ValueChanged<EquipmentProfileData> onUpdate;
|
final ValueChanged<EquipmentProfileData> onUpdate;
|
||||||
|
@ -73,7 +72,6 @@ class EquipmentProfileContainerState extends State<EquipmentProfileContainer>
|
||||||
children: [
|
children: [
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Row(
|
title: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
children: [
|
children: [
|
||||||
_AnimatedNameLeading(controller: _controller),
|
_AnimatedNameLeading(controller: _controller),
|
||||||
const SizedBox(width: Dimens.grid8),
|
const SizedBox(width: Dimens.grid8),
|
||||||
|
|
|
@ -2,12 +2,11 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/providers/equipment_profile_provider.dart';
|
import 'package:lightmeter/providers/equipment_profile_provider.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart';
|
||||||
import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart';
|
import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
import 'components/equipment_profile_container/widget_container_equipment_profile.dart';
|
|
||||||
import 'components/equipment_profile_name_dialog/widget_dialog_equipment_profile_name.dart';
|
|
||||||
|
|
||||||
class EquipmentProfilesScreen extends StatefulWidget {
|
class EquipmentProfilesScreen extends StatefulWidget {
|
||||||
const EquipmentProfilesScreen({super.key});
|
const EquipmentProfilesScreen({super.key});
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
|
|
||||||
import 'components/equipment_profile_screen/screen_equipment_profile.dart';
|
|
||||||
|
|
||||||
class EquipmentProfilesListTile extends StatelessWidget {
|
class EquipmentProfilesListTile extends StatelessWidget {
|
||||||
const EquipmentProfilesListTile({super.key});
|
const EquipmentProfilesListTile({super.key});
|
||||||
|
|
||||||
|
@ -14,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()),
|
||||||
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/screens/settings/components/shared/dialog_picker.dart/widget_dialog_picker.dart';
|
|
||||||
import 'package:lightmeter/providers/stop_type_provider.dart';
|
import 'package:lightmeter/providers/stop_type_provider.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/shared/dialog_picker.dart/widget_dialog_picker.dart';
|
||||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
|
|
||||||
import 'components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart';
|
import 'package:lightmeter/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart';
|
||||||
|
|
||||||
class MeteringScreenLayoutListTile extends StatelessWidget {
|
class MeteringScreenLayoutListTile extends StatelessWidget {
|
||||||
const MeteringScreenLayoutListTile({super.key});
|
const MeteringScreenLayoutListTile({super.key});
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/features.dart';
|
import 'package:lightmeter/features.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/calibration/widget_list_tile_calibration.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/equipment_profiles/widget_list_tile_equipment_profiles.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/fractional_stops/widget_list_tile_fractional_stops.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/components/metering_screen_layout/widget_list_tile_metering_screen_layout.dart';
|
||||||
import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart';
|
import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart';
|
||||||
|
|
||||||
import 'components/calibration/widget_list_tile_calibration.dart';
|
|
||||||
import 'components/metering_screen_layout/widget_list_tile_metering_screen_layout.dart';
|
|
||||||
import 'components/equipment_profiles/widget_list_tile_equipment_profiles.dart';
|
|
||||||
import 'components/fractional_stops/widget_list_tile_fractional_stops.dart';
|
|
||||||
|
|
||||||
class MeteringSettingsSection extends StatelessWidget {
|
class MeteringSettingsSection extends StatelessWidget {
|
||||||
const MeteringSettingsSection({super.key});
|
const MeteringSettingsSection({super.key});
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Row(
|
),
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
const Row(
|
||||||
children: const [
|
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(
|
||||||
|
|
|
@ -5,7 +5,7 @@ import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/providers/theme_provider.dart';
|
import 'package:lightmeter/providers/theme_provider.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
|
||||||
import 'components/primary_color_picker_dialog/widget_dialog_picker_primary_color.dart';
|
import 'package:lightmeter/screens/settings/components/theme/components/primary_color/components/primary_color_picker_dialog/widget_dialog_picker_primary_color.dart';
|
||||||
|
|
||||||
class PrimaryColorListTile extends StatelessWidget {
|
class PrimaryColorListTile extends StatelessWidget {
|
||||||
const PrimaryColorListTile({super.key});
|
const PrimaryColorListTile({super.key});
|
||||||
|
|
|
@ -4,9 +4,9 @@ import 'package:lightmeter/data/models/dynamic_colors_state.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart';
|
import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart';
|
||||||
|
|
||||||
import 'components/dynamic_color/widget_list_tile_dynamic_color.dart';
|
import 'package:lightmeter/screens/settings/components/theme/components/dynamic_color/widget_list_tile_dynamic_color.dart';
|
||||||
import 'components/primary_color/widget_list_tile_primary_color.dart';
|
import 'package:lightmeter/screens/settings/components/theme/components/primary_color/widget_list_tile_primary_color.dart';
|
||||||
import 'components/theme_type/widget_list_tile_theme_type.dart';
|
import 'package:lightmeter/screens/settings/components/theme/components/theme_type/widget_list_tile_theme_type.dart';
|
||||||
|
|
||||||
class ThemeSettingsSection extends StatelessWidget {
|
class ThemeSettingsSection extends StatelessWidget {
|
||||||
const ThemeSettingsSection({super.key});
|
const ThemeSettingsSection({super.key});
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/about/widget_settings_section_about.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/general/widget_settings_section_general.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/metering/widget_settings_section_metering.dart';
|
||||||
|
import 'package:lightmeter/screens/settings/components/theme/widget_settings_section_theme.dart';
|
||||||
import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart';
|
import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart';
|
||||||
|
|
||||||
import 'components/about/widget_settings_section_about.dart';
|
|
||||||
import 'components/general/widget_settings_section_general.dart';
|
|
||||||
import 'components/metering/widget_settings_section_metering.dart';
|
|
||||||
import 'components/theme/widget_settings_section_theme.dart';
|
|
||||||
|
|
||||||
class SettingsScreen extends StatelessWidget {
|
class SettingsScreen extends StatelessWidget {
|
||||||
const SettingsScreen({super.key});
|
const SettingsScreen({super.key});
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ extension SignedString on num {
|
||||||
}
|
}
|
||||||
|
|
||||||
extension SignedStringDouble on double {
|
extension SignedStringDouble on double {
|
||||||
String toStringSignedAsFixed(fractionDigits) {
|
String toStringSignedAsFixed(int fractionDigits) {
|
||||||
if (this > 0) {
|
if (this > 0) {
|
||||||
return "+${toStringAsFixed(fractionDigits)}";
|
return "+${toStringAsFixed(fractionDigits)}";
|
||||||
} else {
|
} else {
|
||||||
|
|
19
pubspec.yaml
19
pubspec.yaml
|
@ -4,14 +4,14 @@ publish_to: "none"
|
||||||
version: 0.10.0+22
|
version: 0.10.0+22
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.18.0 <3.0.0"
|
sdk: ">=3.0.0 <4.0.0"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
app_settings: 4.2.0
|
app_settings: 4.2.0
|
||||||
camera: 0.10.0+4
|
camera: 0.10.0+4
|
||||||
clipboard: 0.1.3
|
clipboard: 0.1.3
|
||||||
exif: 3.1.2
|
|
||||||
dynamic_color: 1.5.4
|
dynamic_color: 1.5.4
|
||||||
|
exif: 3.1.2
|
||||||
firebase_core: 2.11.0
|
firebase_core: 2.11.0
|
||||||
firebase_crashlytics: 3.2.0
|
firebase_crashlytics: 3.2.0
|
||||||
flutter:
|
flutter:
|
||||||
|
@ -19,14 +19,14 @@ dependencies:
|
||||||
flutter_bloc: 8.1.1
|
flutter_bloc: 8.1.1
|
||||||
flutter_localizations:
|
flutter_localizations:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
intl: 0.17.0
|
intl: 0.18.0
|
||||||
intl_utils: 2.8.1
|
intl_utils: 2.8.2
|
||||||
light_sensor: 2.0.2
|
light_sensor: 2.0.2
|
||||||
material_color_utilities: 0.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: main
|
ref: main
|
||||||
|
material_color_utilities: 0.2.0
|
||||||
package_info_plus: 3.0.2
|
package_info_plus: 3.0.2
|
||||||
permission_handler: 10.2.0
|
permission_handler: 10.2.0
|
||||||
provider: 6.0.4
|
provider: 6.0.4
|
||||||
|
@ -36,14 +36,11 @@ dependencies:
|
||||||
vibration: 1.7.6
|
vibration: 1.7.6
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
google_fonts: 3.0.1
|
|
||||||
flutter_launcher_icons: 0.11.0
|
flutter_launcher_icons: 0.11.0
|
||||||
flutter_lints: 2.0.0
|
|
||||||
flutter_native_splash: 2.2.16
|
flutter_native_splash: 2.2.16
|
||||||
test: 1.22.2
|
google_fonts: 3.0.1
|
||||||
|
lint: 2.1.1
|
||||||
dependency_overrides:
|
test: 1.24.1
|
||||||
test_api: 0.4.16
|
|
||||||
|
|
||||||
flutter:
|
flutter:
|
||||||
uses-material-design: true
|
uses-material-design: true
|
||||||
|
|
Loading…
Reference in a new issue