| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- import 'package:flutter/material.dart';
- import 'package:get/get.dart';
- import 'package:trackoffical_app/generated/assets.dart';
- import 'package:trackoffical_app/service/game/game.dart';
- import 'package:trackoffical_app/service/game/game_model.dart';
- import 'package:trackoffical_app/view/game_settings.dart';
- import 'package:trackoffical_app/view/ingame/route_planning.dart';
- import 'utils.dart';
- import 'button_punch.dart';
- import 'info_view.dart';
- import 'settings_view.dart';
- import 'package:trackoffical_app/widget/compass2.dart';
- import '../../styles/theme.dart';
- import 'in_game_controller.dart';
- class MButtonBar extends StatefulWidget {
- const MButtonBar({
- super.key,
- required this.isShowCheckCPButton,
- required this.isCheckCPButtonEnable,
- });
- final bool isShowCheckCPButton;
- final bool isCheckCPButtonEnable;
- @override
- State<StatefulWidget> createState() {
- return ButtonBarState();
- }
- }
- enum _ExpandState {
- hide,
- middle,
- all,
- }
- class ButtonBarState extends State<MButtonBar> {
- var state = _ExpandState.middle;
- final controller = Get.find<InGameController>();
- final service = GameService.to;
- final model = Get.find<GameModel>();
- @override
- void initState() {
- super.initState();
- }
- void onButtonMore() {
- setState(() {
- var i = state.index + 1;
- if (i >= _ExpandState.values.length) {
- i = 0;
- }
- state = _ExpandState.values[i];
- });
- }
- void onLockScreenCenterToMyPosition() {
- setState(() {
- if (!model.isLockScreenCenterToMyPositionSystem) {
- service.showLocation();
- }
- model.isLockScreenCenterToMyPosition.value =
- !model.isLockScreenCenterToMyPosition.value;
- });
- }
- void onRotateAt() {
- setState(() {
- controller.isMapRotateAtCompassCenter.value =
- !controller.isMapRotateAtCompassCenter.value;
- });
- controller.flushRotateCenter();
- }
- void btnMore(List<Widget> col) {
- var moreSrc = 'assets/images/btn_more1.png';
- if (state == _ExpandState.middle) {
- moreSrc = 'assets/images/btn_more2.png';
- }
- if (state == _ExpandState.all) {
- moreSrc = 'assets/images/btn_more3.png';
- }
- col.add(_Button(icon: Image.asset(moreSrc), onPressed: onButtonMore));
- }
- // 屏幕移至站立点
- void btnMyLocation(List<Widget> col) {
- col.add(_Button(
- icon: Image.asset('assets/images/btn_location.png'),
- disableSrc: 'assets/images/btn_location_disable.png',
- onPressed: model.isEnableUserLocation ? service.showLocation : null));
- }
- // 跳点
- void btnSkipCp(List<Widget> col) {
- // if (model.isAllowedPassCP) {
- if (true) {
- col.add(_Button(
- icon: Image.asset('assets/images/btn_skip_cp.png'),
- disableSrc: Assets.imagesBtnSkipCpDisable,
- ));
- }
- }
- // 路线规划
- void btnPathPlanning(List<Widget> col) {
- // if (model.isAllowedPassCP) {
- if (true) {
- col.add(Obx(() => _Button(
- icon: Image.asset('assets/images/btn_path_planning.png'),
- disableSrc: Assets.imagesBtnPathPlanningDisable,
- onPressed:
- model.startAt != null ? () => dialogRoutePlanning() : null,
- )));
- }
- }
- // 地图旋转中心
- void btnMapRotateCenter(List<Widget> col) {
- var rotateSrc = 'assets/images/btn_rotate_at1.png';
- if (controller.isMapRotateAtCompassCenter.value) {
- rotateSrc = 'assets/images/btn_rotate_at2.png';
- }
- col.add(_Button(icon: Image.asset(rotateSrc), onPressed: onRotateAt));
- }
- // 锁定旋转中心
- void btnLockRotateCenter(List<Widget> col) {
- if (model.isAlwaysShowMyLocation) {
- var src = 'assets/images/btn_unlock.png';
- if (model.isLockScreenCenterToMyPosition.value) {
- src = 'assets/images/btn_locked.png';
- }
- col.add(_Button(
- icon: Image.asset(src),
- disableSrc: 'assets/images/btn_unlock_disable.png',
- onPressed: model.isEnableUserLocation
- ? onLockScreenCenterToMyPosition
- : null));
- }
- }
- onMapModeSwitch() {
- service.mapStatus.mapModeSwitch();
- service.showNextPoint();
- }
- @override
- Widget build(BuildContext context) {
- final col1 = <Widget>[];
- btnMore(col1);
- if (state == _ExpandState.middle || state == _ExpandState.all) {
- // 标定地图方式
- col1.add(_Button(
- icon: Image.asset('assets/images/btn_map_rotate.png'),
- onPressed: onMapModeSwitch));
- btnMyLocation(col1);
- btnLockRotateCenter(col1);
- col1.addAll([
- // 行动轨迹
- _Button(
- icon: Image.asset('assets/images/btn_trajectory.png'),
- disableSrc: 'assets/images/btn_trajectory_disable.png',
- onPressed: model.isEnableUserLocation
- ? () => setState(() {
- model.isShowTrajectory.value =
- !model.isShowTrajectory.value;
- })
- : null,
- isSelected: model.isShowTrajectory.value),
- // 亮度
- _Button(
- icon: Image.asset('assets/images/btn_brightness.png'),
- onPressed: _onBrightness,
- isSelected: controller.isBrightnessMax,
- ),
- ]);
- }
- final col2 = <Widget>[];
- final col3 = <Widget>[];
- if (state == _ExpandState.all) {
- col2.addAll([
- // 指北针大小
- _Button(
- icon: Image.asset('assets/images/btn_compass_size.png'),
- onPressed: controller.onSwitchCompassSize),
- // 指北针显示
- _Button(
- icon: Image.asset('assets/images/btn_compass.png'),
- onPressed: () => setState(() {
- controller.showCompassSwitch();
- }),
- isSelected: service.isShowCompass.value,
- ),
- // 指南针样式
- _Button(
- icon: Image.asset('assets/images/btn_compass_level.png'),
- onPressed: onClickCompassLevel),
- // 是否显示下一点方向
- _Button(
- icon: Image.asset('assets/images/btn_next_cp.png'),
- onPressed: () => setState(() {
- controller.isShowNextCPRadians.value =
- !controller.isShowNextCPRadians.value;
- }),
- isSelected: controller.isShowNextCPRadians.value,
- ),
- ]);
- btnSkipCp(col2);
- col2.add(_Button(
- icon: Image.asset('assets/images/btn_past_cp.png'),
- onPressed: (){}
- // showCheckedPoints
- ));
- col3.addAll([
- // 图例
- _Button(
- icon: Image.asset('assets/images/btn_info.png'),
- onPressed: _showInfo),
- // 设置
- _Button(
- icon: Image.asset('assets/images/btn_settings.png'),
- onPressed: _toSettings),
- // 显示标尺
- _Button(
- icon: Image.asset('assets/images/btn_ruler.png'),
- onPressed: () => setState(() {
- controller.isShowRuler.value = !controller.isShowRuler.value;
- }),
- isSelected: controller.isShowRuler.value,
- ),
- ]);
- btnMapRotateCenter(col3);
- btnPathPlanning(col3);
- // 退赛
- col3.add(_Button(
- icon: Image.asset('assets/images/btn_exit.png'),
- onPressed: () => onButtonExit(controller)));
- }
- final children = <Widget>[
- Row(
- children: [
- Column(
- children: col1,
- ),
- const Spacer(),
- Column(children: col2),
- Column(children: col3)
- ],
- ),
- ];
- if (widget.isShowCheckCPButton) {
- final color = widget.isCheckCPButtonEnable ? Colors.black : Colors.grey;
- children.addAll([
- const Spacer(),
- Row(
- children: [
- const Spacer(),
- ButtonPunch(
- onPressed: widget.isCheckCPButtonEnable
- ? controller.onCheckControlPoint
- : null,
- isWarn: controller.isCheckCPButtonWarn,
- ),
- ],
- ),
- const SizedBox(height: 12),
- ]);
- }
- return Padding(
- padding: const EdgeInsets.only(left: 12, right: 12),
- child: Column(
- children: children,
- ));
- }
- void _onBrightness() async {
- await controller.setIsBrightnessMax(!controller.isBrightnessMax);
- setState(() {});
- }
- Future<void> _toSettings() async {
- await controller.toSettings();
- setState(() {});
- }
- void _showInfo() {
- Get.to(() => InfoView());
- }
- void onClickCompassLevel() {
- var l = controller.compassLevel.value;
- l++;
- if (l > Compass2.levelMax) {
- l = Compass2.levelMin;
- }
- controller.compassLevel.value = l;
- }
- }
- class _Button extends StatelessWidget {
- const _Button({
- required this.icon,
- this.onPressed,
- this.isSelected = false,
- this.disableSrc,
- });
- final bool isSelected;
- final Widget icon;
- final VoidCallback? onPressed;
- final String? disableSrc;
- @override
- Widget build(BuildContext context) {
- const s = 46.0;
- final children = <Widget>[
- SizedBox(
- width: s,
- height: s,
- child: onPressed != null ? icon : Image.asset(disableSrc!))
- ];
- if (isSelected && onPressed != null) {
- children.add(Image.asset(
- 'assets/images/btn_boader.png',
- width: s,
- height: s,
- ));
- }
- return GestureDetector(
- onTap: onPressed,
- child: Stack(
- children: children,
- ),
- );
- }
- }
- void main() async {
- runApp(GetMaterialApp(
- theme: appThemeData(),
- home: const Scaffold(
- body: MButtonBar(
- isShowCheckCPButton: true,
- isCheckCPButtonEnable: true,
- ),
- )));
- }
|