AppFlowy/doc/EDITOR.md
2021-10-22 11:42:25 +08:00

9.1 KiB

//          Widget                                 Element                      RenderObject
//
//                                    │                                │
//
//    ┌─────────────────────┐         │   ┌────────────────────────┐   │  ┌─────────────────────────┐
//    │ RenderObjectWidget  │◀────────────│    _TextLineElement    │─────▶│ RenderEditableTextLine  │
//    └─────────────────────┘         │   └────────────────────────┘   │  └─────────────────────────┘
//               △                                     │                               │
//               │                    │                │               │     ┌─────────▽────────┐
//               │                                     ▽                     │RenderEditableBox │
//    ┌────────────────────┐          │    ┌──────────────────────┐    │     └──────────────────┘
// ┌──│  EditableTextLine  │               │ RenderObjectElement  │                    │
// │  └────────────────────┘          │    └──────────────────────┘    │               ▽
// │                                                                            ┌────────────┐
// │                                  │                                │        │ RenderBox  │
// │                                                                            └────────────┘
// │    body   ┌────────────┐         │                                │               │
// ├──────────▶│  TextLine  │                                                          ▽
// │           └────────────┘         │                                │        ┌─────────────┐
// │                                                                            │RenderObject │
// │           ┌────────────┐         │                                │        └─────────────┘
// └──────────▶│    Line    │
//             └────────────┘         │                                │
//
//                                    │                                │          Layout, size, painting and
// Widget: holds the config for a             Represents an actual                comositing
// piece of UI.                       │       piece of UI              │
//
//
// ┌────────────────────────┐  ┌──────────────────┐
// │   RawGestureDetector   │─▶│   RenderEditor   │──┐
// └────────────────────────┘  └──────────────────┘  │
//                                                   │
//                1. pass the gesture event          │
//                                                   │
//                                                   │
//            ┌───────────────────────────────────┐  │   ┌────────────────┐             ┌──────────────────┐   ┌──────────────────────────────┐
//            │RawEditorStateTextInputClientMixin │──┼──▶│QuillController │◀──listen────│   RenderState    │──▶│  _didChangeTextEditingValue  │
//            └───────────────────────────────────┘  │   └────────────────┘             └──────────────────┘   └──────────────────────────────┘
//                                                   │            │                               ▲                            │
//                1. pass the text input event       │            │                               │                            ▼
//                                                   │            └─────2. notify change──────────┘           ┌─────────────────────────────────┐
//                                                   │                                                        │    _onChangeTextEditingValue    │
//                 ┌─────────────────────────────┐   │                                                        └─────────────────────────────────┘
//                 │ RawEditorStateKeyboardMixin │───┘                                                                         │
//                 └─────────────────────────────┘                                                                             ▼
//                                                                                                                 ┌──────────────────────┐   Update the ScrollController's pos after
//                1. pass the keyboard cur/ delete/ shortcut event                                                 │  _showCaretOnScreen  │   post frame
//                                                                                                                 └──────────────────────┘
//                                                                                                                             │
//                                                                                                                             ▼
//                                                                                                                 ┌──────────────────────┐
//                                                                                                                 │ Config cursor timer  │
//                                                                                                                 └──────────────────────┘
//                                                                                                                             │
//                                                                                                                             ▼
//                                                                                                                 ┌───────────────────────┐  ┌───────────────────────────────────┐
//                                                                                                                 │ addPostFrameCallback  │─▶│_updateOrDisposeSelectionOverlayIfN│
//                                                                                                                 └───────────────────────┘  └───────────────────────────────────┘
//                                                                                                                             │
//                                                                                                                             │
//                                                                                                                             ▼
//                                                                                                                      ┌────────────┐
//                                                                                                                      │  setState  │        make the RenderState to rebuild
//                                                                                                                      └────────────┘