diff --git a/lib/src/utils/simple_dialog_item.dart b/lib/src/utils/simple_dialog_item.dart new file mode 100644 index 00000000..f751b1d9 --- /dev/null +++ b/lib/src/utils/simple_dialog_item.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +class SimpleDialogItem extends StatelessWidget { + const SimpleDialogItem( + {required this.icon, + required this.color, + required this.text, + required this.onPressed, + Key? key}) + : super(key: key); + + final IconData icon; + final Color color; + final String text; + final VoidCallback onPressed; + + @override + Widget build(BuildContext context) { + return SimpleDialogOption( + onPressed: onPressed, + child: Row( + children: [ + Icon(icon, size: 36, color: color), + Padding( + padding: const EdgeInsetsDirectional.only(start: 16), + child: Text(text), + ), + ], + ), + ); + } +} diff --git a/lib/src/widgets/editor.dart b/lib/src/widgets/editor.dart index df481edd..d250131c 100644 --- a/lib/src/widgets/editor.dart +++ b/lib/src/widgets/editor.dart @@ -8,6 +8,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; +import 'package:gallery_saver/gallery_saver.dart'; import 'package:string_validator/string_validator.dart'; import '../models/documents/document.dart'; @@ -15,6 +16,7 @@ import '../models/documents/nodes/container.dart' as container_node; import '../models/documents/nodes/leaf.dart' as leaf; import '../models/documents/nodes/line.dart'; import '../utils/platform_helper.dart'; +import '../utils/simple_dialog_item.dart'; import '../utils/string_helper.dart'; import 'box.dart'; import 'controller.dart'; @@ -202,23 +204,48 @@ Widget defaultEmbedBuilder( ? Image.memory(base64.decode(imageUrl)) : Image.file(io.File(imageUrl)); - if (!readOnly) { + if (!readOnly || !isMobile()) { return image; } + /// We provide these option menu only for mobile platform return GestureDetector( onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => ImageTapWrapper( - imageProvider: imageUrl.startsWith('http') - ? NetworkImage(imageUrl) - : isBase64(imageUrl) - ? Image.memory(base64.decode(imageUrl)) - as ImageProvider? - : FileImage(io.File(imageUrl)), - ))); + showDialog( + context: context, + builder: (context) => SimpleDialog(children: [ + SimpleDialogItem( + icon: Icons.save, + color: Colors.greenAccent, + text: 'Save', + onPressed: () { + // TODO: handle base64 and etc. + GallerySaver.saveImage(imageUrl).then((_) => + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Saved')))); + }, + ), + SimpleDialogItem( + icon: Icons.zoom_in, + color: Colors.cyanAccent, + text: 'Zoom', + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ImageTapWrapper( + imageProvider: imageUrl + .startsWith('http') + ? NetworkImage(imageUrl) + : isBase64(imageUrl) + ? Image.memory( + base64.decode(imageUrl)) + as ImageProvider? + : FileImage(io.File(imageUrl)), + ))); + }, + ) + ])); }, child: image); case 'video': diff --git a/pubspec.yaml b/pubspec.yaml index 12edce78..857932b8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -27,6 +27,7 @@ dependencies: youtube_player_flutter: ^8.0.0 diff_match_patch: ^0.4.1 i18n_extension: ^4.1.3 + gallery_saver: ^2.3.2 dev_dependencies: flutter_test: