convert_options_widget.dart 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import 'package:file_picker/file_picker.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:kmpdfkit_conversion_flutter/models/convert_type.dart';
  4. import 'package:kmpdfkit_conversion_flutter/models/options/options.dart';
  5. import 'package:permission_handler/permission_handler.dart';
  6. import 'package:provider/provider.dart';
  7. import '../states/convert_options_provider.dart';
  8. import '../states/convert_provider.dart';
  9. import 'options/convert_csv_options_widget.dart';
  10. import 'options/convert_excel_options_widget.dart';
  11. import 'options/convert_html_options_widget.dart';
  12. import 'options/convert_image_options_widget.dart';
  13. import 'options/convert_ppt_options_widget.dart';
  14. import 'options/convert_rtf_options_widget.dart';
  15. import 'options/convert_word_options_widget.dart';
  16. /// convert_options_widget.dart
  17. ///
  18. /// Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
  19. ///
  20. /// THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
  21. /// AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
  22. /// UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
  23. /// This notice may not be removed from this file.
  24. class ConvertConfigWidget extends StatefulWidget {
  25. const ConvertConfigWidget({Key? key}) : super(key: key);
  26. @override
  27. State<ConvertConfigWidget> createState() => _ConvertConfigWidgetState();
  28. }
  29. class _ConvertConfigWidgetState extends State<ConvertConfigWidget> {
  30. @override
  31. Widget build(BuildContext context) {
  32. return Column(
  33. children: [
  34. Row(
  35. children: [
  36. const Text('ConvertType:'),
  37. Consumer<ConvertOptionsProvider>(
  38. builder: (context, optionsProvider, child) {
  39. return Expanded(
  40. child: TextButton(
  41. child: Text(
  42. optionsProvider.convertType == ConvertType.none
  43. ? 'Please click to select a conversion type'
  44. : optionsProvider.convertType.name,
  45. style: const TextStyle(fontSize: 12),
  46. ),
  47. onPressed: () async {
  48. _selectConvertType(context);
  49. },
  50. ));
  51. }),
  52. IconButton(
  53. onPressed: () {
  54. ConvertType convertType =
  55. context.read<ConvertOptionsProvider>().convertType;
  56. _showConvertOptionsModalBottomSheet(context, convertType);
  57. },
  58. icon: const Icon(Icons.settings))
  59. ],
  60. ),
  61. SizedBox(
  62. width: double.infinity,
  63. child: ElevatedButton(
  64. onPressed: () async {
  65. ConvertType convertType =
  66. context.read<ConvertOptionsProvider>().convertType;
  67. if (convertType != ConvertType.none) {
  68. Options options =
  69. context.read<ConvertOptionsProvider>().getOptions();
  70. List<String> files = await getPDFFileList(context);
  71. context
  72. .read<ConvertTaskQueueProvider>()
  73. .addTask(convertType, options, files);
  74. }
  75. },
  76. child: const Text('Convert')))
  77. ],
  78. );
  79. }
  80. ///request storage permission
  81. Future<bool> getPermission() async {
  82. var status = await Permission.storage.request();
  83. return status.isGranted;
  84. }
  85. ///Select pdf files from android\ios using 'file_picker'
  86. Future<List<String>> getPDFFileList(BuildContext context) async {
  87. bool isGranted = await getPermission();
  88. if (!isGranted) {
  89. return List.empty();
  90. }
  91. FilePickerResult? result = await FilePicker.platform.pickFiles(
  92. type: FileType.custom, allowedExtensions: ['pdf'], allowMultiple: true);
  93. if (result != null) {
  94. List<String?> pdfFiles = result.paths;
  95. var files = pdfFiles.where((element) => element != null);
  96. return List.from(files);
  97. } else {
  98. return List.empty();
  99. }
  100. }
  101. void _showConvertOptionsModalBottomSheet(context, ConvertType convertType) {
  102. showModalBottomSheet<int>(
  103. context: context,
  104. isScrollControlled: false,
  105. builder: (BuildContext context) {
  106. switch (convertType) {
  107. case ConvertType.ppt:
  108. return const ConvertPPTOptionsWidget();
  109. case ConvertType.word:
  110. return const ConvertWordOptionsWidget();
  111. case ConvertType.excel:
  112. return const ConvertExcelOptionsWidget();
  113. case ConvertType.image:
  114. return const ConvertImageOptionsWidget();
  115. case ConvertType.csv:
  116. return const ConvertCSVOptionsWidget();
  117. case ConvertType.rtf:
  118. return const ConvertRTFOptionsWidget();
  119. case ConvertType.html:
  120. return const ConvertHtmlOptionsWidget();
  121. default:
  122. return const Padding(
  123. padding: EdgeInsets.all(16),
  124. child: Text('Options not support'));
  125. }
  126. });
  127. }
  128. /// show support convert mime type
  129. void _selectConvertType(context) {
  130. List<ConvertType> convertList = [
  131. ConvertType.ppt,
  132. ConvertType.word,
  133. ConvertType.excel,
  134. ConvertType.txt,
  135. ConvertType.image,
  136. ConvertType.csv,
  137. ConvertType.rtf,
  138. ConvertType.html
  139. ];
  140. showModalBottomSheet(
  141. context: context,
  142. builder: (BuildContext context) {
  143. return ListView.builder(
  144. itemCount: convertList.length,
  145. itemBuilder: (BuildContext context, int index) {
  146. ConvertType type = convertList[index];
  147. return ListTile(
  148. title: Text(type.name),
  149. onTap: () {
  150. context
  151. .read<ConvertOptionsProvider>()
  152. .changeConvertType(type);
  153. Navigator.of(context).pop();
  154. },
  155. );
  156. });
  157. });
  158. }
  159. }