field_control.dart 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. import 'package:application/widget.dart';
  2. import 'package:common_pub/ui/map_view/map_view.dart';
  3. import 'package:common_pub/ui/map_view/view_map_image.dart';
  4. import 'package:common_pub/ui/map_view/view_map_touch.dart';
  5. import 'package:common_pub/ui/map_view/view_map_user_point.dart';
  6. import 'package:common_pub/ui/map_view/view_plug_loading.dart';
  7. import 'package:common_pub/utils.dart';
  8. import 'field_control_controller.dart';
  9. class FieldControlPage extends StatelessWidget{
  10. const FieldControlPage({super.key});
  11. @override
  12. Widget build(BuildContext context) {
  13. return GetBuilder(
  14. init: FieldControlController(),
  15. builder: (c){
  16. return Container(
  17. height: double.infinity,
  18. width: double.infinity,
  19. color: const Color(0xffc9c0c0),
  20. alignment: Alignment.center,
  21. child: Obx((){
  22. final mapWatch = c.mapWatch;
  23. return mapWatch != null? content(context, mapWatch, c): noData();
  24. }));
  25. });
  26. }
  27. Widget noData(){
  28. return Center(
  29. child: Column(
  30. mainAxisSize: MainAxisSize.min,
  31. children: [
  32. Image.asset(Assets.imagesIcNoData, height: 64),
  33. const SizedBox(height: 25),
  34. const Text('没有数据, 请选择地图',
  35. style: TextStyle(color: Color(0xff707070), fontSize: 18.5)),
  36. ],
  37. ),
  38. );
  39. }
  40. Widget content(BuildContext context, MapWatchService map, FieldControlController c){
  41. return Row(
  42. children: [
  43. Expanded(child: Column(
  44. children: [
  45. Expanded(child: ViewMapStack(plug: map.plugMap, children: [
  46. ViewPlugLoading(map.plugMap),
  47. ViewMapImage(map.plugMap),
  48. _ViewTrace(map: map),
  49. ViewMapTouch(map.plugMap)
  50. ])),
  51. _MsgView(),
  52. ],
  53. )),
  54. _ActiveInfoView()
  55. ],
  56. );
  57. }
  58. }
  59. class _ViewTrace extends GetView<FieldControlController>{
  60. const _ViewTrace({required this.map});
  61. final MapWatchService map;
  62. @override
  63. Widget build(BuildContext context) {
  64. return Obx((){
  65. final children = <Widget>[];
  66. for(final act in map.activeList){
  67. for(final user in act.userList){
  68. if(user.isHide.value){
  69. continue;
  70. }
  71. final trace = user.trace.lastOrNull;
  72. if(trace != null){
  73. children.add(ViewMapUserPoint(map.plugMap, trace, info: user.name, color: user.flag.value.color));
  74. }
  75. }
  76. }
  77. return Stack(
  78. alignment: Alignment.topLeft,
  79. children: children
  80. );
  81. });
  82. }
  83. }
  84. class _ActiveInfoView extends GetView<FieldControlController>{
  85. @override
  86. Widget build(BuildContext context) {
  87. return Obx(() => Container(
  88. width: 370,
  89. height: double.infinity,
  90. color: Colors.white,
  91. child: ListView(
  92. children: controller.activeList.map((element) => activeView(element)).toList(),
  93. ),
  94. )) ;
  95. }
  96. Widget activeView(ActiveInfo info){
  97. final children = <Widget>[
  98. Row(children: [
  99. Text('${info.name} (${info.userList.length}人)'),
  100. const Spacer(),
  101. IconButton(onPressed: (){
  102. info.isHide.value=!info.isHide.value;
  103. }, icon: info.isHide.value?const Icon(Icons.arrow_drop_down):const Icon(Icons.arrow_drop_up))
  104. ]),
  105. ];
  106. if(!info.isHide.value){
  107. children.addAll([
  108. Container(
  109. decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(5)),
  110. padding: const EdgeInsets.fromLTRB(26, 11, 26, 11),
  111. child: Row(
  112. children: [
  113. Text('广播'),
  114. const Spacer(),
  115. Image.asset(Assets.imagesIcCp, height: 20, width: 20),
  116. Text(' ${info.cpAllCount}'),
  117. const Spacer(),
  118. Text('全部隐藏'),
  119. ],
  120. ),
  121. )
  122. ]);
  123. children.addAll(info.userList.map((e) => _UserInfoView(data: e)).toList());
  124. }
  125. return Container(
  126. decoration: BoxDecoration(color: const Color(0xffe0e0e0), borderRadius: BorderRadius.circular(5)),
  127. margin: const EdgeInsets.fromLTRB(9, 12, 9, 12),
  128. padding: const EdgeInsets.all(9),
  129. child: Column(
  130. children: children,
  131. ),
  132. );
  133. }
  134. }
  135. class _UserInfoView extends GetView<FieldControlController>{
  136. const _UserInfoView({required this.data});
  137. final UserInfo data;
  138. @override
  139. Widget build(BuildContext context) {
  140. return Container(
  141. decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(5)),
  142. padding: const EdgeInsets.fromLTRB(7, 11, 7, 11),
  143. margin: const EdgeInsets.only(top: 5),
  144. child: Row(
  145. crossAxisAlignment: CrossAxisAlignment.start,
  146. children: [
  147. Obx(() => Container(
  148. margin: const EdgeInsets.only(top: 2),
  149. decoration: BoxDecoration(color: data.flag.value.color, borderRadius: BorderRadius.circular(4)),
  150. width: 7, height: 16)),
  151. const SizedBox(width: 8,),
  152. Expanded(child: Column(
  153. crossAxisAlignment: CrossAxisAlignment.start,
  154. children: [
  155. Text.rich(TextSpan(text: data.name, children: [
  156. TextSpan(text: ' [${data.routeName}]')
  157. ])),
  158. const SizedBox(height: 5),
  159. Row(
  160. children: [
  161. container(null, cpInfo, Colors.blue),
  162. container(const Icon(Icons.favorite, size: 13, color: Colors.white,), ' ${hr==0?'--':hr}', 0.toHRPColor()),
  163. container(null, paceInfo, Colors.blue)
  164. ],
  165. ),
  166. const SizedBox(height: 5),
  167. Row(
  168. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  169. children: [
  170. Text('距离 ${data.nextDistance.toString()}'),
  171. Text('时间 ${data.duration.toAppString()}'),
  172. Text('里程 ${data.distance.toString()}'),
  173. ],
  174. )
  175. ],
  176. )),
  177. GestureDetector(
  178. onTap: (){
  179. data.isHide.value=!data.isHide.value;
  180. },
  181. child: Obx(()=> Icon(
  182. data.isHide.value?
  183. Icons.visibility_off
  184. :Icons.visibility,
  185. color: data.isHide.value? Colors.grey: const Color(0xffffbb77),)) ,
  186. )
  187. ],
  188. ),
  189. );
  190. }
  191. int get hr{
  192. return data.gameInfo.hrInfo.hrInfo.lastOrNull?.hr??0;
  193. }
  194. String get cpInfo{
  195. final next = data.nextWant;
  196. return '${data.gameInfo.gameSaveInfo.nextControlPoint.orderNo}号点(${next?.sn})';
  197. }
  198. String get paceInfo{
  199. Duration;
  200. return data.pace.toString();
  201. }
  202. Widget container(Widget? icon, String text, Color color){
  203. final children = <Widget>[];
  204. if(icon!= null){
  205. children.add(icon);
  206. }
  207. children.add(Text(text, style: const TextStyle(color: Colors.white, fontSize: 14)));
  208. return Container(
  209. height: 18,
  210. padding: const EdgeInsets.fromLTRB(12, 0, 12, 0),
  211. margin: const EdgeInsets.only(right: 10),
  212. alignment: Alignment.center,
  213. decoration: BoxDecoration(color: color, borderRadius: BorderRadius.circular(9)),
  214. child: Row(
  215. children: children,
  216. ),
  217. );
  218. }
  219. }
  220. class _MsgView extends GetView<FieldControlController>{
  221. @override
  222. Widget build(BuildContext context) {
  223. return Container();
  224. }
  225. }