refactor(tactical-app): modernize state management with GetX controllers, bindings, and clean MVP architecture
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intaleq_maps/intaleq_maps.dart';
|
||||
import '../models/military_operations_models.dart';
|
||||
import '../services/minefield_engine.dart';
|
||||
|
||||
/// ============================================================================
|
||||
/// [MinefieldController] - وحدة التحكم بحقول الألغام وممرات الثغرات
|
||||
/// ============================================================================
|
||||
/// English:
|
||||
/// GetX Controller managing minefield zone geometry, barrier types, threat
|
||||
/// envelope generation, mine density estimation, and safe breaching corridor calculations.
|
||||
///
|
||||
/// العربية:
|
||||
/// متحكم GetX لإدارة هندسة حقول الألغام والموانع، تصنيف نوع الألغام،
|
||||
/// حساب الكثافة التقديرية، وتخطيط ممرات الثغرات الآمنة (Breaching Lanes).
|
||||
/// ============================================================================
|
||||
class MinefieldController extends GetxController {
|
||||
// ── Observables / الحالات التفاعلية ──────────────────────────────────────
|
||||
final Rx<LatLng?> startPoint = Rx<LatLng?>(null);
|
||||
final Rx<LatLng?> endPoint = Rx<LatLng?>(null);
|
||||
final Rx<MinefieldType> minefieldType =
|
||||
Rx<MinefieldType>(MinefieldType.antiTank);
|
||||
final RxDouble widthMeters = 200.0.obs;
|
||||
final Rx<MinefieldZoneResult?> zoneResult = Rx<MinefieldZoneResult?>(null);
|
||||
|
||||
/// Set Minefield Start Point (A) / تعيين بداية حقل الألغام
|
||||
void setStartPoint(LatLng pos) {
|
||||
startPoint.value = pos;
|
||||
calculateZone();
|
||||
}
|
||||
|
||||
/// Set Minefield End Point (B) / تعيين نهاية حقل الألغام
|
||||
void setEndPoint(LatLng pos) {
|
||||
endPoint.value = pos;
|
||||
calculateZone();
|
||||
}
|
||||
|
||||
/// Swap Start and End Points / تبديل نقاط بداية ونهاية الحقل
|
||||
void swapPoints() {
|
||||
final temp = startPoint.value;
|
||||
startPoint.value = endPoint.value;
|
||||
endPoint.value = temp;
|
||||
calculateZone();
|
||||
}
|
||||
|
||||
/// Select Minefield Type / تحديد نوع المانع (ضد دروع / ضد أفراد / مركب)
|
||||
void setType(MinefieldType type) {
|
||||
minefieldType.value = type;
|
||||
calculateZone();
|
||||
}
|
||||
|
||||
/// Set Frontage Depth / تحديد عمق الحقل بالمتر
|
||||
void setWidth(double width) {
|
||||
widthMeters.value = width;
|
||||
calculateZone();
|
||||
}
|
||||
|
||||
/// Calculate Minefield Threat Box & Breaching Corridor / حساب منطقة الخطر وممر الثغرة
|
||||
void calculateZone() {
|
||||
if (startPoint.value == null || endPoint.value == null) {
|
||||
zoneResult.value = null;
|
||||
return;
|
||||
}
|
||||
|
||||
final res = MinefieldEngine.calculateMinefieldZone(
|
||||
startPoint: startPoint.value!,
|
||||
endPoint: endPoint.value!,
|
||||
type: minefieldType.value,
|
||||
widthMeters: widthMeters.value,
|
||||
);
|
||||
|
||||
zoneResult.value = res;
|
||||
}
|
||||
|
||||
/// Reset minefield state / إعادة ضبط حقل الألغام
|
||||
void reset() {
|
||||
startPoint.value = null;
|
||||
endPoint.value = null;
|
||||
zoneResult.value = null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user