From ac68c2373d04aa223efe39b552e30ada81ee10a5 Mon Sep 17 00:00:00 2001 From: Till Friebe Date: Thu, 20 May 2021 13:56:46 +0200 Subject: [PATCH] Improve further SOC of raw editor This improves separation of concerns for the RawEditor by moving the code for the text selection delegate to a separate class, furthermore add more comments. The PR does not change the functionality of the code. --- lib/widgets/raw_editor.dart | 78 ++++++------------- ...editor_state_selection_delegate_mixin.dart | 40 ++++++++++ 2 files changed, 64 insertions(+), 54 deletions(-) create mode 100644 lib/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart diff --git a/lib/widgets/raw_editor.dart b/lib/widgets/raw_editor.dart index 580dd5b7..cd4f379c 100644 --- a/lib/widgets/raw_editor.dart +++ b/lib/widgets/raw_editor.dart @@ -23,6 +23,7 @@ import 'editor.dart'; import 'keyboard_listener.dart'; import 'proxy.dart'; import 'raw_editor/raw_editor_state_keyboard_mixin.dart'; +import 'raw_editor/raw_editor_state_selection_delegate_mixin.dart'; import 'raw_editor/raw_editor_state_text_input_client_mixin.dart'; import 'text_block.dart'; import 'text_line.dart'; @@ -90,9 +91,7 @@ class RawEditor extends StatefulWidget { final EmbedBuilder embedBuilder; @override - State createState() { - return RawEditorState(); - } + State createState() => RawEditorState(); } class RawEditorState extends EditorState @@ -101,44 +100,39 @@ class RawEditorState extends EditorState WidgetsBindingObserver, TickerProviderStateMixin, RawEditorStateKeyboardMixin, - RawEditorStateTextInputClientMixin - implements TextSelectionDelegate, TextInputClient { + RawEditorStateTextInputClientMixin, + RawEditorStateSelectionDelegateMixin { final GlobalKey _editorKey = GlobalKey(); - EditorTextSelectionOverlay? _selectionOverlay; - FocusAttachment? _focusAttachment; - late CursorCont _cursorCont; - ScrollController? _scrollController; + + // Keyboard + late KeyboardListener _keyboardListener; KeyboardVisibilityController? _keyboardVisibilityController; StreamSubscription? _keyboardVisibilitySubscription; - late KeyboardListener _keyboardListener; - bool _didAutoFocus = false; bool _keyboardVisible = false; + + // Selection overlay + @override + EditorTextSelectionOverlay? getSelectionOverlay() => _selectionOverlay; + EditorTextSelectionOverlay? _selectionOverlay; + + ScrollController? _scrollController; + + late CursorCont _cursorCont; + + // Focus + bool _didAutoFocus = false; + FocusAttachment? _focusAttachment; + bool get _hasFocus => widget.focusNode.hasFocus; + DefaultStyles? _styles; + final ClipboardStatusNotifier? _clipboardStatus = kIsWeb ? null : ClipboardStatusNotifier(); final LayerLink _toolbarLayerLink = LayerLink(); final LayerLink _startHandleLayerLink = LayerLink(); final LayerLink _endHandleLayerLink = LayerLink(); - bool get _hasFocus => widget.focusNode.hasFocus; - - TextDirection get _textDirection { - final result = Directionality.of(context); - return result; - } - - @override - TextEditingValue get textEditingValue { - return getTextEditingValue(); - } - - @override - set textEditingValue(TextEditingValue value) { - setTextEditingValue(value); - } - - @override - void bringIntoView(TextPosition position) {} + TextDirection get _textDirection => Directionality.of(context); @override Widget build(BuildContext context) { @@ -593,35 +587,11 @@ class RawEditorState extends EditorState return _editorKey.currentContext!.findRenderObject() as RenderEditor?; } - @override - EditorTextSelectionOverlay? getSelectionOverlay() { - return _selectionOverlay; - } - @override TextEditingValue getTextEditingValue() { return widget.controller.plainTextEditingValue; } - @override - void hideToolbar([bool hideHandles = true]) { - if (getSelectionOverlay()?.toolbar != null) { - getSelectionOverlay()?.hideToolbar(); - } - } - - @override - bool get cutEnabled => widget.toolbarOptions.cut && !widget.readOnly; - - @override - bool get copyEnabled => widget.toolbarOptions.copy; - - @override - bool get pasteEnabled => widget.toolbarOptions.paste && !widget.readOnly; - - @override - bool get selectAllEnabled => widget.toolbarOptions.selectAll; - @override void requestKeyboard() { if (_hasFocus) { diff --git a/lib/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart b/lib/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart new file mode 100644 index 00000000..cda991cc --- /dev/null +++ b/lib/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart @@ -0,0 +1,40 @@ +import 'package:flutter/widgets.dart'; + +import '../editor.dart'; + +mixin RawEditorStateSelectionDelegateMixin on EditorState + implements TextSelectionDelegate { + @override + TextEditingValue get textEditingValue { + return getTextEditingValue(); + } + + @override + set textEditingValue(TextEditingValue value) { + setTextEditingValue(value); + } + + @override + void bringIntoView(TextPosition position) { + // TODO: implement bringIntoView + } + + @override + void hideToolbar([bool hideHandles = true]) { + if (getSelectionOverlay()?.toolbar != null) { + getSelectionOverlay()?.hideToolbar(); + } + } + + @override + bool get cutEnabled => widget.toolbarOptions.cut && !widget.readOnly; + + @override + bool get copyEnabled => widget.toolbarOptions.copy; + + @override + bool get pasteEnabled => widget.toolbarOptions.paste && !widget.readOnly; + + @override + bool get selectAllEnabled => widget.toolbarOptions.selectAll; +}