Przeglądaj źródła

fix: checkbox + underline doesn’t work when the checkbox is checked

Lucas.Xu 2 lat temu
rodzic
commit
ad26f9c86d

+ 6 - 2
frontend/app_flowy/packages/flowy_editor/lib/src/render/rich_text/checkbox_text.dart

@@ -72,8 +72,8 @@ class _CheckboxNodeWidgetState extends State<CheckboxNodeWidget>
             crossAxisAlignment: CrossAxisAlignment.start,
             children: [
               GestureDetector(
+                key: iconKey,
                 child: FlowySvg(
-                  key: iconKey,
                   size: Size.square(_iconSize),
                   padding: EdgeInsets.only(
                       top: topPadding, right: _iconRightPadding),
@@ -149,7 +149,11 @@ class _CheckboxNodeWidgetState extends State<CheckboxNodeWidget>
               style: widget.textNode.attributes.check
                   ? span.style?.copyWith(
                       color: Colors.grey,
-                      decoration: TextDecoration.lineThrough,
+                      decoration: TextDecoration.combine([
+                        TextDecoration.lineThrough,
+                        if (span.style?.decoration != null)
+                          span.style!.decoration!
+                      ]),
                     )
                   : span.style,
               recognizer: span.recognizer,

+ 2 - 4
frontend/app_flowy/packages/flowy_editor/test/infra/test_editor.dart

@@ -47,13 +47,11 @@ class EditorWidgetTester {
     insert(TextNode.empty());
   }
 
-  void insertTextNode(String? text, {Attributes? attributes}) {
+  void insertTextNode(String? text, {Attributes? attributes, Delta? delta}) {
     insert(
       TextNode(
         type: 'text',
-        delta: Delta(
-          [TextInsert(text ?? 'Test')],
-        ),
+        delta: delta ?? Delta([TextInsert(text ?? 'Test')]),
         attributes: attributes,
       ),
     );

+ 73 - 0
frontend/app_flowy/packages/flowy_editor/test/render/rich_text/checkbox_text_test.dart

@@ -0,0 +1,73 @@
+import 'package:flowy_editor/flowy_editor.dart';
+import 'package:flowy_editor/src/render/rich_text/default_selectable.dart';
+import 'package:flowy_editor/src/render/rich_text/rich_text_style.dart';
+import 'package:flowy_editor/src/extensions/text_node_extensions.dart';
+import 'package:flutter_test/flutter_test.dart';
+import '../../infra/test_editor.dart';
+
+void main() async {
+  setUpAll(() {
+    TestWidgetsFlutterBinding.ensureInitialized();
+  });
+
+  group('delete_text_handler.dart', () {
+    testWidgets('Presses backspace key in empty document', (tester) async {
+      // Before
+      //
+      // [BIUS]Welcome to Appflowy 😁[BIUS]
+      //
+      // After
+      //
+      // [checkbox]Welcome to Appflowy 😁
+      //
+      const text = 'Welcome to Appflowy 😁';
+      final editor = tester.editor
+        ..insertTextNode(
+          '',
+          attributes: {
+            StyleKey.subtype: StyleKey.checkbox,
+            StyleKey.checkbox: false,
+          },
+          delta: Delta([
+            TextInsert(text, {
+              StyleKey.bold: true,
+              StyleKey.italic: true,
+              StyleKey.underline: true,
+              StyleKey.strikethrough: true,
+            }),
+          ]),
+        );
+      await editor.startTesting();
+      await editor.updateSelection(
+        Selection.single(path: [0], startOffset: 0),
+      );
+
+      final selection =
+          Selection.single(path: [0], startOffset: 0, endOffset: text.length);
+      var node = editor.nodeAtPath([0]) as TextNode;
+      var state = node.key?.currentState as DefaultSelectable;
+      var checkboxWidget = find.byKey(state.iconKey!);
+      await tester.tap(checkboxWidget);
+      await tester.pumpAndSettle();
+
+      expect(node.attributes.check, true);
+
+      expect(node.allSatisfyBoldInSelection(selection), true);
+      expect(node.allSatisfyItalicInSelection(selection), true);
+      expect(node.allSatisfyUnderlineInSelection(selection), true);
+      expect(node.allSatisfyStrikethroughInSelection(selection), true);
+
+      node = editor.nodeAtPath([0]) as TextNode;
+      state = node.key?.currentState as DefaultSelectable;
+      await tester.ensureVisible(find.byKey(state.iconKey!));
+      await tester.tap(find.byKey(state.iconKey!));
+      await tester.pump();
+
+      expect(node.attributes.check, false);
+      expect(node.allSatisfyBoldInSelection(selection), true);
+      expect(node.allSatisfyItalicInSelection(selection), true);
+      expect(node.allSatisfyUnderlineInSelection(selection), true);
+      expect(node.allSatisfyStrikethroughInSelection(selection), true);
+    });
+  });
+}