cpnav/lib/pages/pass_track/view.dart
tanlinxing 680afe5b41 12345
2024-09-10 16:01:04 +08:00

313 lines
12 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 'bottomIcon/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 PassTrackView extends GetView<PassTrackController> {
final GlobalKey<PopupMenuButtonState<int>> _popupMenuKey =
GlobalKey<PopupMenuButtonState<int>>();
// final controller = Get.put(PassTrackController("WXLMB", "cp_road"));
final String str = "播放";
// int sWidth = 800;
// int sHeight = 800;
// int bits = -1;
// int speed = 50;
// int maxLength = 200;
// late SfRangeValues _rangevalues;
final PassTrack _passTrackPlugin = PassTrack();
PassTrackView({Key? key}) : super(key: key);
// @override
// initState() {
// super.initState();
// var maxLen =
// controller.allLen > 0 ? controller.allLen : 1.0; // 确保 maxLen 大于 0
// _rangevalues = SfRangeValues(0.0, maxLen);
// 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());
// }
// });
// });
// var f = initPlatformState();
// var future = controller.getHisFileList(_passTrackPlugin);
// f.then((void _) {
// _passTrackPlugin.setGridColor(const Color.fromARGB(255, 0, 0, 0).value);
// _passTrackPlugin.drawGrid();
// future.then((value) {
// _passTrackPlugin.setScale(1);
// for (var TID in controller.deviceMap.keys) {
// _passTrackPlugin.addDevice(int.parse(TID), 0);
// }
// for (var item in controller.coorTransMap.entries) {
// print("tid:${item.key} value:${item.value}");
// }
// // 统计用时 获取当前时间
// var start = DateTime.now().millisecondsSinceEpoch;
// // _passTrackPlugin.generateTile(0, value);
// _passTrackPlugin.waitForTile(() {
// var start = DateTime.now().millisecondsSinceEpoch;
// print("len: ${_passTrackPlugin.allTileCnt()}");
// _rangevalues = SfRangeValues(0, _passTrackPlugin.allTileCnt());
// _passTrackPlugin.playTrack(
// 0, _passTrackPlugin.allTileCnt(), true, 0, ffi.nullptr);
// var end = DateTime.now().millisecondsSinceEpoch;
// print("play: ${end - start}");
// });
// // _passTrackPlugin.drawGrid();
// // 获取当前时间
// });
// });
// }
// 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(
// mapcontroller.height.toInt(), mapcontroller.width.toInt());
// fileHandle.textureId = await _passTrackPlugin.getTextureId() ?? -1;
// print("textureId: ${fileHandle.textureId}");
// if (!mounted) Exception('Failed to get textureId.');
// setState(() {
// platformVersion = platformVersion;
// });
// return;
// }
@override
Widget build(BuildContext context) {
final size = MediaQuery.of(context).size;
var isPortrait = MediaQuery.of(context).orientation == Orientation.portrait;
var controller = this.controller;
return OrientationBuilder(builder: (context, orientation) {
return Stack(
children: [
ScenceMapView(
children: [
Positioned(
top: mapcontroller.top,
left: mapcontroller.left,
child: SizedBox(
width: mapcontroller.width,
height: mapcontroller.height,
// child: Text('Running on: $_platformVersion\n'),
child: Texture(textureId: fileHandle.textureId))),
],
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: Obx(
() => SfRangeSlider(
min: 0.0,
// max: maxLength,
max: controller.tileCount.value > 0
? controller.tileCount.value
: 1.0, // 确保 max 大于 0
values: SfRangeValues(
controller.tileFirst.value, controller.tileLast.value),
showTicks: false,
showLabels: false,
enableTooltip: true,
minorTicksPerInterval: 1,
stepSize: 1,
onChanged: (SfRangeValues values) {
controller.tileFirst.value = values.start.toInt();
controller.tileLast.value = values.end.toInt();
},
),
),
),
),
Positioned(
left: isPortrait ? 190 : 200,
bottom: 0,
child: Row(
children: [
const SizedBox(width: 18),
SizedBox(
width: 74,
child: ElevatedButton(
style: ButtonStyle(
backgroundColor: WidgetStateProperty.all<Color?>(
str == "播放" ? Colors.blue : Colors.red,
),
),
onPressed: () {
if (str == "播放") {
_passTrackPlugin.playTrack(
0, 10000, true, 50, ffi.nullptr);
} else {
_passTrackPlugin.playPause();
}
// 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: [
Obx(
() => Text(
"${controller.speed.value} X",
style: const TextStyle(
fontSize: 11, color: Colors.black),
),
),
SizedBox(
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) {
controller.speed.value = 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: Obx(() =>
Text("${controller.speed.value} 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()
],
);
});
}
}