From 97b97ce7cfa6849d445162f461dea160342dd899 Mon Sep 17 00:00:00 2001 From: X Code Date: Mon, 31 Jan 2022 01:31:11 -0800 Subject: [PATCH] Option to resize image in edit mode --- lib/src/translations/toolbar.i18n.dart | 15 ++++++ .../widgets/embeds/default_embed_builder.dart | 52 +++++++++++++++++-- lib/src/widgets/embeds/image.dart | 2 +- 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/lib/src/translations/toolbar.i18n.dart b/lib/src/translations/toolbar.i18n.dart index a0c7a072..e87aa7d3 100644 --- a/lib/src/translations/toolbar.i18n.dart +++ b/lib/src/translations/toolbar.i18n.dart @@ -19,6 +19,7 @@ extension Localization on String { 'Saved': 'Saved', 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', + 'Resize': 'Resize', }, 'en_us': { 'Paste a link': 'Paste a link', @@ -36,6 +37,7 @@ extension Localization on String { 'Saved': 'Saved', 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', + 'Resize': 'Resize', }, 'ar': { 'Paste a link': 'نسخ الرابط', @@ -53,6 +55,7 @@ extension Localization on String { 'Saved': 'أنقذ', 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', + 'Resize': 'Resize', }, 'da': { 'Paste a link': 'Indsæt link', @@ -70,6 +73,7 @@ extension Localization on String { 'Saved': 'Gemt', 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', + 'Resize': 'Resize', }, 'de': { 'Paste a link': 'Link hinzufügen', @@ -88,6 +92,7 @@ extension Localization on String { 'Saved': 'Gerettet', 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', + 'Resize': 'Resize', }, 'fr': { 'Paste a link': 'Coller un lien', @@ -105,6 +110,7 @@ extension Localization on String { 'Saved': 'Enregistrée', 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', + 'Resize': 'Resize', }, 'zh_CN': { 'Paste a link': '粘贴链接', @@ -122,6 +128,7 @@ extension Localization on String { 'Saved': '已保存', 'Text': '文字', 'What is entered is not a link': '输入的不是链接', + 'Resize': '删除', }, 'ko': { 'Paste a link': '링크를 붙여넣어 주세요.', @@ -139,6 +146,7 @@ extension Localization on String { 'Saved': '저장되었습니다.', 'Text': '텍스트', 'What is entered is not a link': '입력한 내용은 링크가 아닙니다.', + 'Resize': 'Resize', }, 'ru': { 'Paste a link': 'Вставить ссылку', @@ -156,6 +164,7 @@ extension Localization on String { 'Saved': 'Сохранено', 'Text': 'Текст', 'What is entered is not a link': 'Некорректная ссылка', + 'Resize': 'Resize', }, 'es': { 'Paste a link': 'Pega un enlace', @@ -174,6 +183,7 @@ extension Localization on String { 'Saved': 'Guardado', 'Text': 'Texto', 'What is entered is not a link': 'El link ingresado no es válido', + 'Resize': 'Resize', }, 'tr': { 'Paste a link': 'Bağlantıyı Yapıştır', @@ -191,6 +201,7 @@ extension Localization on String { 'Saved': 'kaydedildi', 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', + 'Resize': 'Resize', }, 'uk': { 'Paste a link': 'Вставити посилання', @@ -208,6 +219,7 @@ extension Localization on String { 'Saved': 'Збережено', 'Text': 'Текст', 'What is entered is not a link': 'Некоректне посилання', + 'Resize': 'Resize', }, 'pt': { 'Paste a link': 'Colar um link', @@ -226,6 +238,7 @@ extension Localization on String { 'Saved': 'Salvo', 'Text': 'Texto', 'What is entered is not a link': 'O link inserido não é válido', + 'Resize': 'Resize', }, 'pl': { 'Paste a link': 'Wklej link', @@ -244,6 +257,7 @@ extension Localization on String { 'Text': 'Tekst', 'What is entered is not a link': 'To, co jest wpisane, nie jest linkiem', + 'Resize': 'Resize', }, 'vi': { 'Paste a link': 'Chèn liên kết', @@ -262,6 +276,7 @@ extension Localization on String { 'Text': 'Chữ', 'What is entered is not a link': 'Những gì được nhập không phải là một liên kết', + 'Resize': 'Resize', }, }; diff --git a/lib/src/widgets/embeds/default_embed_builder.dart b/lib/src/widgets/embeds/default_embed_builder.dart index 95e717ab..521d1c04 100644 --- a/lib/src/widgets/embeds/default_embed_builder.dart +++ b/lib/src/widgets/embeds/default_embed_builder.dart @@ -13,6 +13,7 @@ import 'youtube_video_app.dart'; Widget defaultEmbedBuilder( BuildContext context, leaf.Embed node, bool readOnly) { assert(!kIsWeb, 'Please provide EmbedBuilder for Web'); + switch (node.value.type) { case 'image': final imageUrl = standardizeImageUrl(node.value.data); @@ -39,10 +40,14 @@ Widget defaultEmbedBuilder( image ??= imageByUrl(imageUrl); if (!readOnly || !isMobile() || isImageBase64(imageUrl)) { + if (!readOnly && isMobile()) { + // TODO: slider for width and height + // return _menuOptionsForEditableImageInMobile(context, imageUrl, image); + } return image; } - // We provide option menu only for mobile platform excluding base64 image + // We provide option menu for mobile platform excluding base64 image return _menuOptionsForReadonlyImage(context, imageUrl, image); case 'video': final videoUrl = node.value.data; @@ -60,8 +65,48 @@ Widget defaultEmbedBuilder( } } -GestureDetector _menuOptionsForReadonlyImage( - BuildContext context, String imageUrl, image) { +Widget _menuOptionsForEditableImageInMobile( + BuildContext context, String imageUrl, Image image) { + return GestureDetector( + onTap: () { + showDialog( + context: context, + builder: (context) => Padding( + padding: const EdgeInsets.fromLTRB(50, 0, 50, 0), + child: SimpleDialog( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10))), + children: [ + _SimpleDialogItem( + icon: Icons.settings_outlined, + color: Colors.greenAccent, + text: 'Resize'.i18n, + onPressed: () { + GallerySaver.saveImage(imageUrl).then((_) => + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Saved'.i18n)))); + }, + ), + _SimpleDialogItem( + icon: Icons.delete_forever_outlined, + color: Colors.red.shade200, + text: 'Remove'.i18n, + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + ImageTapWrapper(imageUrl: imageUrl))); + }, + ) + ]), + )); + }, + child: image); +} + +Widget _menuOptionsForReadonlyImage( + BuildContext context, String imageUrl, Image image) { return GestureDetector( onTap: () { showDialog( @@ -77,7 +122,6 @@ GestureDetector _menuOptionsForReadonlyImage( color: Colors.greenAccent, text: 'Save'.i18n, onPressed: () { - // TODO: improve this GallerySaver.saveImage(imageUrl).then((_) => ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Saved'.i18n)))); diff --git a/lib/src/widgets/embeds/image.dart b/lib/src/widgets/embeds/image.dart index 38ade21b..8faf3d43 100644 --- a/lib/src/widgets/embeds/image.dart +++ b/lib/src/widgets/embeds/image.dart @@ -9,7 +9,7 @@ bool isImageBase64(String imageUrl) { return !imageUrl.startsWith('http') && isBase64(imageUrl); } -Widget imageByUrl(String imageUrl, +Image imageByUrl(String imageUrl, {double? width, double? height, AlignmentGeometry alignment = Alignment.center}) {