Compare commits
No commits in common. "main" and "v1.0.2" have entirely different histories.
2
.fvmrc
|
@ -1,3 +1,3 @@
|
||||||
{
|
{
|
||||||
"flutter": "3.24.5"
|
"flutter": "3.27.1"
|
||||||
}
|
}
|
11
.github/workflows/build_apk.yml
vendored
|
@ -30,10 +30,6 @@ on:
|
||||||
type: boolean
|
type: boolean
|
||||||
description: Use stage backend
|
description: Use stage backend
|
||||||
default: true
|
default: true
|
||||||
upload-artifact:
|
|
||||||
type: boolean
|
|
||||||
description: Upload build to artifacts
|
|
||||||
default: true
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
version:
|
version:
|
||||||
|
@ -63,10 +59,6 @@ on:
|
||||||
type: boolean
|
type: boolean
|
||||||
description: Use stage backend
|
description: Use stage backend
|
||||||
default: true
|
default: true
|
||||||
upload-artifact:
|
|
||||||
type: boolean
|
|
||||||
description: Upload build to artifacts
|
|
||||||
default: true
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
BUILD_ARGS: --release --flavor ${{ inputs.flavor }} -t lib/main_${{ inputs.flavor }}.dart
|
BUILD_ARGS: --release --flavor ${{ inputs.flavor }} -t lib/main_${{ inputs.flavor }}.dart
|
||||||
|
@ -132,7 +124,7 @@ jobs:
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
channel: "stable"
|
channel: "stable"
|
||||||
flutter-version: "3.24.5"
|
flutter-version: "3.27.1"
|
||||||
|
|
||||||
- name: Prepare flutter project
|
- name: Prepare flutter project
|
||||||
run: |
|
run: |
|
||||||
|
@ -144,7 +136,6 @@ jobs:
|
||||||
run: flutter build ${{ inputs.binary-type }} $BUILD_ARGS
|
run: flutter build ${{ inputs.binary-type }} $BUILD_ARGS
|
||||||
|
|
||||||
- name: Upload ${{ inputs.binary-type }} to artifacts
|
- name: Upload ${{ inputs.binary-type }} to artifacts
|
||||||
if: ${{ inputs.upload-artifact }}
|
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: m3_lightmeter_${{ inputs.binary-type }}
|
name: m3_lightmeter_${{ inputs.binary-type }}
|
||||||
|
|
11
.github/workflows/build_ipa.yml
vendored
|
@ -22,10 +22,6 @@ on:
|
||||||
type: boolean
|
type: boolean
|
||||||
description: Use stage backend
|
description: Use stage backend
|
||||||
default: true
|
default: true
|
||||||
upload-artifact:
|
|
||||||
type: boolean
|
|
||||||
description: Upload build to artifacts
|
|
||||||
default: true
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
version:
|
version:
|
||||||
|
@ -40,10 +36,6 @@ on:
|
||||||
type: boolean
|
type: boolean
|
||||||
description: Use stage backend
|
description: Use stage backend
|
||||||
default: true
|
default: true
|
||||||
upload-artifact:
|
|
||||||
type: boolean
|
|
||||||
description: Upload build to artifacts
|
|
||||||
default: true
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
FLAVOR: "prod"
|
FLAVOR: "prod"
|
||||||
|
@ -125,7 +117,7 @@ jobs:
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
channel: "stable"
|
channel: "stable"
|
||||||
flutter-version: "3.24.5"
|
flutter-version: "3.27.1"
|
||||||
|
|
||||||
- name: Prepare flutter project
|
- name: Prepare flutter project
|
||||||
run: |
|
run: |
|
||||||
|
@ -143,7 +135,6 @@ jobs:
|
||||||
--export-options-plist=ios/Runner/ExportOptions.plist
|
--export-options-plist=ios/Runner/ExportOptions.plist
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
if: ${{ inputs.upload-artifact }}
|
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: m3_lightmeter_ipa
|
name: m3_lightmeter_ipa
|
||||||
|
|
2
.github/workflows/create_release.yml
vendored
|
@ -86,7 +86,6 @@ jobs:
|
||||||
with:
|
with:
|
||||||
binary-type: ${{ matrix.binary-type }}
|
binary-type: ${{ matrix.binary-type }}
|
||||||
flavor: prod
|
flavor: prod
|
||||||
upload-artifact: true
|
|
||||||
stage-backend: false
|
stage-backend: false
|
||||||
version: ${{ inputs.version }}
|
version: ${{ inputs.version }}
|
||||||
|
|
||||||
|
@ -97,7 +96,6 @@ jobs:
|
||||||
uses: ./.github/workflows/build_ipa.yml
|
uses: ./.github/workflows/build_ipa.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
upload-artifact: true
|
|
||||||
stage-backend: false
|
stage-backend: false
|
||||||
version: ${{ inputs.version }}
|
version: ${{ inputs.version }}
|
||||||
|
|
||||||
|
|
29
.github/workflows/pr_check.yml
vendored
|
@ -16,9 +16,6 @@ jobs:
|
||||||
name: Analyze & test
|
name: Analyze & test
|
||||||
runs-on: macos-14
|
runs-on: macos-14
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
env:
|
|
||||||
EMPTY_CONSTANTS: Y29uc3QgU3RyaW5nIGlhcFNlcnZlclVybCA9ICcnOwpjb25zdCBTdHJpbmcgaXNzdWVzUmVwb3J0VXJsID0gJyc7CmNvbnN0IFN0cmluZyBzb3VyY2VDb2RlVXJsID0gJyc7CmNvbnN0IFN0cmluZyBjb250YWN0RW1haWwgPSAnJzsK
|
|
||||||
EMPTY_FIREBASE_OPTIONS: Ly8gaWdub3JlX2Zvcl9maWxlOiB0eXBlPWxpbnQKaW1wb3J0ICdwYWNrYWdlOmZpcmViYXNlX2NvcmUvZmlyZWJhc2VfY29yZS5kYXJ0JyBzaG93IEZpcmViYXNlT3B0aW9uczsKY2xhc3MgRGVmYXVsdEZpcmViYXNlT3B0aW9ucyB7c3RhdGljIEZpcmViYXNlT3B0aW9ucyBnZXQgY3VycmVudFBsYXRmb3JtID0+RmlyZWJhc2VPcHRpb25zKGFwaUtleTogJycsIGFwcElkOiAnJywgbWVzc2FnaW5nU2VuZGVySWQ6ICcnLCBwcm9qZWN0SWQ6ICcnKTt9Cg==
|
|
||||||
steps:
|
steps:
|
||||||
- uses: 8BitJonny/gh-get-current-pr@2.2.0
|
- uses: 8BitJonny/gh-get-current-pr@2.2.0
|
||||||
id: PR
|
id: PR
|
||||||
|
@ -40,17 +37,14 @@ jobs:
|
||||||
run: bash ./.github/scripts/stub_iap.sh
|
run: bash ./.github/scripts/stub_iap.sh
|
||||||
|
|
||||||
- name: Restore secrets
|
- name: Restore secrets
|
||||||
env:
|
|
||||||
CONSTANTS: ${{ steps.fetch-iap.conclusion == 'success' && secrets.CONSTANTS || env.EMPTY_CONSTANTS }}
|
|
||||||
FIREBASE_OPTIONS: ${{ steps.fetch-iap.conclusion == 'success' && secrets.FIREBASE_OPTIONS || env.EMPTY_FIREBASE_OPTIONS }}
|
|
||||||
run: |
|
run: |
|
||||||
bash .github/scripts/restore_from_base64.sh "${{ env.CONSTANTS }}" "lib/constants.dart"
|
bash .github/scripts/restore_from_base64.sh "${{ secrets.CONSTANTS }}" "lib/constants.dart"
|
||||||
bash .github/scripts/restore_from_base64.sh "${{ env.FIREBASE_OPTIONS }}" "lib/firebase_options.dart"
|
bash .github/scripts/restore_from_base64.sh "${{ secrets.FIREBASE_OPTIONS }}" "lib/firebase_options.dart"
|
||||||
|
|
||||||
- uses: subosito/flutter-action@v2
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
channel: "stable"
|
channel: "stable"
|
||||||
flutter-version: "3.24.5"
|
flutter-version: "3.27.1"
|
||||||
|
|
||||||
- name: Prepare flutter project
|
- name: Prepare flutter project
|
||||||
run: |
|
run: |
|
||||||
|
@ -104,7 +98,6 @@ jobs:
|
||||||
with:
|
with:
|
||||||
binary-type: apk
|
binary-type: apk
|
||||||
flavor: prod
|
flavor: prod
|
||||||
upload-artifact: false
|
|
||||||
stage-backend: false
|
stage-backend: false
|
||||||
version: "1.0.0"
|
version: "1.0.0"
|
||||||
|
|
||||||
|
@ -115,6 +108,20 @@ jobs:
|
||||||
uses: ./.github/workflows/build_ipa.yml
|
uses: ./.github/workflows/build_ipa.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
upload-artifact: false
|
|
||||||
stage-backend: false
|
stage-backend: false
|
||||||
version: "1.0.0"
|
version: "1.0.0"
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
name: Cleanup
|
||||||
|
if: ${{ always() }}
|
||||||
|
needs: [build-android, build-ios]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Delete release artifacts
|
||||||
|
uses: geekyeggo/delete-artifact@v2
|
||||||
|
with:
|
||||||
|
failOnError: false
|
||||||
|
name: |
|
||||||
|
m3_lightmeter_apk
|
||||||
|
m3_lightmeter_appbundle
|
||||||
|
m3_lightmeter_ipa
|
||||||
|
|
2
.github/workflows/run_integration_tests.yml
vendored
|
@ -33,7 +33,7 @@ jobs:
|
||||||
- uses: subosito/flutter-action@v2
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
channel: "stable"
|
channel: "stable"
|
||||||
flutter-version: "3.24.5"
|
flutter-version: "3.27.1"
|
||||||
|
|
||||||
- name: Prepare app
|
- name: Prepare app
|
||||||
run: |
|
run: |
|
||||||
|
|
53
README.md
|
@ -23,32 +23,55 @@ Without further delay behold my new Lightmeter app inspired by Material You (a.k
|
||||||
# Screenshots
|
# Screenshots
|
||||||
|
|
||||||
<p float="center">
|
<p float="center">
|
||||||
<img src="screenshots/generated/ios/iphone65inch/light_metering-reflected.png" width="18.8%" />
|
<img src="screenshots/generated/android/android/light_metering-reflected.png" width="18.8%" />
|
||||||
<img src="screenshots/generated/ios/iphone65inch/light_equipment-profiles.png" width="18.8%" />
|
<img src="screenshots/generated/android/android/light_timer.png" width="18.8%" />
|
||||||
<img src="screenshots/generated/ios/iphone65inch/light_settings.png" width="18.8%" />
|
<img src="screenshots/generated/android/android/light_settings.png" width="18.8%" />
|
||||||
<img src="screenshots/generated/ios/iphone65inch/light_timer.png" width="18.8%" />
|
<img src="screenshots/generated/android/android/light_equipment-profiles.png" width="18.8%" />
|
||||||
<img src="screenshots/generated/ios/iphone65inch/dark_metering-reflected.png" width="18.8%" />
|
<img src="screenshots/generated/android/android/dark_metering-reflected.png" width="18.8%" />
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
# Development
|
# Development
|
||||||
|
|
||||||
### 1. Install Flutter
|
### 1. Install Flutter
|
||||||
|
|
||||||
To build this app you need to install Flutter 3.24.5 stable. [How to install](https://docs.flutter.dev/get-started/install).
|
To build this app you need to install Flutter 3.27.1 stable. [How to install](https://docs.flutter.dev/get-started/install).
|
||||||
|
|
||||||
### 2. Project setup
|
### 2. Project setup
|
||||||
|
|
||||||
#### Restore git-ignored files:
|
#### Restore _constants.dart_ file
|
||||||
|
|
||||||
For macOS you can just run the following script:
|
Create a file _lib/constants.dart_ and paste the following content:
|
||||||
|
|
||||||
```console
|
```dart
|
||||||
sh scripts/setup_fork.sh
|
const String contactEmail = '';
|
||||||
|
const String iapServerUrl = '';
|
||||||
|
const String issuesReportUrl = '';
|
||||||
|
const String sourceCodeUrl = '';
|
||||||
```
|
```
|
||||||
|
|
||||||
Or create the files manually using the contents from the script.
|
#### Stub IAP package
|
||||||
|
|
||||||
#### Get dependencies
|
As part of the app's functionallity is in the private repo, you have to replace these lines in _pubspec.yaml_:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
m3_lightmeter_iap:
|
||||||
|
git:
|
||||||
|
url: "https://github.com/vodemn/m3_lightmeter_iap"
|
||||||
|
ref: main
|
||||||
|
```
|
||||||
|
|
||||||
|
with these:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
m3_lightmeter_iap:
|
||||||
|
path: iap
|
||||||
|
```
|
||||||
|
|
||||||
|
You can do it simply by running the script:
|
||||||
|
|
||||||
|
```console
|
||||||
|
sh .github/scripts/stub_iap.sh
|
||||||
|
```
|
||||||
|
|
||||||
> If you are using VSCode, you can open the workspace like so: _File -> Open Workspace from File -> m3_lightmeter.code-workspace_. Otherwise you have to run `flutter pub get` command from the iap folder.
|
> If you are using VSCode, you can open the workspace like so: _File -> Open Workspace from File -> m3_lightmeter.code-workspace_. Otherwise you have to run `flutter pub get` command from the iap folder.
|
||||||
|
|
||||||
|
@ -59,7 +82,11 @@ flutter pub get
|
||||||
flutter pub run intl_utils:generate
|
flutter pub run intl_utils:generate
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Build
|
### 3. (Optional) Install Firebase
|
||||||
|
|
||||||
|
Out of the box Firebase Crashlytics won't work. If you want to add Crashlytics to your local build please follow [this guide](https://firebase.google.com/docs/flutter/setup).
|
||||||
|
|
||||||
|
### 4. Build
|
||||||
|
|
||||||
- Checkout [Build .apk](.github/workflows/build_apk.yml) workflow for Android
|
- Checkout [Build .apk](.github/workflows/build_apk.yml) workflow for Android
|
||||||
- Checkout [Build .ipa](.github/workflows/build_ipa.yml) workflow for iOS
|
- Checkout [Build .ipa](.github/workflows/build_ipa.yml) workflow for iOS
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
- Fixed camera preview rotation.
|
|
||||||
- Improved translations.
|
|
|
@ -1,3 +0,0 @@
|
||||||
- Fixed histogram being affected by spot metering.
|
|
||||||
- Improved text fields focus handling.
|
|
||||||
- Added German translation.
|
|
|
@ -109,17 +109,17 @@ void testE2E(String description) {
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Add ND to shoot another scene
|
/// Add ND to shoot another scene
|
||||||
// await tester.openPickerAndSelect<NdValuePicker, NdValue>('2');
|
await tester.openPickerAndSelect<NdValuePicker, NdValue>('2');
|
||||||
// await _expectMeteringStateAndMeasure(
|
await _expectMeteringStateAndMeasure(
|
||||||
// tester,
|
tester,
|
||||||
// equipmentProfile: mockEquipmentProfiles[0],
|
equipmentProfile: mockEquipmentProfiles[0],
|
||||||
// film: mockFilms[0],
|
film: mockFilms[0],
|
||||||
// fastest: 'f/1.8 - 1/200',
|
fastest: 'f/1.8 - 1/200',
|
||||||
// slowest: 'f/16 - 1/2.5',
|
slowest: 'f/16 - 1/2.5',
|
||||||
// iso: '400',
|
iso: '400',
|
||||||
// nd: '2',
|
nd: '2',
|
||||||
// ev: mockPhotoEv100 + 2 - 1,
|
ev: mockPhotoEv100 + 2 - 1,
|
||||||
// );
|
);
|
||||||
|
|
||||||
/// Select another lens without ND
|
/// Select another lens without ND
|
||||||
await tester.openPickerAndSelect<EquipmentProfilePicker, EquipmentProfile>(mockEquipmentProfiles[1].name);
|
await tester.openPickerAndSelect<EquipmentProfilePicker, EquipmentProfile>(mockEquipmentProfiles[1].name);
|
||||||
|
|
|
@ -53,7 +53,6 @@ class _MockIAPProvidersState extends State<MockIAPProviders> {
|
||||||
() => mockEquipmentProfilesStorageService.updateProfile(
|
() => mockEquipmentProfilesStorageService.updateProfile(
|
||||||
id: any<String>(named: 'id'),
|
id: any<String>(named: 'id'),
|
||||||
name: any<String>(named: 'name'),
|
name: any<String>(named: 'name'),
|
||||||
isUsed: any<bool>(named: 'isUsed'),
|
|
||||||
),
|
),
|
||||||
).thenAnswer((_) async {});
|
).thenAnswer((_) async {});
|
||||||
when(() => mockEquipmentProfilesStorageService.deleteProfile(any<String>())).thenAnswer((_) async {});
|
when(() => mockEquipmentProfilesStorageService.deleteProfile(any<String>())).thenAnswer((_) async {});
|
||||||
|
|
|
@ -156,7 +156,7 @@
|
||||||
45F53C083F2EA48EF231DA16 /* [CP] Embed Pods Frameworks */,
|
45F53C083F2EA48EF231DA16 /* [CP] Embed Pods Frameworks */,
|
||||||
FF00F85CE432774850A0EDB7 /* [firebase_crashlytics] Crashlytics Upload Symbols */,
|
FF00F85CE432774850A0EDB7 /* [firebase_crashlytics] Crashlytics Upload Symbols */,
|
||||||
08127035D2CDEEEBA66FCDBB /* [CP] Copy Pods Resources */,
|
08127035D2CDEEEBA66FCDBB /* [CP] Copy Pods Resources */,
|
||||||
051083B0AECD5071E5FA2A6F /* FlutterFire: "flutterfire upload-crashlytics-symbols" */,
|
6F6C086A620B15784F8BE312 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
|
@ -216,24 +216,6 @@
|
||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
051083B0AECD5071E5FA2A6F /* FlutterFire: "flutterfire upload-crashlytics-symbols" */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
);
|
|
||||||
name = "FlutterFire: \"flutterfire upload-crashlytics-symbols\"";
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "\n#!/bin/bash\nPATH=\"${PATH}:$FLUTTER_ROOT/bin:$HOME/.pub-cache/bin\"\nflutterfire upload-crashlytics-symbols --upload-symbols-script-path=\"$PODS_ROOT/FirebaseCrashlytics/upload-symbols\" --platform=ios --apple-project-path=\"${SRCROOT}\" --env-platform-name=\"${PLATFORM_NAME}\" --env-configuration=\"${CONFIGURATION}\" --env-project-dir=\"${PROJECT_DIR}\" --env-built-products-dir=\"${BUILT_PRODUCTS_DIR}\" --env-dwarf-dsym-folder-path=\"${DWARF_DSYM_FOLDER_PATH}\" --env-dwarf-dsym-file-name=\"${DWARF_DSYM_FILE_NAME}\" --env-infoplist-path=\"${INFOPLIST_PATH}\" --default-config=default\n";
|
|
||||||
};
|
|
||||||
08127035D2CDEEEBA66FCDBB /* [CP] Copy Pods Resources */ = {
|
08127035D2CDEEEBA66FCDBB /* [CP] Copy Pods Resources */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
|
@ -306,6 +288,24 @@
|
||||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
|
6F6C086A620B15784F8BE312 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "FlutterFire: \"flutterfire upload-crashlytics-symbols\"";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\n#!/bin/bash\nPATH=\"${PATH}:$FLUTTER_ROOT/bin:$HOME/.pub-cache/bin\"\nflutterfire upload-crashlytics-symbols --upload-symbols-script-path=\"$PODS_ROOT/FirebaseCrashlytics/upload-symbols\" --platform=ios --apple-project-path=\"${SRCROOT}\" --env-platform-name=\"${PLATFORM_NAME}\" --env-configuration=\"${CONFIGURATION}\" --env-project-dir=\"${PROJECT_DIR}\" --env-built-products-dir=\"${BUILT_PRODUCTS_DIR}\" --env-dwarf-dsym-folder-path=\"${DWARF_DSYM_FOLDER_PATH}\" --env-dwarf-dsym-file-name=\"${DWARF_DSYM_FILE_NAME}\" --env-infoplist-path=\"${INFOPLIST_PATH}\" --default-config=default\n";
|
||||||
|
};
|
||||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
alwaysOutOfDate = 1;
|
alwaysOutOfDate = 1;
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
enum SupportedLocale { de, en, fr, ru, zh }
|
enum SupportedLocale { en, fr, ru, zh }
|
||||||
|
|
||||||
extension SupportedLocaleExtension on SupportedLocale {
|
extension SupportedLocaleExtension on SupportedLocale {
|
||||||
String get intlName => toString().replaceAll("SupportedLocale.", "");
|
String get intlName => toString().replaceAll("SupportedLocale.", "");
|
||||||
|
|
||||||
String get localizedName {
|
String get localizedName {
|
||||||
switch (this) {
|
switch (this) {
|
||||||
case SupportedLocale.de:
|
|
||||||
return 'Deutsch';
|
|
||||||
case SupportedLocale.en:
|
case SupportedLocale.en:
|
||||||
return 'English';
|
return 'English';
|
||||||
case SupportedLocale.fr:
|
case SupportedLocale.fr:
|
||||||
|
|
|
@ -1,165 +0,0 @@
|
||||||
{
|
|
||||||
"@@locale": "de",
|
|
||||||
"fastestExposurePair": "Schnellstes",
|
|
||||||
"slowestExposurePair": "Langsamstes",
|
|
||||||
"ev": "EV",
|
|
||||||
"evValue": "{value} EV",
|
|
||||||
"@evValue": {
|
|
||||||
"placeholders": {
|
|
||||||
"value": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"iso": "ISO",
|
|
||||||
"filmSpeed": "Film Empfindlichkeit",
|
|
||||||
"nd": "ND",
|
|
||||||
"ndFilterFactor": "Neutraldichtefilter-Faktor",
|
|
||||||
"noExposurePairs": "Es gibt keine Belichtungspaare für die ausgewählten Einstellungen.",
|
|
||||||
"noCamerasDetected": "Scheinbar sind keine Kameras an das Gerät angeschlossen.",
|
|
||||||
"noCameraPermission": "Kamera-Erlaubnis nicht erteilt.",
|
|
||||||
"otherCameraError": "Beim Verbinden der Kamera ist ein Fehler aufgetreten.",
|
|
||||||
"none": "Keiner",
|
|
||||||
"cancel": "Abbrechen",
|
|
||||||
"select": "Auswählen",
|
|
||||||
"save": "Speichern",
|
|
||||||
"settings": "Einstellungen",
|
|
||||||
"metering": "Messung",
|
|
||||||
"fractionalStops": "Zwischenstufen",
|
|
||||||
"showFractionalStops": "Zwischenstufen anzeigen",
|
|
||||||
"halfStops": "1/2",
|
|
||||||
"thirdStops": "1/3",
|
|
||||||
"calibration": "Kalibration",
|
|
||||||
"calibrationMessage": "Die Genauigkeit der Messungen sind vollständig von der Hardware des Geräts abhängig. Deshalb ist es empfehlenswert diese App zu testen und EV-Kalibrationswerte einzustellen, die korrekte Messungen produzieren.",
|
|
||||||
"calibrationMessageCameraOnly": "Die Genauigkeit der Messungen sind vollständig von der Kamera des Geräts abhängig. Deshalb ist es empfehlenswert diese App zu testen und EV-Kalibrationswerte einzustellen, die korrekte Messungen produzieren.",
|
|
||||||
"camera": "Kamera",
|
|
||||||
"lightSensor": "Lichtsensor",
|
|
||||||
"showEv100": "EV\u2081\u2080\u2080 anzeigen",
|
|
||||||
"meteringScreenLayout": "Messansicht Layout",
|
|
||||||
"meteringScreenLayoutHint": "Verstecke Elemente von der Messansicht, damit sie nicht den Platz für Belichtungspaare verschwenden.",
|
|
||||||
"meteringScreenLayoutHintEquipmentProfiles": "Ausrüstungsprofil Auswahl",
|
|
||||||
"meteringScreenFeatureExtremeExposurePairs": "Schnellste & langsamste Belichtungspaare",
|
|
||||||
"meteringScreenFeatureFilmPicker": "Film Auswahl",
|
|
||||||
"cameraFeatures": "Kamerafunktionen",
|
|
||||||
"cameraFeatureSpotMetering": "Punkt-Messung",
|
|
||||||
"cameraFeatureSpotMeteringHint": "Halte die Kameraansicht gedrückt um den Messpunkt zu entfernen",
|
|
||||||
"cameraFeatureHistogram": "Histogramm",
|
|
||||||
"cameraFeatureHistogramHint": "Verwendung des Histogramms kann den Batterieverbrauch erhöhen",
|
|
||||||
"film": "Film",
|
|
||||||
"filmPush": "Film (push)",
|
|
||||||
"filmPull": "Film (pull)",
|
|
||||||
"filmReciprocityHint": "Korrigiert Belichtungszeiten länger als 1 Sekunde",
|
|
||||||
"equipmentProfileName": "Ausrüstungsprofilname",
|
|
||||||
"equipmentProfileNameHint": "Praktica MTL5B",
|
|
||||||
"equipmentProfileAllValues": "Alle",
|
|
||||||
"apertureValues": "Blend-Werte",
|
|
||||||
"apertureValuesFilterDescription": "Wähle die anzuzeigenden Blend-Werte aus. Die Werte sind normalerweise von dem verwendeten Objektiv bestimmt.",
|
|
||||||
"ndFilters": "ND Filter",
|
|
||||||
"ndFiltersFilterDescription": "Wähle die anzuzeigenden ND Filter aus. (Beispielsweise die Meistverwendeten)",
|
|
||||||
"shutterSpeedValues": "Belichtungszeiten",
|
|
||||||
"shutterSpeedValuesFilterDescription": "Wähle die anzuzeigenden Belichtungszeiten aus. Die Werte sind normalerweise von der Kamera bestimmt.",
|
|
||||||
"shutterSpeedManualShort": "B",
|
|
||||||
"shutterSpeedManual": "Manuell",
|
|
||||||
"isoValues": "ISO Werte",
|
|
||||||
"isoValuesFilterDescription": "Wähle die anzuzeigenden ISO Werte aus. (Beispielsweise die Meistverwendeten)",
|
|
||||||
"lensZoom": "Objektiv-Zoom",
|
|
||||||
"lensZoomDescription": "Wähle den Zoom, relativ zur Handykamera, dass mit dem Sucher der Kamera übereinstimmt.",
|
|
||||||
"equipmentProfile": "Ausrüstungsprofil",
|
|
||||||
"equipmentProfiles": "Ausrüstungsprofile",
|
|
||||||
"tapToAdd": "Tippe zum Hinzufügen",
|
|
||||||
"general": "Allgemein",
|
|
||||||
"keepScreenOn": "Bildschirm anbehalten",
|
|
||||||
"haptics": "Haptik",
|
|
||||||
"autostartTimer": "Timer auto-starten",
|
|
||||||
"volumeKeysAction": "Auslösen durch Lautstärketasten",
|
|
||||||
"language": "Sprache",
|
|
||||||
"chooseLanguage": "Sprache auswählen",
|
|
||||||
"theme": "Theme",
|
|
||||||
"chooseTheme": "Theme auswählen",
|
|
||||||
"themeLight": "Hell",
|
|
||||||
"themeDark": "Dunkel",
|
|
||||||
"themeSystemDefault": "Systemeinstellung",
|
|
||||||
"dynamicColor": "Dynamische Farbe",
|
|
||||||
"primaryColor": "Akzentfarbe",
|
|
||||||
"choosePrimaryColor": "Akzentfarbe auswählen",
|
|
||||||
"about": "Info",
|
|
||||||
"restorePurchases": "Käufe wiederherstellen",
|
|
||||||
"sourceCode": "Source code",
|
|
||||||
"reportIssue": "Problem melden",
|
|
||||||
"writeEmail": "Email schreiben",
|
|
||||||
"youDontHaveMailApp": "Es ist keine Email App installiert.",
|
|
||||||
"copyEmail": "Email kopieren",
|
|
||||||
"version": "Version",
|
|
||||||
"versionNumber": "{version} ({buildNumber})",
|
|
||||||
"@versionNumber": {
|
|
||||||
"placeholders": {
|
|
||||||
"version": {
|
|
||||||
"type": "String"
|
|
||||||
},
|
|
||||||
"buildNumber": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"proFeaturesTitle": "Lightmeter Pro",
|
|
||||||
"getPro": "Pro kaufen",
|
|
||||||
"featuresFree": "Gratis",
|
|
||||||
"featuresPro": "Pro",
|
|
||||||
"proFeaturesPromoText": "Lightmeter Pro liefert alles, was Sie brauchen, um die besten Aufnahmen zu machen!",
|
|
||||||
"proFeaturesWhatsIncluded": "Was ist enthalten?",
|
|
||||||
"featureReflectedLightMetering": "Messung von reflektiertem Licht",
|
|
||||||
"featureIncidentLightMetering": "Messung von einfallendem Licht",
|
|
||||||
"featureIsoAndNdValues": "Große Auswahl von ISO und ND Filtern",
|
|
||||||
"featureTheme": "Theme Anpassung",
|
|
||||||
"featureSpotMetering": "Punktmessung",
|
|
||||||
"featureHistogram": "Histogramm",
|
|
||||||
"featureListOfFilms": "Liste von 20+ Filmen mit Reziprozitätsformeln",
|
|
||||||
"featureCustomFilms": "Eigene Filme erstellen",
|
|
||||||
"featureEquipmentProfiles": "Ausrüstungsprofile",
|
|
||||||
"featureTimer": "Eingebauter Timer für Langzeitbelichtungen",
|
|
||||||
"featureMeteringScreenLayout": "Anpassbare Messansicht",
|
|
||||||
"proFeaturesSupportText": "Durch den Kauf von Lightmeter Pro unterstützen Sie den Entwickler und ermöglichen das Hinzufügen weiterer Funktionen.",
|
|
||||||
"getNowFor": "Jetzt für {price} kaufen",
|
|
||||||
"@getNowFor": {
|
|
||||||
"price": {
|
|
||||||
"version": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tooltipAdd": "Hinzufügen",
|
|
||||||
"tooltipClose": "Schließen",
|
|
||||||
"tooltipExpand": "Erweitern",
|
|
||||||
"tooltipCollapse": "Schrumpfen",
|
|
||||||
"tooltipCopy": "Kopieren",
|
|
||||||
"tooltipDelete": "Löschen",
|
|
||||||
"tooltipSelectAll": "Alle auswählen",
|
|
||||||
"tooltipDesecelectAll": "Keine auswählen",
|
|
||||||
"tooltipResetToZero": "Auf null zurücksetzen",
|
|
||||||
"tooltipUseLightSensor": "Lichtsensor verwenden",
|
|
||||||
"tooltipUseCamera": "Kamera verwenden",
|
|
||||||
"tooltipOpenSettings": "Einstellungen öffnen",
|
|
||||||
"exposurePair": "Belichtungspaar",
|
|
||||||
"whatsnew": "Was ist neu?",
|
|
||||||
"changesInVersion": "Änderungen in Version {version}:",
|
|
||||||
"@changesInVersion": {
|
|
||||||
"placeholders": {
|
|
||||||
"version": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"close": "Schließen",
|
|
||||||
"films": "Filme",
|
|
||||||
"filmsInUse": "Verwendete Filme",
|
|
||||||
"filmsCustom": "Eigene Filme",
|
|
||||||
"addFilmTitle": "Film hinzufügen",
|
|
||||||
"editFilmTitle": "Film bearbeiten",
|
|
||||||
"filmFormula": "Formel",
|
|
||||||
"filmFormulaExponential": "T=t^Rf",
|
|
||||||
"filmFormulaExponentialRf": "Rf",
|
|
||||||
"filmFormulaExponentialRfPlaceholder": "1.3",
|
|
||||||
"name": "Name",
|
|
||||||
"addEquipmentProfileTitle": "Ausrüstung hinzufügen",
|
|
||||||
"editEquipmentProfileTitle": "Ausrüstung bearbeiten"
|
|
||||||
}
|
|
|
@ -30,14 +30,14 @@
|
||||||
"halfStops": "1/2",
|
"halfStops": "1/2",
|
||||||
"thirdStops": "1/3",
|
"thirdStops": "1/3",
|
||||||
"calibration": "校准",
|
"calibration": "校准",
|
||||||
"calibrationMessage": "此应用测量读数的准确性取决于设备的后置摄像头。如需更精确的测量结果或测量结果存在偏差,请手动校准 EV 。",
|
"calibrationMessage": "此应用程序测量读数的准确性取决于设备的后置摄像头。如需更精确的测量结果或测量结果存在偏差,请手动校准 EV 。",
|
||||||
"calibrationMessageCameraOnly": "此应用测量读数的准确性取决于设备的后置摄像头。如需更精确的测量结果或测量结果存在偏差,请手动校准 EV 。",
|
"calibrationMessageCameraOnly": "此应用程序测量读数的准确性取决于设备的后置摄像头。如需更精确的测量结果或测量结果存在偏差,请手动校准 EV 。",
|
||||||
"camera": "摄像头",
|
"camera": "摄像头",
|
||||||
"lightSensor": "光线传感器",
|
"lightSensor": "光传感器",
|
||||||
"showEv100": "显示 EV\u2081\u2080\u2080",
|
"showEv100": "显示 EV\u2081\u2080\u2080",
|
||||||
"meteringScreenLayout": "布局",
|
"meteringScreenLayout": "布局",
|
||||||
"meteringScreenLayoutHint": "隐藏不需要的元素,让主界面更加整洁",
|
"meteringScreenLayoutHint": "隐藏不需要的元素,以免浪费曝光列表空间",
|
||||||
"meteringScreenLayoutHintEquipmentProfiles": "选择设备配置",
|
"meteringScreenLayoutHintEquipmentProfiles": "设备配置选择",
|
||||||
"meteringScreenFeatureExtremeExposurePairs": "最快 & 最慢曝光组合",
|
"meteringScreenFeatureExtremeExposurePairs": "最快 & 最慢曝光组合",
|
||||||
"meteringScreenFeatureFilmPicker": "胶片选择",
|
"meteringScreenFeatureFilmPicker": "胶片选择",
|
||||||
"cameraFeatures": "相机功能",
|
"cameraFeatures": "相机功能",
|
||||||
|
@ -48,22 +48,22 @@
|
||||||
"film": "胶片",
|
"film": "胶片",
|
||||||
"filmPush": "胶片 (push)",
|
"filmPush": "胶片 (push)",
|
||||||
"filmPull": "胶片 (pull)",
|
"filmPull": "胶片 (pull)",
|
||||||
"filmReciprocityHint": "倒易律失效补偿(对快门速度超过 1 秒的情况进行修正)",
|
"filmReciprocityHint": "对快门速度超过 1 秒的情况进行修正",
|
||||||
"equipmentProfileName": "设备配置名称",
|
"equipmentProfileName": "设备配置名称",
|
||||||
"equipmentProfileNameHint": "Praktica MTL5B",
|
"equipmentProfileNameHint": "Praktica MTL5B",
|
||||||
"equipmentProfileAllValues": "全部",
|
"equipmentProfileAllValues": "全部",
|
||||||
"apertureValues": "光圈值",
|
"apertureValues": "光圈值",
|
||||||
"apertureValuesFilterDescription": "选择要显示的光圈值范围。取决于使用的镜头。",
|
"apertureValuesFilterDescription": "选择要显示的光圈值范围。这通常由您使用的镜头决定。",
|
||||||
"ndFilters": "ND 滤镜",
|
"ndFilters": "ND 滤镜",
|
||||||
"ndFiltersFilterDescription": "选择要显示的 ND 滤镜系数。取决于使用的 ND 滤镜",
|
"ndFiltersFilterDescription": "选择要显示的 ND 滤镜系数。可能是您最常用的 ND 滤镜,也可能是适合您镜头的减光镜。",
|
||||||
"shutterSpeedValues": "快门速度",
|
"shutterSpeedValues": "快门速度",
|
||||||
"shutterSpeedValuesFilterDescription": "选择要显示的快门速度范围。取决于相机机身。",
|
"shutterSpeedValuesFilterDescription": "选择要显示的快门速度范围。这通常由您使用的相机机身决定。",
|
||||||
"shutterSpeedManualShort": "B门",
|
"shutterSpeedManualShort": "B",
|
||||||
"shutterSpeedManual": "手动",
|
"shutterSpeedManual": "手册",
|
||||||
"isoValues": "ISO",
|
"isoValues": "ISO",
|
||||||
"isoValuesFilterDescription": "选择要显示的 ISO 范围。",
|
"isoValuesFilterDescription": "选择要显示的 ISO 。这些可能是您常用的ISO值,也可以是相机支持的ISO范围。",
|
||||||
"lensZoom": "镜头变焦",
|
"lensZoom": "镜头变焦",
|
||||||
"lensZoomDescription": "设置相对于手机摄像头的变焦焦距,使其与相机取景相匹配。",
|
"lensZoomDescription": "设置相对于手机摄像头的变焦级别,使其与相机取景器相匹配。",
|
||||||
"equipmentProfile": "设备配置",
|
"equipmentProfile": "设备配置",
|
||||||
"equipmentProfiles": "设备配置",
|
"equipmentProfiles": "设备配置",
|
||||||
"tapToAdd": "点击添加",
|
"tapToAdd": "点击添加",
|
||||||
|
@ -105,19 +105,19 @@
|
||||||
"featuresFree": "免费",
|
"featuresFree": "免费",
|
||||||
"featuresPro": "专业版",
|
"featuresPro": "专业版",
|
||||||
"proFeaturesPromoText": "Lightmeter Pro 提供您需要的一切,助您拍出最佳照片!",
|
"proFeaturesPromoText": "Lightmeter Pro 提供您需要的一切,助您拍出最佳照片!",
|
||||||
"proFeaturesWhatsIncluded": "Lightmeter Pro 包含哪些内容?",
|
"proFeaturesWhatsIncluded": "包括哪些内容?",
|
||||||
"featureReflectedLightMetering": "反射光测光",
|
"featureReflectedLightMetering": "反射光测光",
|
||||||
"featureIncidentLightMetering": "入射光测光",
|
"featureIncidentLightMetering": "入射光测光",
|
||||||
"featureIsoAndNdValues": "更广的 ISO 和 ND 滤镜系数范围",
|
"featureIsoAndNdValues": "广泛的ISO和ND滤镜值范围",
|
||||||
"featureTheme": "主题自定义",
|
"featureTheme": "主题自定义",
|
||||||
"featureSpotMetering": "点测光",
|
"featureSpotMetering": "点测光",
|
||||||
"featureHistogram": "直方图",
|
"featureHistogram": "直方图",
|
||||||
"featureListOfFilms": "20多种胶片的补偿公式",
|
"featureListOfFilms": "20多部电影的修正公式列表",
|
||||||
"featureCustomFilms": "创建自定义胶片",
|
"featureCustomFilms": "创建自定义胶片的能力",
|
||||||
"featureEquipmentProfiles": "设备配置文件",
|
"featureEquipmentProfiles": "设备配置文件",
|
||||||
"featureTimer": "内置长曝光计时器",
|
"featureTimer": "内置长曝光计时器",
|
||||||
"featureMeteringScreenLayout": "可自定义的主界面",
|
"featureMeteringScreenLayout": "可自定义的主屏幕",
|
||||||
"proFeaturesSupportText": "通过购买Lightmeter Pro,支持软件的开发,让软件持续添加新功能!",
|
"proFeaturesSupportText": "通过购买Lightmeter Pro,您支持开发工作,并使添加新功能成为可能。",
|
||||||
"getNowFor": "立即获取 {price}",
|
"getNowFor": "立即获取 {price}",
|
||||||
"@getNowFor": {
|
"@getNowFor": {
|
||||||
"price": {
|
"price": {
|
||||||
|
@ -141,13 +141,13 @@
|
||||||
"exposurePair": "曝光对",
|
"exposurePair": "曝光对",
|
||||||
"films": "Films",
|
"films": "Films",
|
||||||
"filmsInUse": "使用的胶片",
|
"filmsInUse": "使用的胶片",
|
||||||
"filmsCustom": "自定义胶片",
|
"filmsCustom": "定制胶片",
|
||||||
"addFilmTitle": "添加胶片",
|
"addFilmTitle": "添加胶片",
|
||||||
"editFilmTitle": "编辑胶片",
|
"editFilmTitle": "编辑胶片",
|
||||||
"filmFormula": "计算公式",
|
"filmFormula": "计算公式",
|
||||||
"filmFormulaExponential": "T=t^Rf",
|
"filmFormulaExponential": "T=t^Rf",
|
||||||
"filmFormulaExponentialRf": "Rf",
|
"filmFormulaExponentialRf": "Rf",
|
||||||
"filmFormulaExponentialRfPlaceholder": "1.3",
|
"filmFormulaExponentialRfPlaceholder": "1.3",
|
||||||
"addEquipmentProfileTitle": "添加设备",
|
"addEquipmentProfileTitle": "添加简介",
|
||||||
"editEquipmentProfileTitle": "编辑设备"
|
"editEquipmentProfileTitle": "编辑个人资料"
|
||||||
}
|
}
|
|
@ -30,6 +30,7 @@ Future<void> runLightmeterApp(Environment env) async {
|
||||||
products: [
|
products: [
|
||||||
IAPProduct(
|
IAPProduct(
|
||||||
storeId: IAPProductType.paidFeatures.storeId,
|
storeId: IAPProductType.paidFeatures.storeId,
|
||||||
|
status: IAPProductStatus.purchased,
|
||||||
price: '0.0\$',
|
price: '0.0\$',
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -137,8 +137,8 @@ class _NameFieldBuilder extends StatelessWidget {
|
||||||
bottom: Dimens.paddingS / 2,
|
bottom: Dimens.paddingS / 2,
|
||||||
),
|
),
|
||||||
child: LightmeterTextField(
|
child: LightmeterTextField(
|
||||||
autofocus: true,
|
|
||||||
initialValue: state.name,
|
initialValue: state.name,
|
||||||
|
autofocus: true,
|
||||||
maxLength: 48,
|
maxLength: 48,
|
||||||
hintText: S.of(context).name,
|
hintText: S.of(context).name,
|
||||||
style: Theme.of(context).listTileTheme.titleTextStyle,
|
style: Theme.of(context).listTileTheme.titleTextStyle,
|
||||||
|
|
|
@ -132,7 +132,7 @@ class _ProFeaturesOverlay extends StatelessWidget {
|
||||||
);
|
);
|
||||||
final bool hasSpotMetering = UserPreferencesProvider.cameraFeatureOf(
|
final bool hasSpotMetering = UserPreferencesProvider.cameraFeatureOf(
|
||||||
context,
|
context,
|
||||||
CameraFeature.spotMetering,
|
CameraFeature.histogram,
|
||||||
);
|
);
|
||||||
return Stack(
|
return Stack(
|
||||||
alignment: Alignment.bottomCenter,
|
alignment: Alignment.bottomCenter,
|
||||||
|
|
|
@ -1,61 +1,27 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
|
|
||||||
class LightmeterTextField extends StatefulWidget {
|
class LightmeterTextField extends TextFormField {
|
||||||
const LightmeterTextField({
|
LightmeterTextField({
|
||||||
this.autofocus = false,
|
super.controller,
|
||||||
this.controller,
|
super.autofocus,
|
||||||
this.hintText,
|
super.initialValue,
|
||||||
this.initialValue,
|
super.inputFormatters,
|
||||||
this.inputFormatters,
|
super.maxLength,
|
||||||
this.leading,
|
super.onChanged,
|
||||||
this.maxLength,
|
super.style,
|
||||||
this.onChanged,
|
super.textAlign,
|
||||||
this.style,
|
Widget? leading,
|
||||||
this.textAlign = TextAlign.start,
|
String? hintText,
|
||||||
});
|
}) : super(
|
||||||
|
|
||||||
final bool autofocus;
|
|
||||||
final TextEditingController? controller;
|
|
||||||
final String? hintText;
|
|
||||||
final String? initialValue;
|
|
||||||
final List<TextInputFormatter>? inputFormatters;
|
|
||||||
final Widget? leading;
|
|
||||||
final int? maxLength;
|
|
||||||
final void Function(String)? onChanged;
|
|
||||||
final TextStyle? style;
|
|
||||||
final TextAlign textAlign;
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<LightmeterTextField> createState() => _LightmeterTextFieldState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _LightmeterTextFieldState extends State<LightmeterTextField> {
|
|
||||||
late final focusNode = FocusNode(debugLabel: widget.hintText);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return TextFormField(
|
|
||||||
autofocus: widget.autofocus,
|
|
||||||
autovalidateMode: AutovalidateMode.onUserInteraction,
|
autovalidateMode: AutovalidateMode.onUserInteraction,
|
||||||
controller: widget.controller,
|
maxLines: 1,
|
||||||
focusNode: focusNode,
|
|
||||||
initialValue: widget.initialValue,
|
|
||||||
inputFormatters: widget.inputFormatters,
|
|
||||||
maxLength: widget.maxLength,
|
|
||||||
onChanged: widget.onChanged,
|
|
||||||
style: widget.style,
|
|
||||||
textAlign: widget.textAlign,
|
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
counter: const SizedBox(),
|
counter: const SizedBox(),
|
||||||
contentPadding: EdgeInsets.zero,
|
contentPadding: EdgeInsets.zero,
|
||||||
errorStyle: const TextStyle(fontSize: 0),
|
errorStyle: const TextStyle(fontSize: 0),
|
||||||
icon: widget.leading,
|
icon: leading,
|
||||||
hintText: widget.hintText,
|
hintText: hintText,
|
||||||
),
|
),
|
||||||
onTapOutside: (event) {
|
|
||||||
focusNode.unfocus();
|
|
||||||
},
|
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
return '';
|
return '';
|
||||||
|
@ -64,11 +30,4 @@ class _LightmeterTextFieldState extends State<LightmeterTextField> {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
focusNode.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,14 +2,11 @@ import 'dart:ui';
|
||||||
|
|
||||||
extension ColorToInt on Color {
|
extension ColorToInt on Color {
|
||||||
int toInt() {
|
int toInt() {
|
||||||
return value;
|
final a = (this.a * 255).round();
|
||||||
|
final r = (this.r * 255).round();
|
||||||
|
final g = (this.g * 255).round();
|
||||||
|
final b = (this.b * 255).round();
|
||||||
|
|
||||||
// Wait for Flutter 3.27.1
|
return (a << 24) | (r << 16) | (g << 8) | b;
|
||||||
// final a = (this.a * 255).round();
|
|
||||||
// final r = (this.r * 255).round();
|
|
||||||
// final g = (this.g * 255).round();
|
|
||||||
// final b = (this.b * 255).round();
|
|
||||||
|
|
||||||
// return (a << 24) | (r << 16) | (g << 8) | b;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
98
pubspec.lock
|
@ -5,10 +5,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: _fe_analyzer_shared
|
name: _fe_analyzer_shared
|
||||||
sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
|
sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "72.0.0"
|
version: "76.0.0"
|
||||||
_flutterfire_internals:
|
_flutterfire_internals:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -21,15 +21,15 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: dart
|
description: dart
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.3.2"
|
version: "0.3.3"
|
||||||
analyzer:
|
analyzer:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: analyzer
|
name: analyzer
|
||||||
sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
|
sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.7.0"
|
version: "6.11.0"
|
||||||
ansicolor:
|
ansicolor:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -114,50 +114,50 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: build
|
name: build
|
||||||
sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
|
sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.1"
|
version: "2.4.2"
|
||||||
build_config:
|
build_config:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: build_config
|
name: build_config
|
||||||
sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
|
sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.1"
|
version: "1.1.2"
|
||||||
build_daemon:
|
build_daemon:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: build_daemon
|
name: build_daemon
|
||||||
sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
|
sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.2"
|
version: "4.0.3"
|
||||||
build_resolvers:
|
build_resolvers:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: build_resolvers
|
name: build_resolvers
|
||||||
sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
|
sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.2"
|
version: "2.4.3"
|
||||||
build_runner:
|
build_runner:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: build_runner
|
name: build_runner
|
||||||
sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
|
sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.13"
|
version: "2.4.14"
|
||||||
build_runner_core:
|
build_runner_core:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: build_runner_core
|
name: build_runner_core
|
||||||
sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
|
sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "7.3.2"
|
version: "8.0.0"
|
||||||
built_collection:
|
built_collection:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -282,10 +282,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: collection
|
name: collection
|
||||||
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.18.0"
|
version: "1.19.0"
|
||||||
convert:
|
convert:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -688,10 +688,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: http_parser
|
name: http_parser
|
||||||
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
|
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.2"
|
version: "4.1.2"
|
||||||
image:
|
image:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
|
@ -781,18 +781,18 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker
|
name: leak_tracker
|
||||||
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
|
sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.5"
|
version: "10.0.7"
|
||||||
leak_tracker_flutter_testing:
|
leak_tracker_flutter_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_flutter_testing
|
name: leak_tracker_flutter_testing
|
||||||
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
|
sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.5"
|
version: "3.0.8"
|
||||||
leak_tracker_testing:
|
leak_tracker_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -829,11 +829,11 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: "v2.1.3"
|
ref: "v2.1.2"
|
||||||
resolved-ref: "4575586ff6114b780ca651b7ac7c272a4a4801eb"
|
resolved-ref: "2eff5443e89c28795f3bb21d027eb43243a49b5d"
|
||||||
url: "https://github.com/vodemn/m3_lightmeter_iap"
|
url: "https://github.com/vodemn/m3_lightmeter_iap"
|
||||||
source: git
|
source: git
|
||||||
version: "2.1.3+30"
|
version: "2.1.2+29"
|
||||||
m3_lightmeter_resources:
|
m3_lightmeter_resources:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -847,10 +847,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: macros
|
name: macros
|
||||||
sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
|
sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.2-main.4"
|
version: "0.1.3-main.0"
|
||||||
matcher:
|
matcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1159,10 +1159,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shelf
|
name: shelf
|
||||||
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
|
sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.4.1"
|
version: "1.4.2"
|
||||||
shelf_packages_handler:
|
shelf_packages_handler:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1191,7 +1191,7 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.99"
|
version: "0.0.0"
|
||||||
source_map_stack_trace:
|
source_map_stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1268,10 +1268,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: stack_trace
|
name: stack_trace
|
||||||
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
|
sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.11.1"
|
version: "1.12.0"
|
||||||
stream_channel:
|
stream_channel:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1292,10 +1292,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: string_scanner
|
name: string_scanner
|
||||||
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
|
sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.0"
|
version: "1.3.0"
|
||||||
sync_http:
|
sync_http:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1324,26 +1324,26 @@ packages:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: test
|
name: test
|
||||||
sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e"
|
sha256: "713a8789d62f3233c46b4a90b174737b2c04cb6ae4500f2aa8b1be8f03f5e67f"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.25.7"
|
version: "1.25.8"
|
||||||
test_api:
|
test_api:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
|
sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.2"
|
version: "0.7.3"
|
||||||
test_core:
|
test_core:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_core
|
name: test_core
|
||||||
sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696"
|
sha256: "12391302411737c176b0b5d6491f466b0dd56d4763e347b6714efbaa74d7953d"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.4"
|
version: "0.6.5"
|
||||||
timing:
|
timing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1468,10 +1468,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
|
sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "14.2.5"
|
version: "14.3.0"
|
||||||
watcher:
|
watcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1508,10 +1508,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webdriver
|
name: webdriver
|
||||||
sha256: "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e"
|
sha256: "3d773670966f02a646319410766d3b5e1037efb7f07cc68f844d5e06cd4d61c8"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.3"
|
version: "3.0.4"
|
||||||
webkit_inspection_protocol:
|
webkit_inspection_protocol:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1561,5 +1561,5 @@ packages:
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.3"
|
version: "3.1.3"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.5.0 <4.0.0"
|
dart: ">=3.6.0 <4.0.0"
|
||||||
flutter: ">=3.24.5"
|
flutter: ">=3.27.1"
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
name: lightmeter
|
name: lightmeter
|
||||||
description: Lightmeter app inspired by Material 3 design system.
|
description: Lightmeter app inspired by Material 3 design system.
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
version: 1.0.4+59
|
version: 1.0.2+57
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.0.0 <4.0.0"
|
sdk: ">=3.0.0 <4.0.0"
|
||||||
flutter: "3.24.5"
|
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
app_settings: 5.1.1
|
app_settings: 5.1.1
|
||||||
|
@ -32,7 +31,7 @@ dependencies:
|
||||||
m3_lightmeter_iap:
|
m3_lightmeter_iap:
|
||||||
git:
|
git:
|
||||||
url: "https://github.com/vodemn/m3_lightmeter_iap"
|
url: "https://github.com/vodemn/m3_lightmeter_iap"
|
||||||
ref: v2.1.3
|
ref: v2.1.2
|
||||||
m3_lightmeter_resources:
|
m3_lightmeter_resources:
|
||||||
git:
|
git:
|
||||||
url: "https://github.com/vodemn/m3_lightmeter_resources"
|
url: "https://github.com/vodemn/m3_lightmeter_resources"
|
||||||
|
@ -50,7 +49,7 @@ dependencies:
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
args: 2.6.0
|
args: 2.6.0
|
||||||
bloc_test: 10.0.0
|
bloc_test: 10.0.0
|
||||||
build_runner: 2.4.13
|
build_runner: 2.4.14
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
golden_toolkit: 0.15.0
|
golden_toolkit: 0.15.0
|
||||||
|
@ -62,7 +61,7 @@ dev_dependencies:
|
||||||
logging: 1.3.0
|
logging: 1.3.0
|
||||||
meta: 1.15.0
|
meta: 1.15.0
|
||||||
mocktail: 1.0.4
|
mocktail: 1.0.4
|
||||||
test: 1.25.7
|
test: 1.25.8
|
||||||
|
|
||||||
dependency_overrides:
|
dependency_overrides:
|
||||||
material_color_utilities: 0.11.1
|
material_color_utilities: 0.11.1
|
||||||
|
|
|
@ -30,6 +30,11 @@
|
||||||
"title": "Create multiple profiles",
|
"title": "Create multiple profiles",
|
||||||
"subtitle": "to match your\ncamera & lens setups"
|
"subtitle": "to match your\ncamera & lens setups"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"screenshotName": "light_equipment-profiles-iso-picker",
|
||||||
|
"title": "Fine-tune results",
|
||||||
|
"subtitle": "by selecting the values\nthat you use the most"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"screenshotName": "dark_metering-reflected",
|
"screenshotName": "dark_metering-reflected",
|
||||||
"title": "Match your style",
|
"title": "Match your style",
|
||||||
|
|
|
@ -15,6 +15,7 @@ import 'package:lightmeter/data/shared_prefs_service.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/res/theme.dart';
|
import 'package:lightmeter/res/theme.dart';
|
||||||
|
import 'package:lightmeter/screens/equipment_profiles/screen_equipment_profiles.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/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/screen_metering.dart';
|
import 'package:lightmeter/screens/metering/screen_metering.dart';
|
||||||
|
@ -117,9 +118,13 @@ void main() {
|
||||||
|
|
||||||
await tester.tapDescendantTextOf<SettingsScreen>(S.current.equipmentProfiles);
|
await tester.tapDescendantTextOf<SettingsScreen>(S.current.equipmentProfiles);
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
await tester.tap(find.byIcon(Icons.edit_outlined).first);
|
await tester.tapDescendantTextOf<EquipmentProfilesScreen>(mockEquipmentProfiles.first.name);
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
await tester.takeScreenshotLight(binding, 'equipment-profiles');
|
await tester.takeScreenshotLight(binding, 'equipment-profiles');
|
||||||
|
|
||||||
|
await tester.tap(find.byIcon(Icons.iso_outlined).first);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
await tester.takeScreenshotLight(binding, 'equipment-profiles-iso-picker');
|
||||||
});
|
});
|
||||||
|
|
||||||
/// and the additionally the first one with the dark theme
|
/// and the additionally the first one with the dark theme
|
||||||
|
@ -163,7 +168,7 @@ void main() {
|
||||||
ev: 5,
|
ev: 5,
|
||||||
exposurePair: timerExposurePair,
|
exposurePair: timerExposurePair,
|
||||||
);
|
);
|
||||||
await tester.tap(find.text(_mockFilm.reciprocityFailure(timerExposurePair.shutterSpeed).toString()));
|
await tester.tap(find.text(timerExposurePair.shutterSpeed.toString()));
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
await tester.mockTimerResumedState(timerExposurePair.shutterSpeed);
|
await tester.mockTimerResumedState(timerExposurePair.shutterSpeed);
|
||||||
await tester.takeScreenshotLight(binding, 'timer');
|
await tester.takeScreenshotLight(binding, 'timer');
|
||||||
|
|
Before Width: | Height: | Size: 469 KiB After Width: | Height: | Size: 492 KiB |
After Width: | Height: | Size: 221 KiB |
Before Width: | Height: | Size: 215 KiB After Width: | Height: | Size: 221 KiB |
Before Width: | Height: | Size: 235 KiB After Width: | Height: | Size: 235 KiB |
Before Width: | Height: | Size: 223 KiB After Width: | Height: | Size: 220 KiB |
Before Width: | Height: | Size: 478 KiB After Width: | Height: | Size: 500 KiB |
Before Width: | Height: | Size: 234 KiB After Width: | Height: | Size: 235 KiB |
Before Width: | Height: | Size: 220 KiB After Width: | Height: | Size: 219 KiB |
Before Width: | Height: | Size: 348 KiB After Width: | Height: | Size: 346 KiB |
After Width: | Height: | Size: 159 KiB |
Before Width: | Height: | Size: 159 KiB After Width: | Height: | Size: 163 KiB |
Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 177 KiB |
Before Width: | Height: | Size: 347 KiB After Width: | Height: | Size: 345 KiB |
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 167 KiB |
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 148 KiB |
Before Width: | Height: | Size: 511 KiB After Width: | Height: | Size: 507 KiB |
After Width: | Height: | Size: 223 KiB |
Before Width: | Height: | Size: 224 KiB After Width: | Height: | Size: 227 KiB |
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 248 KiB |
Before Width: | Height: | Size: 505 KiB After Width: | Height: | Size: 501 KiB |
Before Width: | Height: | Size: 238 KiB After Width: | Height: | Size: 235 KiB |
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 206 KiB |
4
screenshots/scripts/convert_to_store_screenshots.sh
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
dart run screenshots/convert_to_store_screenshots.dart -p android -d pixel_6 -l android
|
||||||
|
dart run screenshots/convert_to_store_screenshots.dart -p ios -d iphone_13_pro -l iphone55inch
|
||||||
|
dart run screenshots/convert_to_store_screenshots.dart -p ios -d iphone_13_pro -l iphone65inch
|
||||||
|
#dart run screenshots/convert_to_store_screenshots.dart -p ios -d ipad_pro_12.9-inch_6th_generation -l ipad13inch
|
|
@ -1,3 +1 @@
|
||||||
sh screenshots/scripts/generate_screenshots.sh "Pixel 6"
|
sh screenshots/scripts/generate_screenshots.sh "Pixel 6"
|
||||||
|
|
||||||
dart run screenshots/convert_to_store_screenshots.dart -p android -d pixel_6 -l android
|
|
|
@ -6,6 +6,3 @@ for i in "${simulators_array[@]}"; do # https://www.baeldung.com/linux/shell-scr
|
||||||
sh screenshots/scripts/generate_screenshots.sh "$i"
|
sh screenshots/scripts/generate_screenshots.sh "$i"
|
||||||
done
|
done
|
||||||
killall 'Simulator'
|
killall 'Simulator'
|
||||||
|
|
||||||
dart run screenshots/convert_to_store_screenshots.dart -p ios -d iphone_13_pro -l iphone55inch
|
|
||||||
dart run screenshots/convert_to_store_screenshots.dart -p ios -d iphone_13_pro -l iphone65inch
|
|
|
@ -1,4 +0,0 @@
|
||||||
const String contactEmail = '';
|
|
||||||
const String iapServerUrl = '';
|
|
||||||
const String issuesReportUrl = 'https://github.com/vodemn/m3_lightmeter/issues/new/choose';
|
|
||||||
const String sourceCodeUrl = 'https://github.com/vodemn/m3_lightmeter/';
|
|
|
@ -1,30 +0,0 @@
|
||||||
{
|
|
||||||
"flutter": {
|
|
||||||
"platforms": {
|
|
||||||
"android": {
|
|
||||||
"default": {
|
|
||||||
"projectId": "mockproject-1234",
|
|
||||||
"appId": "1:123456789000:android:f1bf012572b04063",
|
|
||||||
"fileOutput": "android/app/google-services.json"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ios": {
|
|
||||||
"default": {
|
|
||||||
"projectId": "mockproject-1234",
|
|
||||||
"appId": "1:123456789000:ios:f1bf012572b04063",
|
|
||||||
"uploadDebugSymbols": true,
|
|
||||||
"fileOutput": "ios/Runner/GoogleService-Info.plist"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dart": {
|
|
||||||
"lib/firebase_options.dart": {
|
|
||||||
"projectId": "mockproject-1234",
|
|
||||||
"configurations": {
|
|
||||||
"android": "1:123456789000:android:f1bf012572b04063",
|
|
||||||
"ios": "1:123456789000:ios:f1bf012572b04063"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
// ignore_for_file: type=lint
|
|
||||||
import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
|
|
||||||
|
|
||||||
class DefaultFirebaseOptions {
|
|
||||||
static FirebaseOptions get currentPlatform =>
|
|
||||||
FirebaseOptions(apiKey: '', appId: '', messagingSenderId: '', projectId: '');
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
cp "scripts/mocks/mock_constants.dart" "lib/constants.dart"
|
|
||||||
cp "scripts/mocks/mock_firebase_options.dart" "lib/firebase_options.dart"
|
|
||||||
cp "scripts/mocks/mock_firebase.json" "firebase.json"
|
|
||||||
|
|
||||||
curl -H 'Accept: application/vnd.github.v3.raw' \
|
|
||||||
-o "android/app/google-services.json" \
|
|
||||||
-L "https://api.github.com/repos/firebase/quickstart-android/contents/mock-google-services.json"
|
|
||||||
curl -H 'Accept: application/vnd.github.v3.raw' \
|
|
||||||
-o "ios/Runner/GoogleService-Info.plist" \
|
|
||||||
-L "https://api.github.com/repos/firebase/quickstart-ios/contents/mock-GoogleService-Info.plist"
|
|
||||||
|
|
||||||
sh .github/scripts/stub_iap.sh
|
|
|
@ -7,7 +7,6 @@ void main() {
|
||||||
expect(SupportedLocale.fr.intlName, 'fr');
|
expect(SupportedLocale.fr.intlName, 'fr');
|
||||||
expect(SupportedLocale.ru.intlName, 'ru');
|
expect(SupportedLocale.ru.intlName, 'ru');
|
||||||
expect(SupportedLocale.zh.intlName, 'zh');
|
expect(SupportedLocale.zh.intlName, 'zh');
|
||||||
expect(SupportedLocale.de.intlName, 'de');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('localizedName', () {
|
test('localizedName', () {
|
||||||
|
@ -15,6 +14,5 @@ void main() {
|
||||||
expect(SupportedLocale.fr.localizedName, 'Français');
|
expect(SupportedLocale.fr.localizedName, 'Français');
|
||||||
expect(SupportedLocale.ru.localizedName, 'Русский');
|
expect(SupportedLocale.ru.localizedName, 'Русский');
|
||||||
expect(SupportedLocale.zh.localizedName, '简体中文');
|
expect(SupportedLocale.zh.localizedName, '简体中文');
|
||||||
expect(SupportedLocale.de.localizedName, 'Deutsch');
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 301 KiB After Width: | Height: | Size: 301 KiB |
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
Before Width: | Height: | Size: 497 KiB After Width: | Height: | Size: 498 KiB |
Before Width: | Height: | Size: 862 KiB After Width: | Height: | Size: 863 KiB |