@@ -6,16 +6,20 @@ import 'package:file_picker/file_picker.dart';
66import 'package:flutter/foundation.dart' ;
77import 'package:flutter/material.dart' ;
88import 'package:flutter/services.dart' ;
9+ import 'package:htmltopdfwidgets/htmltopdfwidgets.dart' as html2pdf;
10+ import 'package:markdown/markdown.dart' as md;
911import 'package:markdown_editor/device_preference_notifier.dart' ;
1012import 'package:markdown_editor/l10n/generated/app_localizations.dart' ;
1113import 'package:markdown_editor/widgets/MarkdownBody/custom_image_config.dart' ;
1214import 'package:markdown_editor/widgets/MarkdownBody/custom_text_node.dart' ;
1315import 'package:markdown_editor/widgets/MarkdownBody/latex_node.dart' ;
1416import 'package:markdown_editor/widgets/MarkdownTextInput/markdown_text_input.dart' ;
1517import 'package:markdown_widget/markdown_widget.dart' ;
18+ import 'package:pdf/widgets.dart' as pw;
19+ import 'package:printing/printing.dart' ;
1620import 'package:url_launcher/url_launcher.dart' ;
1721
18- enum MenuItem { switchTheme, switchView, open, clear, save, donate }
22+ enum MenuItem { switchTheme, switchView, open, clear, save, print, donate }
1923
2024class Home extends StatefulWidget {
2125 final DevicePreferenceNotifier devicePreferenceNotifier;
@@ -206,6 +210,28 @@ class _HomeState extends State<Home> {
206210 }
207211 }
208212
213+ Future <void > _printFile () async {
214+ if (_inputText.isEmpty) {
215+ ScaffoldMessenger .of (context).showSnackBar (
216+ SnackBar (
217+ content: Text (AppLocalizations .of (context)! .emptyInputTextContent),
218+ ),
219+ );
220+ return ;
221+ } else {
222+ final htmlFromMarkdown = md.markdownToHtml (_inputText);
223+ await Printing .layoutPdf (
224+ usePrinterSettings: true ,
225+ onLayout: (format) async {
226+ final pdf = pw.Document ();
227+ final widgets = await html2pdf.HTMLToPdf ().convert (htmlFromMarkdown);
228+ pdf.addPage (pw.MultiPage (build: (context) => widgets));
229+ return pdf.save ();
230+ },
231+ );
232+ }
233+ }
234+
209235 Future <bool > _showExitConfirmationDialog () async {
210236 return await showDialog <bool >(
211237 context: context,
@@ -366,6 +392,9 @@ class _HomeState extends State<Home> {
366392 case MenuItem .save:
367393 await _saveFile ();
368394 break ;
395+ case MenuItem .print:
396+ await _printFile ();
397+ break ;
369398 case MenuItem .donate:
370399 await launchUrl (
371400 Uri .parse ("https://buymeacoffee.com/adeeteya" ),
@@ -429,6 +458,16 @@ class _HomeState extends State<Home> {
429458 ],
430459 ),
431460 ),
461+ PopupMenuItem (
462+ value: MenuItem .print,
463+ child: Row (
464+ children: [
465+ const Icon (Icons .print),
466+ const SizedBox (width: 8 ),
467+ Text (AppLocalizations .of (context)! .print),
468+ ],
469+ ),
470+ ),
432471 PopupMenuItem (
433472 value: MenuItem .donate,
434473 child: Row (
0 commit comments