cpnav/lib/pages/pass_track/view.dart
2024-09-06 10:34:04 +08:00

271 lines
10 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//字体
import 'package:bottom_picker/resources/arrays.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
import 'package:scence_map/controller.dart';
import 'package:scence_map/scence_map.dart';
import 'package:syncfusion_flutter_sliders/sliders.dart';
import 'iconContainer.dart';
import "controller.dart";
import "package:pass_track/pass_track.dart";
import "package:pass_track/pass_track_platform_interface.dart";
import "controller.dart";
import "dart:ffi" as ffi;
// import '../login_in/connect/bluetooth_page.dart';
// import '../login_in/connect/config.dart';
// import '../login_in/connect/connect_type.dart';
// import '../login_in/getx/blue_tooth.dart';
// import '../setting/antenna_setting.dart';
// import '../setting/person_details.dart';
// import '../setting/wifi_page.dart';
// import '../setting/xy_change.dart';
ScenceMapController mapcontroller = Get.put(ScenceMapController());
class PassTrackWidget extends StatefulWidget {
final String date;
final controller;
const PassTrackWidget({super.key, required this.date, this.controller});
@override
State<PassTrackWidget> createState() => _PasstrackState();
}
class _PasstrackState extends State<PassTrackWidget> {
final GlobalKey<PopupMenuButtonState<int>> _popupMenuKey =
GlobalKey<PopupMenuButtonState<int>>();
String str = "播放";
int sWidth = 0;
int bits = -1;
int speed = 50;
List<int> speedList = [1, 2, 10, 20, 50, 100, 200, 500];
// int maxLength = 200;
SfRangeValues _rangevalues = const SfRangeValues(0.0, 200.0);
final _passTrackPlugin = PassTrack();
final controller = Get.put(PassTrackController("WXLMB", "cp_orad"));
@override
initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback((_) async {
// sWidth = sqrt(screen.width * screen.width + screen.height * screen.height)
// .ceil();
// // scenceMapController.scale = passTrackPlugin.passTrack_getScale() * 1.0;
// fileHandle.date = widget.date;
// await fileHandle.init();
// //在帧绘制完成后执行数据渲染
// // await initPlatformState();
// if (fileHandle.pointData.isNotEmpty) {
// DecodeDataObj obj = fileHandle.pointData[0].obj!;
// scenceMapController.centerXY = Offset(obj.y / 20, obj.x / 20);
// }
// for (var item in fileHandle.deviceList) {
// if (item["point"] != null) {
// bits = item["bits"];
// break;
// }
// }
// // passTrackPlugin.map_setCenterDevice(bits);
// setState(() {
// if (fileHandle.pointData.isNotEmpty) {
// maxLength = fileHandle.pointData.length;
// // _value = maxLength;
// _rangevalues = SfRangeValues(0.0, maxLength.toDouble());
// }
// });
});
initPlatformState();
controller.getHisFileList(_passTrackPlugin);
if (controller.allLen <= 0) {
return;
}
_passTrackPlugin.generateTile(0, controller.allLen);
_passTrackPlugin.waitForTile();
_passTrackPlugin.playTrack(0, controller.allLen, true, 0, ffi.nullptr);
}
Future<void> initPlatformState() async {
String platformVersion;
try {
platformVersion = await _passTrackPlugin.getPlatformVersion() ??
'Unknown platform version';
} on Exception {
platformVersion = 'Failed to get platform version.';
}
await _passTrackPlugin.create(sWidth, sWidth);
fileHandle.textureId = await _passTrackPlugin.getTextureId() ?? -1;
print("textureId: ${fileHandle.textureId}");
if (!mounted) return;
setState(() {
platformVersion = platformVersion;
});
}
@override
Widget build(BuildContext context) {
final size = MediaQuery.of(context).size;
var isPortrait = MediaQuery.of(context).orientation == Orientation.portrait;
return OrientationBuilder(builder: (context, orientation) {
return Stack(
children: [
ScenceMapView(
children: [],
onUpdate: (Offset center, double scale, double rotation) {
print("center:$center scale:$scale rotation:$rotation");
},
),
Positioned(
width: isPortrait ? size.width * .63 : size.width * .41,
left: isPortrait ? 190 : 200,
bottom: 30,
child: Container(
padding: const EdgeInsets.only(bottom: 5),
child: SfRangeSlider(
min: 0.0,
// max: maxLength,
max: controller.allLen,
values: _rangevalues,
showTicks: false,
showLabels: false,
enableTooltip: true,
minorTicksPerInterval: 1,
stepSize: 1,
onChanged: (SfRangeValues values) {
setState(() {
_rangevalues = SfRangeValues(values.start.roundToDouble(),
values.end.roundToDouble());
});
},
),
),
),
Positioned(
left: isPortrait ? 190 : 200,
bottom: 0,
child: Row(
children: [
const SizedBox(width: 18),
SizedBox(
width: 74,
child: ElevatedButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all<Color?>(
str == "播放" ? Colors.blue : Colors.red,
),
),
onPressed: () {
setState(() {
str = str == "播放" ? "暂停" : "播放";
});
},
child: Text(
str,
style: const TextStyle(fontSize: 12, color: Colors.black),
),
),
),
const SizedBox(width: 5),
GestureDetector(
onTap: () {
// 触发 PopupMenuButton 的点击事件
final dynamic state = _popupMenuKey.currentState;
state.showButtonMenu();
},
child: Container(
width: 70,
height: 35,
padding: const EdgeInsets.symmetric(horizontal: 6.0),
decoration: BoxDecoration(
color: const Color.fromARGB(255, 255, 255, 255),
border: Border.all(color: Colors.black),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
"$speed X",
style: const TextStyle(
fontSize: 11, color: Colors.black),
),
Container(
width: 25,
child: PopupMenuButton<int>(
key: _popupMenuKey,
padding: const EdgeInsets.all(1.0),
icon: const Icon(Icons.arrow_drop_up,
color: Color.fromARGB(255, 47, 48, 47)),
onSelected: (int value) {
setState(() {
speed = value;
});
},
// style: ButtonStyle(
// minimumSize: MaterialStateProperty.all<Size>(
// Size(48, 48)), // 设置最小点击区域
// tapTargetSize: MaterialTapTargetSize
// .shrinkWrap, // 设置点击区域大小
// ),
itemBuilder: (BuildContext context) {
return speedList.map((int speed) {
return PopupMenuItem<int>(
height: 30,
value: speed,
child: Text("$speed X速度"),
);
}).toList();
},
),
),
],
)),
),
const SizedBox(width: 12),
Column(
children: [
const Text("此处遍数0"),
StreamBuilder<DateTime>(
stream: Stream.periodic(
const Duration(seconds: 1), (_) => DateTime.now()),
builder: (context, snapshot) {
if (snapshot.hasData) {
final dateTime = snapshot.data!.toLocal();
final formattedDate =
"${dateTime.year % 100}-${dateTime.month.toString().padLeft(2, '0')}-${dateTime.day.toString().padLeft(2, '0')}";
final formattedTime =
"${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')}:${dateTime.second.toString().padLeft(2, '0')}";
return Text(
"$formattedDate $formattedTime",
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
);
} else {
return const Text(
"加载中...",
style: TextStyle(
fontSize: 16, fontWeight: FontWeight.bold),
);
}
},
),
],
)
],
),
),
IconContainer()
],
);
});
}
}