Felvételek képének megjelenítése a Mérés menüpontbam
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s

This commit is contained in:
2026-09-09 02:05:10 +02:00
parent c335b76d8b
commit e801090e90
7 changed files with 364 additions and 134 deletions
@@ -1,56 +1,113 @@
import 'dart:async';
import 'dart:typed_data';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:terepi_seged/models/seismic_records.dart';
import 'package:terepi_seged/models/measured_record.dart';
import 'package:terepi_seged/pages/measured_data/presentation/views/seismogram_viewer_dialog.dart';
import 'package:terepi_seged/services/measured_data_service.dart';
import 'package:terepi_seged/services/project_service.dart';
class MeasuredDataController extends GetxController {
final CollectionReference _seismicRecords =
FirebaseFirestore.instance.collection('seismicRecords');
static MeasuredDataController get to => Get.find();
// late Query<Map<String, dynamic>> records = _seismicRecords.orderBy('field');
late Stream<QuerySnapshot> seismicRecordSnapshot;
final records = <MeasuredRecord>[].obs;
final isLoading = true.obs;
final searchText = ''.obs;
final lineFilter = Rxn<double>();
@override
void onReady() async {
super.onReady();
}
StreamSubscription<List<MeasuredRecord>>? _sub;
@override
void onInit() {
super.onInit();
_subscribe();
ever(ProjectService.to.activeProject, (_) => _subscribe());
}
seismicRecordSnapshot = _seismicRecords
// .orderBy('sourcePoint', descending: true)
.where('gpsDateTime', isGreaterThan: DateTime(2024, 2, 25, 0, 0, 0))
.orderBy('gpsDateTime', descending: true)
.snapshots();
void _subscribe() {
_sub?.cancel();
lineFilter.value = null;
final projectId = ProjectService.to.activeProject.value?.uuid;
if (projectId == null) {
records.clear();
isLoading.value = false;
return;
}
isLoading.value = true;
_sub = MeasuredDataService.to.watchRecords(projectId).listen(
(data) {
records.value = data;
isLoading.value = false;
},
onError: (e) {
isLoading.value = false;
Get.snackbar('Hiba', 'Nem sikerült betölteni a mérési adatokat: $e',
snackPosition: SnackPosition.BOTTOM);
},
);
}
// ── Keresés/szűrés — a már memóriában lévő, élő listán, nem újabb
// lekérdezéssel (a teljes projekt-adat úgyis a stream-ben van). ──
List<MeasuredRecord> get filteredRecords {
var list = records.toList();
if (lineFilter.value != null) {
list = list.where((r) => r.sourceLineNumber == lineFilter.value).toList();
}
final q = searchText.value.trim();
if (q.isNotEmpty) {
list = list.where((r) {
return (r.ffid?.toString().contains(q) ?? false) ||
(r.sourcePointNumber?.toString().contains(q) ?? false) ||
(r.sourceLineNumber?.toString().contains(q) ?? false);
}).toList();
}
return list;
}
List<double> get availableLines {
final set =
records.map((r) => r.sourceLineNumber).whereType<double>().toSet();
final list = set.toList()..sort();
return list;
}
void onSearchChanged(String v) => searchText.value = v;
void setLineFilter(double? v) => lineFilter.value = v;
// ── Kép megtekintése ─────────────────────────────────────────────
Future<void> showSeismicImage(MeasuredRecord record) async {
if (!record.hasImage) {
Get.snackbar('Nincs kép', 'Ehhez a felvételhez nincs rögzített kép.',
snackPosition: SnackPosition.BOTTOM);
return;
}
Get.dialog(const Center(child: CircularProgressIndicator()),
barrierDismissible: false);
try {
final Uint8List? bytes = await MeasuredDataService.to.loadImage(record);
Get.back(); // töltő-dialógus bezárása
if (bytes == null) {
Get.snackbar('Hiba', 'A kép nem tölthető be.',
snackPosition: SnackPosition.BOTTOM);
return;
}
Get.to(() => SeismogramViewerDialog(record: record, image: bytes),
transition: Transition.downToUp);
} catch (e) {
Get.back();
Get.snackbar('Hiba', 'Kép letöltése sikertelen: $e',
snackPosition: SnackPosition.BOTTOM);
}
}
@override
void onClose() async {
void onClose() {
_sub?.cancel();
super.onClose();
// seismicRecordSnapshot.
}
void showSeismicImage(int ffid) async {
late Uint8List image;
Reference reference =
FirebaseStorage.instance.ref().child('bp-4/${ffid}.jpg');
await reference
.getData()
.then((value) => {image = value!})
.catchError((error) => {});
Get.to(
() => SeismogramViewerDialog(
imageUrl: '',
image: image,
),
transition: Transition.downToUp);
}
}