diff --git a/lib/main.dart b/lib/main.dart index 4fa6a1b..b797d01 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:twonly/globals.dart'; import 'package:twonly/src/database/twonly_database.dart'; +import 'package:twonly/src/providers/image_editor.provider.dart'; import 'package:twonly/src/services/api/media_received.dart'; import 'package:twonly/src/services/api/media_send.dart'; import 'package:twonly/src/services/api.service.dart'; @@ -52,6 +53,7 @@ void main() async { providers: [ ChangeNotifierProvider(create: (_) => settingsController), ChangeNotifierProvider(create: (_) => CustomChangeProvider()), + ChangeNotifierProvider(create: (_) => ImageEditorProvider()), ], child: App(), ), diff --git a/lib/src/providers/image_editor.provider.dart b/lib/src/providers/image_editor.provider.dart new file mode 100644 index 0000000..fc62115 --- /dev/null +++ b/lib/src/providers/image_editor.provider.dart @@ -0,0 +1,11 @@ +import 'package:flutter/foundation.dart'; + +class ImageEditorProvider with ChangeNotifier, DiagnosticableTreeMixin { + bool _someTextViewIsAlreadyEditing = false; + bool get someTextViewIsAlreadyEditing => _someTextViewIsAlreadyEditing; + + Future updateSomeTextViewIsAlreadyEditing(bool update) async { + _someTextViewIsAlreadyEditing = update; + notifyListeners(); + } +} diff --git a/lib/src/views/camera/image_editor/layers/text_layer.dart b/lib/src/views/camera/image_editor/layers/text_layer.dart index 9c1293a..608da57 100755 --- a/lib/src/views/camera/image_editor/layers/text_layer.dart +++ b/lib/src/views/camera/image_editor/layers/text_layer.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:provider/provider.dart'; +import 'package:twonly/src/providers/image_editor.provider.dart'; import 'package:twonly/src/views/camera/image_editor/action_button.dart'; import 'package:twonly/src/views/camera/image_editor/data/layer.dart'; @@ -65,6 +67,9 @@ class _TextViewState extends State { setState(() { widget.layerData.isDeleted = textController.text == ""; widget.layerData.isEditing = false; + context + .read() + .updateSomeTextViewIsAlreadyEditing(false); widget.layerData.text = textController.text; }); }, @@ -75,6 +80,9 @@ class _TextViewState extends State { setState(() { widget.layerData.isDeleted = textController.text == ""; widget.layerData.isEditing = false; + context + .read() + .updateSomeTextViewIsAlreadyEditing(false); }); } }); @@ -96,6 +104,7 @@ class _TextViewState extends State { ), ); } + return Stack( key: _widgetKey, children: [ @@ -110,15 +119,25 @@ class _TextViewState extends State { }); }, onScaleEnd: (d) { - if (deleteLayer) widget.layerData.isDeleted = true; + if (deleteLayer) { + widget.layerData.isDeleted = true; + textController.text = ""; + } elementIsScaled = false; setState(() {}); }, - onTap: () { - setState(() { - widget.layerData.isEditing = true; - }); - }, + onTap: (context + .watch() + .someTextViewIsAlreadyEditing) + ? null + : () { + setState(() { + context + .read() + .updateSomeTextViewIsAlreadyEditing(true); + widget.layerData.isEditing = true; + }); + }, onScaleUpdate: (detail) { if (detail.pointerCount == 1) { widget.layerData.offset = Offset( diff --git a/lib/src/views/camera/image_editor/layers_viewer.dart b/lib/src/views/camera/image_editor/layers_viewer.dart index aa29540..3239fb5 100644 --- a/lib/src/views/camera/image_editor/layers_viewer.dart +++ b/lib/src/views/camera/image_editor/layers_viewer.dart @@ -53,7 +53,7 @@ class LayersViewer extends StatelessWidget { }), ...layers.whereType().map((layerItem) { return TextLayer( - key: GlobalKey(), + // key: GlobalKey(), layerData: layerItem, onUpdate: onUpdate, ); diff --git a/lib/src/views/camera/share_image_editor_view.dart b/lib/src/views/camera/share_image_editor_view.dart index 4deb8a7..7871dc4 100644 --- a/lib/src/views/camera/share_image_editor_view.dart +++ b/lib/src/views/camera/share_image_editor_view.dart @@ -56,6 +56,7 @@ class _ShareImageEditorView extends State { String? sendNextMediaToUserName; double tabDownPosition = 0; bool sendingOrLoadingImage = true; + bool loadingImage = true; bool isDisposed = false; HashSet selectedUserIds = HashSet(); double widthRatio = 1, heightRatio = 1, pixelRatio = 1; @@ -78,6 +79,7 @@ class _ShareImageEditorView extends State { } else if (widget.videoFilePath != null) { setState(() { sendingOrLoadingImage = false; + loadingImage = false; }); videoController = VideoPlayerController.file(widget.videoFilePath!); videoController?.setLooping(true); @@ -381,6 +383,7 @@ class _ShareImageEditorView extends State { ); setState(() { sendingOrLoadingImage = false; + loadingImage = false; }); } @@ -535,11 +538,12 @@ class _ShareImageEditorView extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ SaveToGalleryButton( - getMergedImage: getMergedImage, - mediaUploadId: mediaUploadId, - videoFilePath: widget.videoFilePath, - sendNextMediaToUserName: sendNextMediaToUserName, - isLoading: sendingOrLoadingImage), + getMergedImage: getMergedImage, + mediaUploadId: mediaUploadId, + videoFilePath: widget.videoFilePath, + sendNextMediaToUserName: sendNextMediaToUserName, + isLoading: loadingImage, + ), if (sendNextMediaToUserName != null) SizedBox(width: 10), if (sendNextMediaToUserName != null) OutlinedButton( diff --git a/lib/src/views/camera/share_image_view.dart b/lib/src/views/camera/share_image_view.dart index a6dc2e6..7ae79c4 100644 --- a/lib/src/views/camera/share_image_view.dart +++ b/lib/src/views/camera/share_image_view.dart @@ -17,17 +17,18 @@ import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/views/settings/subscription/subscription.view.dart'; class ShareImageView extends StatefulWidget { - const ShareImageView( - {super.key, - required this.imageBytesFuture, - required this.isRealTwonly, - required this.mirrorVideo, - required this.maxShowTime, - required this.selectedUserIds, - required this.updateStatus, - required this.videoUploadHandler, - required this.mediaUploadId, - this.enableVideoAudio}); + const ShareImageView({ + super.key, + required this.imageBytesFuture, + required this.isRealTwonly, + required this.mirrorVideo, + required this.maxShowTime, + required this.selectedUserIds, + required this.updateStatus, + required this.videoUploadHandler, + required this.mediaUploadId, + this.enableVideoAudio, + }); final Future imageBytesFuture; final bool isRealTwonly; final bool mirrorVideo;