diff --git a/lib/src/translations/toolbar.i18n.dart b/lib/src/translations/toolbar.i18n.dart index 11a9a5a6..577f901b 100644 --- a/lib/src/translations/toolbar.i18n.dart +++ b/lib/src/translations/toolbar.i18n.dart @@ -20,6 +20,8 @@ extension Localization on String { 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'en_us': { 'Paste a link': 'Paste a link', @@ -38,6 +40,8 @@ extension Localization on String { 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'ar': { 'Paste a link': 'نسخ الرابط', @@ -56,6 +60,8 @@ extension Localization on String { 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'da': { 'Paste a link': 'Indsæt link', @@ -74,6 +80,8 @@ extension Localization on String { 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'de': { 'Paste a link': 'Link hinzufügen', @@ -93,6 +101,8 @@ extension Localization on String { 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'fr': { 'Paste a link': 'Coller un lien', @@ -111,6 +121,8 @@ extension Localization on String { 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'zh_CN': { 'Paste a link': '粘贴链接', @@ -129,6 +141,8 @@ extension Localization on String { 'Text': '文字', 'What is entered is not a link': '输入的不是链接', 'Resize': '调整大小', + 'Width': 'Width', + 'Height': 'Height', }, 'ko': { 'Paste a link': '링크를 붙여넣어 주세요.', @@ -147,6 +161,8 @@ extension Localization on String { 'Text': '텍스트', 'What is entered is not a link': '입력한 내용은 링크가 아닙니다.', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'ru': { 'Paste a link': 'Вставить ссылку', @@ -165,6 +181,8 @@ extension Localization on String { 'Text': 'Текст', 'What is entered is not a link': 'Некорректная ссылка', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'es': { 'Paste a link': 'Pega un enlace', @@ -184,6 +202,8 @@ extension Localization on String { 'Text': 'Texto', 'What is entered is not a link': 'El link ingresado no es válido', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'tr': { 'Paste a link': 'Bağlantıyı Yapıştır', @@ -202,6 +222,8 @@ extension Localization on String { 'Text': 'Text', 'What is entered is not a link': 'What is entered is not a link', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'uk': { 'Paste a link': 'Вставити посилання', @@ -220,6 +242,8 @@ extension Localization on String { 'Text': 'Текст', 'What is entered is not a link': 'Некоректне посилання', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'pt': { 'Paste a link': 'Colar um link', @@ -239,6 +263,8 @@ extension Localization on String { 'Text': 'Texto', 'What is entered is not a link': 'O link inserido não é válido', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'pl': { 'Paste a link': 'Wklej link', @@ -258,6 +284,8 @@ extension Localization on String { 'What is entered is not a link': 'To, co jest wpisane, nie jest linkiem', 'Resize': 'Resize', + 'Width': 'Width', + 'Height': 'Height', }, 'vi': { 'Paste a link': 'Chèn liên kết', @@ -277,6 +305,8 @@ extension Localization on String { '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', + 'Width': 'Width', + 'Height': 'Height', }, }; diff --git a/lib/src/widgets/embeds/default_embed_builder.dart b/lib/src/widgets/embeds/default_embed_builder.dart index c34ee2e4..4cfe631b 100644 --- a/lib/src/widgets/embeds/default_embed_builder.dart +++ b/lib/src/widgets/embeds/default_embed_builder.dart @@ -4,6 +4,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:gallery_saver/gallery_saver.dart'; +import 'package:tuple/tuple.dart'; import '../../models/documents/nodes/leaf.dart' as leaf; import '../../translations/toolbar.i18n.dart'; @@ -19,6 +20,7 @@ Widget defaultEmbedBuilder(BuildContext context, QuillController controller, leaf.Embed node, bool readOnly) { assert(!kIsWeb, 'Please provide EmbedBuilder for Web'); + Tuple2? _widthHeight; switch (node.value.type) { case 'image': final imageUrl = standardizeImageUrl(node.value.data); @@ -33,6 +35,7 @@ Widget defaultEmbedBuilder(BuildContext context, QuillController controller, 'mobileWidth and mobileHeight must be specified'); final w = double.parse(_attrs['mobileWidth']!); final h = double.parse(_attrs['mobileHeight']!); + _widthHeight = Tuple2(w, h); final m = _attrs['mobileMargin'] == null ? 0.0 : double.parse(_attrs['mobileMargin']!); @@ -42,7 +45,11 @@ Widget defaultEmbedBuilder(BuildContext context, QuillController controller, child: imageByUrl(imageUrl, width: w, height: h, alignment: a)); } } - image ??= imageByUrl(imageUrl); + + if (_widthHeight == null) { + image = imageByUrl(imageUrl); + _widthHeight = Tuple2((image as Image).width, image.height); + } if (!readOnly && isMobile()) { return GestureDetector( @@ -59,7 +66,9 @@ Widget defaultEmbedBuilder(BuildContext context, QuillController controller, showCupertinoModalPopup( context: context, builder: (context) { - return const ImageResizer(); + return ImageResizer( + imageWidth: _widthHeight?.item1, + imageHeight: _widthHeight?.item2); }); }, ); diff --git a/lib/src/widgets/embeds/image_resizer.dart b/lib/src/widgets/embeds/image_resizer.dart index 9f6cd236..3188a767 100644 --- a/lib/src/widgets/embeds/image_resizer.dart +++ b/lib/src/widgets/embeds/image_resizer.dart @@ -1,16 +1,33 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import '../../translations/toolbar.i18n.dart'; + class ImageResizer extends StatefulWidget { - const ImageResizer({Key? key}) : super(key: key); + const ImageResizer( + {required this.imageWidth, required this.imageHeight, Key? key}) + : super(key: key); + + final double? imageWidth; + final double? imageHeight; @override _ImageResizerState createState() => _ImageResizerState(); } class _ImageResizerState extends State { + late double _width; + late double _height; + late double _maxWidth; + late double _maxHeight; + @override Widget build(BuildContext context) { + _maxWidth = MediaQuery.of(context).size.width; + _maxHeight = MediaQuery.of(context).size.height; + _width = widget.imageWidth ?? _maxWidth; + _height = widget.imageHeight ?? _maxHeight; + return CupertinoActionSheet(actions: [ CupertinoActionSheetAction( onPressed: () {}, @@ -18,10 +35,15 @@ class _ImageResizerState extends State { padding: const EdgeInsets.symmetric(horizontal: 8), child: Card( child: Slider( - value: 50, - max: 100, - divisions: 5, - onChanged: (val) {}, + value: _width, + max: _maxWidth, + divisions: 100, + label: 'Width'.i18n, + onChanged: (val) { + setState(() { + _width = val; + }); + }, ), )), ), @@ -31,10 +53,15 @@ class _ImageResizerState extends State { padding: const EdgeInsets.symmetric(horizontal: 8), child: Card( child: Slider( - value: 10, - max: 100, - divisions: 5, - onChanged: (val) {}, + value: _height, + max: _maxHeight, + divisions: 100, + label: 'Height'.i18n, + onChanged: (val) { + setState(() { + _height = val; + }); + }, ), )), )