mobile_top_menu.dart 5.8 KB

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