Przeglądaj źródła

feat: support rendering text background color and text color

Lucas.Xu 2 lat temu
rodzic
commit
f4a31768cb

+ 5 - 1
frontend/app_flowy/packages/flowy_editor/example/assets/example.json

@@ -37,7 +37,11 @@
         "type": "text",
         "type": "text",
         "delta": [
         "delta": [
           {
           {
-            "insert": "At AppFlowy, we embody what we value deep in our hearts, taking inspiration from other great companies while forging our own path. AppFlowy’s five core values are Mission Driven, Aim High & Iterate, Transparency, Collaboration, and Honesty. Together, they spell MATCH. We will continue to iterate and refine these values as we grow."
+            "insert": "At "
+          },
+          { "insert": "AppFlowy", "attributes": { "code": true, "bold": true, "color": "0xFFED459C"} },
+          {
+            "insert": ", we embody what we value deep in our hearts, taking inspiration from other great companies while forging our own path. AppFlowy’s five core values are Mission Driven, Aim High & Iterate, Transparency, Collaboration, and Honesty. Together, they spell MATCH. We will continue to iterate and refine these values as we grow."
           }
           }
         ]
         ]
       },
       },

+ 31 - 15
frontend/app_flowy/packages/flowy_editor/lib/render/rich_text/rich_text_style.dart

@@ -183,19 +183,30 @@ class RichTextStyle {
     return TextSpan(
     return TextSpan(
       text: text,
       text: text,
       style: TextStyle(
       style: TextStyle(
-        fontWeight: fontWeight,
-        fontStyle: fontStyle,
-        fontSize: fontSize,
-        color: textColor,
-        backgroundColor: backgroundColor,
-        decoration: textDecoration,
+        fontWeight: _fontWeight,
+        fontStyle: _fontStyle,
+        fontSize: _fontSize,
+        color: _textColor,
+        decoration: _textDecoration,
+        background: _background,
       ),
       ),
-      recognizer: recognizer,
+      recognizer: _recognizer,
     );
     );
   }
   }
 
 
+  Paint? get _background {
+    if (_backgroundColor != null) {
+      return Paint()
+        ..color = _backgroundColor!
+        ..strokeWidth = 24.0
+        ..style = PaintingStyle.fill
+        ..strokeJoin = StrokeJoin.round;
+    }
+    return null;
+  }
+
   // bold
   // bold
-  FontWeight get fontWeight {
+  FontWeight get _fontWeight {
     if (attributes.bold) {
     if (attributes.bold) {
       return FontWeight.bold;
       return FontWeight.bold;
     }
     }
@@ -203,7 +214,7 @@ class RichTextStyle {
   }
   }
 
 
   // underline or strikethrough
   // underline or strikethrough
-  TextDecoration get textDecoration {
+  TextDecoration get _textDecoration {
     var decorations = [TextDecoration.none];
     var decorations = [TextDecoration.none];
     if (attributes.underline || attributes.href != null) {
     if (attributes.underline || attributes.href != null) {
       decorations.add(TextDecoration.underline);
       decorations.add(TextDecoration.underline);
@@ -216,28 +227,33 @@ class RichTextStyle {
   }
   }
 
 
   // font
   // font
-  FontStyle get fontStyle =>
+  FontStyle get _fontStyle =>
       attributes.italic ? FontStyle.italic : FontStyle.normal;
       attributes.italic ? FontStyle.italic : FontStyle.normal;
 
 
   // text color
   // text color
-  Color get textColor {
+  Color get _textColor {
     if (attributes.href != null) {
     if (attributes.href != null) {
       return Colors.lightBlue;
       return Colors.lightBlue;
     }
     }
     return attributes.color ?? Colors.black;
     return attributes.color ?? Colors.black;
   }
   }
 
 
-  Color get backgroundColor {
-    return attributes.highlightColor ?? Colors.transparent;
+  Color? get _backgroundColor {
+    if (attributes.highlightColor != null) {
+      return attributes.highlightColor!;
+    } else if (attributes.code) {
+      return Colors.grey.withOpacity(0.4);
+    }
+    return null;
   }
   }
 
 
   // font size
   // font size
-  double get fontSize {
+  double get _fontSize {
     return baseFontSize;
     return baseFontSize;
   }
   }
 
 
   // recognizer
   // recognizer
-  GestureRecognizer? get recognizer {
+  GestureRecognizer? get _recognizer {
     final href = attributes.href;
     final href = attributes.href;
     if (href != null) {
     if (href != null) {
       return TapGestureRecognizer()
       return TapGestureRecognizer()