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.
pull/233/head
Till Friebe 4 years ago
parent 0c05c530e3
commit ac68c2373d
  1. 78
      lib/widgets/raw_editor.dart
  2. 40
      lib/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart

@ -23,6 +23,7 @@ import 'editor.dart';
import 'keyboard_listener.dart'; import 'keyboard_listener.dart';
import 'proxy.dart'; import 'proxy.dart';
import 'raw_editor/raw_editor_state_keyboard_mixin.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 'raw_editor/raw_editor_state_text_input_client_mixin.dart';
import 'text_block.dart'; import 'text_block.dart';
import 'text_line.dart'; import 'text_line.dart';
@ -90,9 +91,7 @@ class RawEditor extends StatefulWidget {
final EmbedBuilder embedBuilder; final EmbedBuilder embedBuilder;
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() => RawEditorState();
return RawEditorState();
}
} }
class RawEditorState extends EditorState class RawEditorState extends EditorState
@ -101,44 +100,39 @@ class RawEditorState extends EditorState
WidgetsBindingObserver, WidgetsBindingObserver,
TickerProviderStateMixin<RawEditor>, TickerProviderStateMixin<RawEditor>,
RawEditorStateKeyboardMixin, RawEditorStateKeyboardMixin,
RawEditorStateTextInputClientMixin RawEditorStateTextInputClientMixin,
implements TextSelectionDelegate, TextInputClient { RawEditorStateSelectionDelegateMixin {
final GlobalKey _editorKey = GlobalKey(); final GlobalKey _editorKey = GlobalKey();
EditorTextSelectionOverlay? _selectionOverlay;
FocusAttachment? _focusAttachment; // Keyboard
late CursorCont _cursorCont; late KeyboardListener _keyboardListener;
ScrollController? _scrollController;
KeyboardVisibilityController? _keyboardVisibilityController; KeyboardVisibilityController? _keyboardVisibilityController;
StreamSubscription<bool>? _keyboardVisibilitySubscription; StreamSubscription<bool>? _keyboardVisibilitySubscription;
late KeyboardListener _keyboardListener;
bool _didAutoFocus = false;
bool _keyboardVisible = 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; DefaultStyles? _styles;
final ClipboardStatusNotifier? _clipboardStatus = final ClipboardStatusNotifier? _clipboardStatus =
kIsWeb ? null : ClipboardStatusNotifier(); kIsWeb ? null : ClipboardStatusNotifier();
final LayerLink _toolbarLayerLink = LayerLink(); final LayerLink _toolbarLayerLink = LayerLink();
final LayerLink _startHandleLayerLink = LayerLink(); final LayerLink _startHandleLayerLink = LayerLink();
final LayerLink _endHandleLayerLink = LayerLink(); final LayerLink _endHandleLayerLink = LayerLink();
bool get _hasFocus => widget.focusNode.hasFocus; TextDirection get _textDirection => Directionality.of(context);
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) {}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -593,35 +587,11 @@ class RawEditorState extends EditorState
return _editorKey.currentContext!.findRenderObject() as RenderEditor?; return _editorKey.currentContext!.findRenderObject() as RenderEditor?;
} }
@override
EditorTextSelectionOverlay? getSelectionOverlay() {
return _selectionOverlay;
}
@override @override
TextEditingValue getTextEditingValue() { TextEditingValue getTextEditingValue() {
return widget.controller.plainTextEditingValue; 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 @override
void requestKeyboard() { void requestKeyboard() {
if (_hasFocus) { if (_hasFocus) {

@ -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;
}
Loading…
Cancel
Save