This commit is contained in:
Vadim 2025-07-16 21:24:37 +02:00
parent a6d2892d5c
commit 91a1942191
5 changed files with 189 additions and 76 deletions

View file

@ -0,0 +1,24 @@
import 'dart:async';
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
class LogbookPhotosStorageService {
LogbookPhotosStorageService();
Future<void> init() async {}
Future<void> addPhoto(LogbookPhoto profile) async {}
Future<void> updatePhoto({
required String id,
String? note,
ApertureValue? apertureValue,
bool removeApertureValue = false,
ShutterSpeedValue? shutterSpeedValue,
bool removeShutterSpeedValue = false,
}) async {}
Future<void> deletePhoto(String id) async {}
Future<List<LogbookPhoto>> getPhotos() async => [];
}

View file

@ -31,6 +31,7 @@ Future<void> runLightmeterApp(Environment env) async {
IAPProduct( IAPProduct(
storeId: IAPProductType.paidFeatures.storeId, storeId: IAPProductType.paidFeatures.storeId,
price: '0.0\$', price: '0.0\$',
status: IAPProductStatus.purchased,
), ),
], ],
child: application, child: application,

View file

@ -12,6 +12,7 @@ class LogbookPhotoGridTile extends StatelessWidget {
const LogbookPhotoGridTile({ const LogbookPhotoGridTile({
required this.photo, required this.photo,
required this.onTap, required this.onTap,
super.key,
}); });
@override @override

View file

@ -55,7 +55,7 @@ class _LogbookScreenState extends State<LogbookScreen> with SingleTickerProvider
} }
} }
class _PicturesGridBuilder extends StatelessWidget { class _PicturesGridBuilder extends StatefulWidget {
final List<LogbookPhoto> values; final List<LogbookPhoto> values;
final void Function(LogbookPhoto photo) onEdit; final void Function(LogbookPhoto photo) onEdit;
@ -66,9 +66,22 @@ class _PicturesGridBuilder extends StatelessWidget {
required this.onEdit, required this.onEdit,
}); });
@override
State<_PicturesGridBuilder> createState() => _PicturesGridBuilderState();
}
class _PicturesGridBuilderState extends State<_PicturesGridBuilder> {
late Map<String, GlobalKey> _keys = _generateKeys();
@override
void didUpdateWidget(_PicturesGridBuilder oldWidget) {
super.didUpdateWidget(oldWidget);
_keys = _generateKeys();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (values.isEmpty) { if (widget.values.isEmpty) {
return SliverFillRemaining( return SliverFillRemaining(
hasScrollBody: false, hasScrollBody: false,
child: Center( child: Center(
@ -83,19 +96,33 @@ class _PicturesGridBuilder extends StatelessWidget {
padding: const EdgeInsets.all(Dimens.paddingM), padding: const EdgeInsets.all(Dimens.paddingM),
sliver: SliverGrid( sliver: SliverGrid(
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: maxCrossAxisExtent: (MediaQuery.sizeOf(context).width -
(MediaQuery.sizeOf(context).width - Dimens.paddingS * (_crossAxisCount - 1) - Dimens.paddingM * 2) / Dimens.paddingS * (_PicturesGridBuilder._crossAxisCount - 1) -
_crossAxisCount, Dimens.paddingM * 2) /
_PicturesGridBuilder._crossAxisCount,
mainAxisSpacing: Dimens.paddingS, mainAxisSpacing: Dimens.paddingS,
crossAxisSpacing: Dimens.paddingS, crossAxisSpacing: Dimens.paddingS,
childAspectRatio: PlatformConfig.cameraPreviewAspectRatio, childAspectRatio: PlatformConfig.cameraPreviewAspectRatio,
), ),
delegate: SliverChildBuilderDelegate( delegate: SliverChildBuilderDelegate(
//TODO: fix jumping after the photo is edited
(_, int index) => LogbookPhotoGridTile( (_, int index) => LogbookPhotoGridTile(
photo: values[index], key: _keys[widget.values[index].id],
onTap: () => onEdit(values[index]), photo: widget.values[index],
onTap: () => widget.onEdit(widget.values[index]),
), ),
childCount: values.length, childCount: widget.values.length,
),
),
);
}
Map<String, GlobalKey> _generateKeys() {
return Map.fromEntries(
widget.values.map(
(photo) => MapEntry(
photo.id,
GlobalKey(debugLabel: photo.id),
), ),
), ),
); );

View file

@ -170,10 +170,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: built_value name: built_value
sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2" sha256: "082001b5c3dc495d4a42f1d5789990505df20d8547d42507c29050af6933ee27"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.9.3" version: "8.10.1"
camera: camera:
dependency: "direct main" dependency: "direct main"
description: description:
@ -186,26 +186,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: camera_android_camerax name: camera_android_camerax
sha256: "2985b8e5fca62709ebb2150962b1dae0444ba0a112be888ccf21e8371a1406d9" sha256: abcfa1ac32bd03116b4cfda7e8223ab391f01966e65823c064afe388550d1b3d
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.10+1" version: "0.6.10+3"
camera_avfoundation: camera_avfoundation:
dependency: transitive dependency: transitive
description: description:
name: camera_avfoundation name: camera_avfoundation
sha256: c3038e6e72e284b14ad246a419f26908c08f8886d114cb8a2e351988439bfa68 sha256: ca36181194f429eef3b09de3c96280f2400693f9735025f90d1f4a27465fdd72
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.9.17+6" version: "0.9.19"
camera_platform_interface: camera_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: camera_platform_interface name: camera_platform_interface
sha256: b3ede1f171532e0d83111fe0980b46d17f1aa9788a07a2fbed07366bbdbb9061 sha256: "2f757024a48696ff4814a789b0bd90f5660c0fb25f393ab4564fb483327930e2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.8.0" version: "2.10.0"
camera_web: camera_web:
dependency: transitive dependency: transitive
description: description:
@ -230,6 +230,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.3" version: "2.0.3"
cli_config:
dependency: transitive
description:
name: cli_config
sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec
url: "https://pub.dev"
source: hosted
version: "0.2.0"
clipboard: clipboard:
dependency: "direct main" dependency: "direct main"
description: description:
@ -298,10 +306,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: coverage name: coverage
sha256: e3493833ea012784c740e341952298f1cc77f1f01b1bbc3eb4eecf6984fb7f43 sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.11.1" version: "1.15.0"
cross_file: cross_file:
dependency: transitive dependency: transitive
description: description:
@ -338,10 +346,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: device_info_plus name: device_info_plus
sha256: "4fa68e53e26ab17b70ca39f072c285562cfc1589df5bb1e9295db90f6645f431" sha256: "72d146c6d7098689ff5c5f66bcf593ac11efc530095385356e131070333e64da"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "11.2.0" version: "11.3.0"
device_info_plus_platform_interface: device_info_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -458,18 +466,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: firebase_core_platform_interface name: firebase_core_platform_interface
sha256: d7253d255ff10f85cfd2adaba9ac17bae878fa3ba577462451163bd9f1d1f0bf sha256: "8bcfad6d7033f5ea951d15b867622a824b13812178bfec0c779b9d81de011bbb"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.4.0" version: "5.4.2"
firebase_core_web: firebase_core_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_core_web name: firebase_core_web
sha256: fbc008cf390d909b823763064b63afefe9f02d8afdb13eb3f485b871afee956b sha256: eb3afccfc452b2b2075acbe0c4b27de62dd596802b4e5e19869c1e926cbb20b3
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.19.0" version: "2.24.0"
firebase_crashlytics: firebase_crashlytics:
dependency: "direct main" dependency: "direct main"
description: description:
@ -553,10 +561,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: flutter_plugin_android_lifecycle name: flutter_plugin_android_lifecycle
sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" sha256: "1c2b787f99bdca1f3718543f81d38aa1b124817dfeb9fb196201bea85b6134bf"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.24" version: "2.0.26"
flutter_secure_storage: flutter_secure_storage:
dependency: transitive dependency: transitive
description: description:
@ -628,14 +636,62 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
geolocator:
dependency: "direct main"
description:
name: geolocator
sha256: "0ec58b731776bc43097fcf751f79681b6a8f6d3bc737c94779fe9f1ad73c1a81"
url: "https://pub.dev"
source: hosted
version: "13.0.1"
geolocator_android:
dependency: "direct overridden"
description:
name: geolocator_android
sha256: "7aefc530db47d90d0580b552df3242440a10fe60814496a979aa67aa98b1fd47"
url: "https://pub.dev"
source: hosted
version: "4.6.1"
geolocator_apple:
dependency: transitive
description:
name: geolocator_apple
sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22
url: "https://pub.dev"
source: hosted
version: "2.3.13"
geolocator_platform_interface:
dependency: transitive
description:
name: geolocator_platform_interface
sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67"
url: "https://pub.dev"
source: hosted
version: "4.2.6"
geolocator_web:
dependency: transitive
description:
name: geolocator_web
sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172
url: "https://pub.dev"
source: hosted
version: "4.1.3"
geolocator_windows:
dependency: transitive
description:
name: geolocator_windows
sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6"
url: "https://pub.dev"
source: hosted
version: "0.2.5"
glob: glob:
dependency: transitive dependency: transitive
description: description:
name: glob name: glob
sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.2" version: "2.1.3"
golden_toolkit: golden_toolkit:
dependency: "direct dev" dependency: "direct dev"
description: description:
@ -664,10 +720,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: html name: html
sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.15.5" version: "0.15.6"
http: http:
dependency: transitive dependency: transitive
description: description:
@ -728,10 +784,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: in_app_purchase_storekit name: in_app_purchase_storekit
sha256: "52caf1051fec8018adabd2d1e775a44cb389972ed868a746c4fc28a301734d41" sha256: "6ce1361278cacc0481508989ba419b2c9f46a2b0dc54b3fe54f5ee63c2718fef"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.3.20+4" version: "0.3.22+1"
integration_test: integration_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -765,10 +821,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: js name: js
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.7" version: "0.7.1"
json_annotation: json_annotation:
dependency: transitive dependency: transitive
description: description:
@ -828,21 +884,17 @@ packages:
m3_lightmeter_iap: m3_lightmeter_iap:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "/Users/vodemn/Documents/GitHub/Vodemn/m3_lightmeter_iap"
ref: "v2.1.3" relative: false
resolved-ref: "4575586ff6114b780ca651b7ac7c272a4a4801eb" source: path
url: "https://github.com/vodemn/m3_lightmeter_iap" version: "2.2.0+31"
source: git
version: "2.1.3+30"
m3_lightmeter_resources: m3_lightmeter_resources:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "/Users/vodemn/Documents/GitHub/Vodemn/m3_lightmeter_resources"
ref: "v2.1.0" relative: false
resolved-ref: "0e6eefe534adce851df639dcd28463a9089e5b92" source: path
url: "https://github.com/vodemn/m3_lightmeter_resources" version: "2.2.0+10"
source: git
version: "2.1.0+9"
macros: macros:
dependency: transitive dependency: transitive
description: description:
@ -851,6 +903,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.1.2-main.4" version: "0.1.2-main.4"
map_launcher:
dependency: "direct main"
description:
name: map_launcher
sha256: b9c11a1d32740ef8393559148716cc0fec38a569fdcf3fb569375114cf30988a
url: "https://pub.dev"
source: hosted
version: "3.2.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
@ -911,10 +971,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: package_config name: package_config
sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.1" version: "2.2.0"
package_info_plus: package_info_plus:
dependency: "direct main" dependency: "direct main"
description: description:
@ -927,10 +987,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: package_info_plus_platform_interface name: package_info_plus_platform_interface
sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.2" version: "3.2.0"
path: path:
dependency: transitive dependency: transitive
description: description:
@ -999,18 +1059,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: permission_handler_android name: permission_handler_android
sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "12.0.13" version: "12.1.0"
permission_handler_apple: permission_handler_apple:
dependency: transitive dependency: transitive
description: description:
name: permission_handler_apple name: permission_handler_apple
sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.4.5" version: "9.4.7"
permission_handler_html: permission_handler_html:
dependency: transitive dependency: transitive
description: description:
@ -1023,10 +1083,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: permission_handler_platform_interface name: permission_handler_platform_interface
sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.2.3" version: "4.3.0"
permission_handler_windows: permission_handler_windows:
dependency: transitive dependency: transitive
description: description:
@ -1079,18 +1139,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: provider name: provider
sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.2" version: "6.1.5"
pub_semver: pub_semver:
dependency: transitive dependency: transitive
description: description:
name: pub_semver name: pub_semver
sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.5" version: "2.2.0"
pubspec_parse: pubspec_parse:
dependency: transitive dependency: transitive
description: description:
@ -1111,10 +1171,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_android name: shared_preferences_android
sha256: "02a7d8a9ef346c9af715811b01fbd8e27845ad2c41148eefd31321471b41863d" sha256: "9f9f3d372d4304723e6136663bb291c0b93f5e4c8a4a6314347f481a33bda2b1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.0" version: "2.4.7"
shared_preferences_foundation: shared_preferences_foundation:
dependency: transitive dependency: transitive
description: description:
@ -1143,10 +1203,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_web name: shared_preferences_web
sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.2" version: "2.4.3"
shared_preferences_windows: shared_preferences_windows:
dependency: transitive dependency: transitive
description: description:
@ -1428,10 +1488,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_windows name: url_launcher_windows
sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4" sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.3" version: "3.1.4"
uuid: uuid:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1476,34 +1536,34 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: watcher name: watcher
sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.1" version: "1.1.2"
web: web:
dependency: transitive dependency: transitive
description: description:
name: web name: web
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.0" version: "1.1.1"
web_socket: web_socket:
dependency: transitive dependency: transitive
description: description:
name: web_socket name: web_socket
sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.1.6" version: "1.0.1"
web_socket_channel: web_socket_channel:
dependency: transitive dependency: transitive
description: description:
name: web_socket_channel name: web_socket_channel
sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.1" version: "3.0.3"
webdriver: webdriver:
dependency: transitive dependency: transitive
description: description:
@ -1524,10 +1584,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29" sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.10.0" version: "5.10.1"
win32_registry: win32_registry:
dependency: transitive dependency: transitive
description: description: