From 8563ff3b15c58959d144f7f0105a78ae579c3860 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Tue, 25 Oct 2022 22:53:39 +0300 Subject: [PATCH] added photography values --- lib/models/aperture_value.dart | 67 ++++++++++++++++++++++ lib/models/iso_value.dart | 48 ++++++++++++++++ lib/models/photography_value.dart | 22 ++++++++ lib/models/shutter_speed_value.dart | 87 +++++++++++++++++++++++++++++ pubspec.yaml | 8 ++- test/photograpy_values_test.dart | 38 +++++++++++++ test/widget_test.dart | 30 ---------- 7 files changed, 268 insertions(+), 32 deletions(-) create mode 100644 lib/models/aperture_value.dart create mode 100644 lib/models/iso_value.dart create mode 100644 lib/models/photography_value.dart create mode 100644 lib/models/shutter_speed_value.dart create mode 100644 test/photograpy_values_test.dart delete mode 100644 test/widget_test.dart diff --git a/lib/models/aperture_value.dart b/lib/models/aperture_value.dart new file mode 100644 index 0000000..3495f02 --- /dev/null +++ b/lib/models/aperture_value.dart @@ -0,0 +1,67 @@ +part of 'photography_value.dart'; + +class ApertureValue extends PhotographyValue { + const ApertureValue(super.rawValue, super.stopType); + + @override + double get value => 1 / rawValue; + + @override + String toString() { + final buffer = StringBuffer("f/"); + if (rawValue - rawValue.floor() == 0 && rawValue >= 8) { + buffer.write(rawValue.toInt().toString()); + } else { + buffer.write(rawValue.toStringAsFixed(1)); + } + return buffer.toString(); + } +} + +const List apertureValues = [ + ApertureValue(1.0, Stop.full), + ApertureValue(1.1, Stop.third), + ApertureValue(1.2, Stop.half), + ApertureValue(1.2, Stop.third), + ApertureValue(1.4, Stop.full), + ApertureValue(1.6, Stop.third), + ApertureValue(1.7, Stop.half), + ApertureValue(1.8, Stop.third), + ApertureValue(2.0, Stop.full), + ApertureValue(2.2, Stop.third), + ApertureValue(2.4, Stop.half), + ApertureValue(2.4, Stop.third), + ApertureValue(2.8, Stop.full), + ApertureValue(3.2, Stop.third), + ApertureValue(3.3, Stop.half), + ApertureValue(3.5, Stop.third), + ApertureValue(4.0, Stop.full), + ApertureValue(4.5, Stop.third), + ApertureValue(4.8, Stop.half), + ApertureValue(5.0, Stop.third), + ApertureValue(5.6, Stop.full), + ApertureValue(6.3, Stop.third), + ApertureValue(6.7, Stop.half), + ApertureValue(7.1, Stop.third), + ApertureValue(8, Stop.full), + ApertureValue(9, Stop.third), + ApertureValue(9.5, Stop.half), + ApertureValue(10, Stop.third), + ApertureValue(11, Stop.full), + ApertureValue(13, Stop.third), + ApertureValue(13, Stop.half), + ApertureValue(14, Stop.third), + ApertureValue(16, Stop.full), + ApertureValue(18, Stop.third), + ApertureValue(19, Stop.half), + ApertureValue(20, Stop.third), + ApertureValue(22, Stop.full), + ApertureValue(25, Stop.third), + ApertureValue(27, Stop.half), + ApertureValue(29, Stop.third), + ApertureValue(32, Stop.full), + ApertureValue(36, Stop.third), + ApertureValue(38, Stop.half), + ApertureValue(42, Stop.third), + ApertureValue(45, Stop.full), +]; diff --git a/lib/models/iso_value.dart b/lib/models/iso_value.dart new file mode 100644 index 0000000..03849cc --- /dev/null +++ b/lib/models/iso_value.dart @@ -0,0 +1,48 @@ +part of 'photography_value.dart'; + +class IsoValue extends PhotographyValue { + const IsoValue(super.rawValue, super.stopType); + + @override + int get value => rawValue; + + @override + String toString() => value.toString(); +} + +const List isoValues = [ + IsoValue(3, Stop.full), + IsoValue(4, Stop.third), + IsoValue(5, Stop.third), + IsoValue(6, Stop.full), + IsoValue(8, Stop.third), + IsoValue(10, Stop.third), + IsoValue(12, Stop.full), + IsoValue(16, Stop.third), + IsoValue(20, Stop.third), + IsoValue(25, Stop.full), + IsoValue(32, Stop.third), + IsoValue(40, Stop.third), + IsoValue(50, Stop.full), + IsoValue(64, Stop.third), + IsoValue(80, Stop.third), + IsoValue(100, Stop.full), + IsoValue(125, Stop.third), + IsoValue(160, Stop.third), + IsoValue(200, Stop.full), + IsoValue(250, Stop.third), + IsoValue(320, Stop.third), + IsoValue(400, Stop.full), + IsoValue(500, Stop.third), + IsoValue(640, Stop.third), + IsoValue(800, Stop.full), + IsoValue(1000, Stop.third), + IsoValue(1250, Stop.third), + IsoValue(1600, Stop.full), + IsoValue(2000, Stop.third), + IsoValue(2500, Stop.third), + IsoValue(3200, Stop.full), + IsoValue(4000, Stop.third), + IsoValue(5000, Stop.third), + IsoValue(6400, Stop.full), +]; diff --git a/lib/models/photography_value.dart b/lib/models/photography_value.dart new file mode 100644 index 0000000..2e319bb --- /dev/null +++ b/lib/models/photography_value.dart @@ -0,0 +1,22 @@ +part 'aperture_value.dart'; +part 'iso_value.dart'; +part 'shutter_speed_value.dart'; + +enum Stop { full, half, third } + +abstract class PhotographyValue { + final T rawValue; + final Stop stopType; + + const PhotographyValue(this.rawValue, this.stopType); + + T get value; +} + +extension PhotographyValues on List> { + List> fullStops() => where((e) => e.stopType == Stop.full).toList(); + + List> halfStops() => where((e) => e.stopType == Stop.full || e.stopType == Stop.half).toList(); + + List> thirdStops() => where((e) => e.stopType == Stop.full || e.stopType == Stop.third).toList(); +} diff --git a/lib/models/shutter_speed_value.dart b/lib/models/shutter_speed_value.dart new file mode 100644 index 0000000..9272c05 --- /dev/null +++ b/lib/models/shutter_speed_value.dart @@ -0,0 +1,87 @@ +part of 'photography_value.dart'; + +class ShutterSpeedValue extends PhotographyValue { + final bool isFraction; + + const ShutterSpeedValue(super.rawValue, this.isFraction, super.stopType); + + @override + double get value => isFraction ? 1 / rawValue : rawValue; + + @override + String toString() { + final buffer = StringBuffer(); + if (isFraction) buffer.write("1/"); + if (rawValue - rawValue.floor() == 0) { + buffer.write(rawValue.toInt().toString()); + } else { + buffer.write(rawValue.toStringAsFixed(1)); + } + if (!isFraction) buffer.write("\""); + return buffer.toString(); + } +} + +const List shutterSpeedValues = [ + ShutterSpeedValue(2000, true, Stop.full), + ShutterSpeedValue(1600, true, Stop.third), + ShutterSpeedValue(1500, true, Stop.half), + ShutterSpeedValue(1250, true, Stop.third), + ShutterSpeedValue(1000, true, Stop.full), + ShutterSpeedValue(800, true, Stop.third), + ShutterSpeedValue(750, true, Stop.half), + ShutterSpeedValue(640, true, Stop.third), + ShutterSpeedValue(500, true, Stop.full), + ShutterSpeedValue(400, true, Stop.third), + ShutterSpeedValue(350, true, Stop.half), + ShutterSpeedValue(320, true, Stop.third), + ShutterSpeedValue(250, true, Stop.full), + ShutterSpeedValue(200, true, Stop.third), + ShutterSpeedValue(180, true, Stop.half), + ShutterSpeedValue(160, true, Stop.third), + ShutterSpeedValue(125, true, Stop.full), + ShutterSpeedValue(100, true, Stop.third), + ShutterSpeedValue(90, true, Stop.half), + ShutterSpeedValue(80, true, Stop.third), + ShutterSpeedValue(60, true, Stop.full), + ShutterSpeedValue(50, true, Stop.third), + ShutterSpeedValue(45, true, Stop.half), + ShutterSpeedValue(40, true, Stop.third), + ShutterSpeedValue(30, true, Stop.full), + ShutterSpeedValue(25, true, Stop.third), + ShutterSpeedValue(20, true, Stop.half), + ShutterSpeedValue(20, true, Stop.third), + ShutterSpeedValue(15, true, Stop.full), + ShutterSpeedValue(13, true, Stop.third), + ShutterSpeedValue(10, true, Stop.half), + ShutterSpeedValue(10, true, Stop.third), + ShutterSpeedValue(8, true, Stop.full), + ShutterSpeedValue(6, true, Stop.third), + ShutterSpeedValue(6, true, Stop.half), + ShutterSpeedValue(5, true, Stop.third), + ShutterSpeedValue(4, true, Stop.full), + ShutterSpeedValue(3, true, Stop.third), + ShutterSpeedValue(3, true, Stop.half), + ShutterSpeedValue(2.5, true, Stop.third), + ShutterSpeedValue(2, true, Stop.full), + ShutterSpeedValue(1.6, true, Stop.third), + ShutterSpeedValue(1.5, true, Stop.half), + ShutterSpeedValue(1.3, true, Stop.third), + ShutterSpeedValue(1, false, Stop.full), + ShutterSpeedValue(1.3, false, Stop.third), + ShutterSpeedValue(1.5, false, Stop.half), + ShutterSpeedValue(1.6, false, Stop.third), + ShutterSpeedValue(2, false, Stop.full), + ShutterSpeedValue(2.5, false, Stop.third), + ShutterSpeedValue(3, false, Stop.half), + ShutterSpeedValue(3, false, Stop.third), + ShutterSpeedValue(4, false, Stop.full), + ShutterSpeedValue(5, false, Stop.third), + ShutterSpeedValue(6, false, Stop.half), + ShutterSpeedValue(6, false, Stop.third), + ShutterSpeedValue(8, false, Stop.full), + ShutterSpeedValue(10, false, Stop.third), + ShutterSpeedValue(12, false, Stop.half), + ShutterSpeedValue(13, false, Stop.third), + ShutterSpeedValue(16, false, Stop.full), +]; diff --git a/pubspec.yaml b/pubspec.yaml index 6859fcd..c1b2ded 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,11 +9,15 @@ environment: dependencies: flutter: sdk: flutter + material_color_utilities: ^0.2.0 dev_dependencies: - flutter_test: - sdk: flutter + google_fonts: ^3.0.1 flutter_lints: ^2.0.0 + test: ^1.21.6 + +dependency_overrides: + material_color_utilities: ^0.2.0 flutter: uses-material-design: true diff --git a/test/photograpy_values_test.dart b/test/photograpy_values_test.dart new file mode 100644 index 0000000..be3f63d --- /dev/null +++ b/test/photograpy_values_test.dart @@ -0,0 +1,38 @@ +import 'package:lightmeter/models/photography_value.dart'; +import 'package:test/test.dart'; + +void main() { + // Stringify + test('Stringify aperture values', () { + expect(apertureValues.first.toString(), "f/1.0"); + expect(apertureValues.last.toString(), "f/45"); + }); + + test('Stringify iso values', () { + expect(isoValues.first.toString(), "3"); + expect(isoValues.last.toString(), "6400"); + }); + + test('Stringify shutter speed values', () { + expect(shutterSpeedValues.first.toString(), "1/2000"); + expect(shutterSpeedValues.last.toString(), "16\""); + }); + + // Stops + test('Aperture values stops lists', () { + expect(apertureValues.fullStops().length, 12); + expect(apertureValues.halfStops().length, 12 + 11); + expect(apertureValues.thirdStops().length, 12 + 22); + }); + + test('Iso values stops lists', () { + expect(isoValues.fullStops().length, 12); + expect(isoValues.thirdStops().length, 12 + 22); + }); + + test('Shutter speed values stops lists', () { + expect(shutterSpeedValues.fullStops().length, 16); + expect(shutterSpeedValues.halfStops().length, 16 + 15); + expect(shutterSpeedValues.thirdStops().length, 16 + 30); + }); +} diff --git a/test/widget_test.dart b/test/widget_test.dart deleted file mode 100644 index d209ac7..0000000 --- a/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:lightmeter/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -}