pdf_buttom_annot_fun_widget.dart 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_svg/flutter_svg.dart';
  3. import 'package:kmpdfkit_demo/widgets/constains.dart';
  4. import 'package:kmpdfkit_demo/widgets/events.dart';
  5. import 'package:kmpdfkit_demo/widgets/function/annot_color_options_widget.dart';
  6. import 'package:kmpdfkit_demo/widgets/models/annot_attribute_bean.dart';
  7. import 'package:kmpdfkit_demo/widgets/models/annot_bean.dart';
  8. class PDFButtonAnnotFunWidget extends StatefulWidget {
  9. const PDFButtonAnnotFunWidget({Key? key}) : super(key: key);
  10. @override
  11. State<PDFButtonAnnotFunWidget> createState() =>
  12. _PDFButtonAnnotFunWidgetState();
  13. }
  14. class _PDFButtonAnnotFunWidgetState extends State<PDFButtonAnnotFunWidget> {
  15. AnnotType selectAnnot = AnnotType.highlight;
  16. var annotFunList = [
  17. AnnotBean(
  18. annotType: AnnotType.highlight,
  19. normalImagePath: 'assets/images/ic_reader_highlight.svg',
  20. selectImagePath: 'assets/images/ic_reader_highlight_select.svg',
  21. annotColor: Colors.red.value,
  22. annotColorAlpha: 255),
  23. AnnotBean(
  24. annotType: AnnotType.underline,
  25. normalImagePath: 'assets/images/ic_reader_underline.svg',
  26. selectImagePath: 'assets/images/ic_reader_underline_select.svg',
  27. annotColor: Colors.blue.value,
  28. annotColorAlpha: 255),
  29. AnnotBean(
  30. annotType: AnnotType.strikeout,
  31. normalImagePath: 'assets/images/ic_reader_strikethrough.svg',
  32. selectImagePath: 'assets/images/ic_reader_strikethrough_select.svg',
  33. annotColor: Colors.green.value,
  34. annotColorAlpha: 255),
  35. AnnotBean(
  36. annotType: AnnotType.squiggly,
  37. normalImagePath: 'assets/images/ic_reader_squiggly_underline.svg',
  38. selectImagePath:
  39. 'assets/images/ic_reader_squiggly_underline_select.svg',
  40. annotColor: Colors.pink.value,
  41. annotColorAlpha: 255),
  42. ];
  43. @override
  44. void initState() {
  45. super.initState();
  46. initAnnotAttr();
  47. }
  48. @override
  49. Widget build(BuildContext context) {
  50. return annotList(selectAnnot, (annotBean) {
  51. selectAnnotType(annotBean.annotType);
  52. }, (annotBean) {
  53. selectAnnotType(annotBean.annotType);
  54. _showColorOptionsModalBottomSheet(context, annotBean);
  55. });
  56. }
  57. void selectAnnotType(AnnotType type) {
  58. setState(() {
  59. selectAnnot = type;
  60. });
  61. }
  62. Widget annotList(
  63. AnnotType selectAnnotType,
  64. Function(AnnotBean annotBean) onTap,
  65. Function(AnnotBean annotBean) onLongPress) {
  66. return Container(
  67. color: const Color(0xFFEFF4FD),
  68. height: 60,
  69. alignment: Alignment.centerLeft,
  70. child: ListView.builder(
  71. itemCount: annotFunList.length,
  72. scrollDirection: Axis.horizontal,
  73. primary: true,
  74. shrinkWrap: true,
  75. itemBuilder: (context, index) {
  76. AnnotBean bean = annotFunList[index];
  77. return Container(
  78. width: 60,
  79. padding: const EdgeInsets.all(16),
  80. height: 60,
  81. color: selectAnnotType == bean.annotType
  82. ? const Color(0xFFD5E3FE)
  83. : Colors.transparent,
  84. child: InkWell(
  85. onTap: () {
  86. onTap(bean);
  87. },
  88. onLongPress: () {
  89. onLongPress(bean);
  90. },
  91. child: Stack(
  92. children: [
  93. Positioned(
  94. top: 0,
  95. bottom: 0,
  96. left: 0,
  97. right: 0,
  98. child: Container(
  99. margin: const EdgeInsets.all(2),
  100. color: Color(bean.annotColor),
  101. width: double.infinity,
  102. height: double.infinity,
  103. ),
  104. ),
  105. Positioned(
  106. top: 0,
  107. bottom: 0,
  108. left: 0,
  109. right: 0,
  110. child: SvgPicture.asset(
  111. selectAnnotType == bean.annotType
  112. ? bean.selectImagePath
  113. : bean.normalImagePath,
  114. semanticsLabel: bean.annotType.name,
  115. ))
  116. ],
  117. ),
  118. ),
  119. );
  120. }));
  121. }
  122. void _showColorOptionsModalBottomSheet(context, AnnotBean annotBean) {
  123. showModalBottomSheet<int>(
  124. context: context,
  125. isScrollControlled: false,
  126. builder: (BuildContext context) {
  127. return AnnotColorOptionsWidget(
  128. color: annotBean.annotColor,
  129. alpha: annotBean.annotColorAlpha,
  130. colorOptionsCallback: (int? color, int? alpha) async {
  131. AnnotAttributeBean attr = await setAnnotAttribute(
  132. annotType: annotBean.annotType, color: color, alpha: alpha);
  133. AnnotBean bean = annotFunList.firstWhere(
  134. (element) => element.annotType == annotBean.annotType);
  135. setState(() {
  136. if (color != null) {
  137. bean.annotColor = attr.color;
  138. }
  139. if (alpha != null) {
  140. bean.annotColorAlpha = attr.alpha;
  141. }
  142. });
  143. },
  144. );
  145. });
  146. }
  147. void initAnnotAttr() async {
  148. AnnotAttributeBean highlight = await getAnnotAttribute(AnnotType.highlight);
  149. AnnotAttributeBean underline = await getAnnotAttribute(AnnotType.underline);
  150. AnnotAttributeBean strikeout = await getAnnotAttribute(AnnotType.strikeout);
  151. AnnotAttributeBean squiggly = await getAnnotAttribute(AnnotType.squiggly);
  152. setState(() {
  153. annotFunList.forEach((element) {
  154. switch (element.annotType) {
  155. case AnnotType.highlight:
  156. element
  157. ..annotColor = highlight.color
  158. ..annotColorAlpha = highlight.alpha;
  159. break;
  160. case AnnotType.underline:
  161. element
  162. ..annotColor = underline.color
  163. ..annotColorAlpha = underline.alpha;
  164. break;
  165. case AnnotType.strikeout:
  166. element
  167. ..annotColor = strikeout.color
  168. ..annotColorAlpha = strikeout.alpha;
  169. break;
  170. case AnnotType.squiggly:
  171. element
  172. ..annotColor = squiggly.color
  173. ..annotColorAlpha = squiggly.alpha;
  174. break;
  175. }
  176. });
  177. });
  178. }
  179. }