mobile_top_menu.dart 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. import 'package:fis_i18n/i18n.dart';
  2. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  3. import 'package:fis_measure/interfaces/process/workspace/mobile_measure_view_state_controller.dart';
  4. import 'package:fis_measure/process/workspace/measure_data_controller.dart';
  5. import 'package:fis_measure/process/workspace/measure_handler.dart';
  6. import 'package:fis_measure/utils/prompt_box.dart';
  7. import 'package:fis_measure/view/button_group/widget/qr_code_with_logo.dart';
  8. import 'package:fis_measure/view/mobile_view/controller/mobile_measure_view_state_controller.dart';
  9. import 'package:fis_measure/view/mobile_view/widgets/animated_icon_btn.dart';
  10. import 'package:fis_measure/view/mobile_view/widgets/icon_btn.dart';
  11. import 'package:flutter/material.dart';
  12. import 'package:get/get.dart';
  13. class MobileTopMenu extends StatefulWidget {
  14. final VoidCallback capturePng;
  15. const MobileTopMenu({
  16. Key? key,
  17. required this.capturePng,
  18. }) : super(key: key);
  19. @override
  20. State<StatefulWidget> createState() => _MobileTopMenuState();
  21. }
  22. class _MobileTopMenuState extends State<MobileTopMenu> {
  23. final application = Get.find<IApplication>();
  24. final measureHandler = Get.find<IMeasureHandler>();
  25. final measureData = Get.find<MeasureDataController>();
  26. final mobileMeasureStateController =
  27. Get.find<MobileMeasureViewStateController>();
  28. @override
  29. void initState() {
  30. mobileMeasureStateController.onModeChanged.addListener(_onViewModeChanged);
  31. super.initState();
  32. }
  33. @override
  34. void dispose() {
  35. mobileMeasureStateController.onModeChanged
  36. .removeListener(_onViewModeChanged);
  37. super.dispose();
  38. }
  39. MobileMeasureMode curMode = MobileMeasureMode.playerMode;
  40. void _onViewModeChanged(Object s, MobileMeasureMode mode) {
  41. setState(() {
  42. curMode = mode;
  43. });
  44. }
  45. @override
  46. Widget build(BuildContext context) {
  47. return Column(
  48. mainAxisSize: MainAxisSize.max,
  49. mainAxisAlignment: MainAxisAlignment.start,
  50. children: [
  51. SizedBox(
  52. height: 50,
  53. child: Container(
  54. padding: const EdgeInsets.only(left: 10),
  55. child: Row(
  56. mainAxisAlignment: MainAxisAlignment.start,
  57. children: [
  58. ..._buttons(),
  59. ],
  60. ),
  61. ),
  62. ),
  63. ],
  64. );
  65. }
  66. List<Widget> _buttons() {
  67. switch (curMode) {
  68. case MobileMeasureMode.playerMode:
  69. return [
  70. _fillCustomSpace(10),
  71. _backBtn(),
  72. _fillEmptySpace(),
  73. _saveBtn(),
  74. // _editBtn(),
  75. _shareBtn(),
  76. _fillCustomSpace(150)
  77. ];
  78. case MobileMeasureMode.measureMode:
  79. return [
  80. _exitBtn(),
  81. const Text('测量模式'),
  82. _fillEmptySpace(),
  83. _saveBtn(),
  84. _deleteBtn(),
  85. _undoBtn(),
  86. ];
  87. case MobileMeasureMode.annotationMode:
  88. return [
  89. _exitBtn(),
  90. const Text('注释模式'),
  91. _fillEmptySpace(),
  92. _saveBtn(),
  93. _deleteBtn(),
  94. _undoBtn(),
  95. ];
  96. default:
  97. return [Container()];
  98. }
  99. }
  100. Widget _saveBtn() {
  101. return LoadingAnimatedIconButton(
  102. icon: Icons.save,
  103. onPressed: () {
  104. widget.capturePng();
  105. },
  106. );
  107. }
  108. Widget _shareBtn() {
  109. return LoadingAnimatedIconButton(
  110. animationDuration: 600,
  111. icon: Icons.share,
  112. onPressed: () async {
  113. var itemCurrentImage = await measureData.shareImage.call(
  114. measureData.itemCurrentImage,
  115. );
  116. Get.dialog(_buildShareQr(itemCurrentImage));
  117. },
  118. );
  119. }
  120. Widget _editBtn() {
  121. return SingleIconButton(
  122. icon: Icons.edit,
  123. onPressed: () {
  124. print("call 进入撰写报告");
  125. },
  126. );
  127. }
  128. Widget _backBtn() {
  129. return SingleIconButton(
  130. icon: Icons.arrow_back_ios_new,
  131. onPressed: () {
  132. Get.back();
  133. },
  134. );
  135. }
  136. Widget _exitBtn() {
  137. return SingleIconButton(
  138. icon: Icons.exit_to_app,
  139. onPressed: () {
  140. mobileMeasureStateController.currentMode = MobileMeasureMode.playerMode;
  141. },
  142. );
  143. }
  144. Widget _deleteBtn() {
  145. return SingleIconButton(
  146. icon: Icons.delete_outline,
  147. onPressed: () {
  148. application.clearRecords();
  149. ///FIXME:[Gavin] 有时候删除了画布记录,但是没有刷新
  150. },
  151. );
  152. }
  153. Widget _undoBtn() {
  154. return SingleIconButton(
  155. icon: Icons.redo,
  156. onPressed: () {
  157. application.undoRecord();
  158. },
  159. );
  160. }
  161. Widget _fillEmptySpace() {
  162. return Expanded(
  163. child: SizedBox(
  164. height: 1,
  165. width: MediaQuery.of(context).size.width,
  166. ),
  167. );
  168. }
  169. Widget _fillCustomSpace(double width) {
  170. return SizedBox(
  171. width: width,
  172. );
  173. }
  174. Widget _buildShareQr(String itemCurrentImage) {
  175. return SimpleDialog(
  176. children: [
  177. Container(
  178. width: 260,
  179. child: Container(
  180. padding: const EdgeInsets.only(top: 10, bottom: 10),
  181. child: QRCodeWithLogo(
  182. itemCurrentImage,
  183. codeStatement: '扫描二维码,分享图像',
  184. operationStatement: i18nBook.remedical.copyLink.t,
  185. operationSuccessCallback: () =>
  186. {PromptBox.toast(i18nBook.remedical.copySuccess.t)},
  187. size: 180,
  188. ),
  189. ),
  190. ),
  191. ],
  192. );
  193. }
  194. }