From 71305e49f9e0c4f14d10d5030d93b85b2374f68f Mon Sep 17 00:00:00 2001 From: "torok.istvan" Date: Fri, 12 Jun 2026 09:04:02 +0200 Subject: [PATCH] =?UTF-8?q?Appbar=20m=C3=B3dos=C3=ADt=C3=A1s,=20projektn?= =?UTF-8?q?=C3=A9v=20az=20alc=C3=ADmben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 2 ++ lib/models/project.dart | 27 +++++++++++++++++++++--- lib/services/app_database.dart | 2 ++ lib/widgets/appbar/shell_map_appbar.dart | 2 +- lib/widgets/map_mode_menu_anchor.dart | 15 +++++++------ 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 7e9c420..e747464 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,6 +10,7 @@ import 'package:terepi_seged/services/coord_converter_service.dart'; import 'package:terepi_seged/services/gnss/gnss_device_service.dart'; import 'package:terepi_seged/services/gnss/gnss_service.dart'; import 'package:terepi_seged/services/ntrip_service.dart'; +import 'package:terepi_seged/services/project_service.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -21,6 +22,7 @@ Future main() async { anonKey: dotenv.env['SUPABASE_ANON_KEY']!); await AppDatabase.instance.database; + Get.put(ProjectService(), permanent: true); await Get.putAsync( () => CoordConverterService().init()); diff --git a/lib/models/project.dart b/lib/models/project.dart index eda9d24..22a06fc 100644 --- a/lib/models/project.dart +++ b/lib/models/project.dart @@ -62,7 +62,7 @@ class Project { 'crs': crs.name, 'color': color, 'status': status.name, - 'isLocalOnly': isLocalOnly, + 'is_local_only': isLocalOnly, if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt!.toIso8601String(), 'created_at': createdAt.toIso8601String(), @@ -78,9 +78,30 @@ class Project { crs: ProjectCrs.values.byName(m['crs'] as String? ?? 'eov'), color: m['color'] as String? ?? '#185FA5', status: ProjectStatus.values.byName(m['status'] as String? ?? 'active'), - isLocalOnly: m['is__local_only'] as bool ?? true, - lastSyncedAt: DateTime.parse(m['last_synced_at'] as String), + isLocalOnly: _readBool(m, 'is_local_only', defaultValue: false), + lastSyncedAt: m['last_synced_at'] == null + ? null + : DateTime.parse(m['last_synced_at'] as String), createdAt: DateTime.parse(m['created_at'] as String), updatedAt: DateTime.parse(m['updated_at'] as String), ); } + +bool _readBool( + Map m, + String key, { + bool defaultValue = false, +}) { + final value = m[key]; + + if (value == null) return defaultValue; + if (value is bool) return value; + if (value is int) return value != 0; + + if (value is String) { + final lower = value.toLowerCase(); + return lower == 'true' || lower == '1'; + } + + return defaultValue; +} diff --git a/lib/services/app_database.dart b/lib/services/app_database.dart index 29df5c2..1124082 100644 --- a/lib/services/app_database.dart +++ b/lib/services/app_database.dart @@ -157,6 +157,8 @@ class AppDatabase { await db.insert('projects', { 'uuid': const Uuid().v4(), 'name': 'Alapértelmezett projekt', + 'is_local_only': 0, + 'status': 'active', 'created_at': now, 'updated_at': now, }); diff --git a/lib/widgets/appbar/shell_map_appbar.dart b/lib/widgets/appbar/shell_map_appbar.dart index 9de0af1..b8803c5 100644 --- a/lib/widgets/appbar/shell_map_appbar.dart +++ b/lib/widgets/appbar/shell_map_appbar.dart @@ -94,7 +94,7 @@ class ShellMapAppBar extends StatelessWidget implements PreferredSizeWidget { // fontFeatures: const [FontFeature.tabularFigures()])) // ]) // ]), - const GnssIconStatusChip(), + // const GnssIconStatusChip(), const SizedBox(width: 2), NtripIconStatusChip( isConnected: NtripService.to.isConnected, diff --git a/lib/widgets/map_mode_menu_anchor.dart b/lib/widgets/map_mode_menu_anchor.dart index 82baf29..f2a6bf3 100644 --- a/lib/widgets/map_mode_menu_anchor.dart +++ b/lib/widgets/map_mode_menu_anchor.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get_state_manager/get_state_manager.dart'; import 'package:terepi_seged/enums/map_survey_mode.dart'; import 'package:terepi_seged/pages/map_survey/presentations/controllers/map_survey_controller.dart'; +import 'package:terepi_seged/services/project_service.dart'; class MapModeMenuAnchor extends StatelessWidget { final MapSurveyController controller; @@ -13,6 +14,7 @@ class MapModeMenuAnchor extends StatelessWidget { final colorScheme = Theme.of(context).colorScheme; return Obx(() { + final p = ProjectService.to.activeProject.value; return MenuAnchor( menuChildren: [ MenuItemButton( @@ -67,18 +69,19 @@ class MapModeMenuAnchor extends StatelessWidget { vertical: 4, ), child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ Row(mainAxisSize: MainAxisSize.min, children: [ - Icon(controller.currentModeIcon, size: 14), - const SizedBox(width: 1), + Icon(controller.currentModeIcon, size: 18), + const SizedBox(width: 6), Text(controller.currentModeLabel, style: const TextStyle( - fontSize: 14, fontWeight: FontWeight.w600)), - const Icon(Icons.arrow_drop_down, size: 18), + fontSize: 18, fontWeight: FontWeight.w600)), + const Icon(Icons.arrow_drop_down, size: 22), ]), - Text('Projekt', + Text(p == null ? 'Projekt' : p.name, style: TextStyle( - fontSize: 11, + fontSize: 12, fontStyle: FontStyle.italic, fontWeight: FontWeight.w400, color: colorScheme.onSurfaceVariant))