Create struct for vertical spacing

pull/1128/head
Adil Hanney 2 years ago
parent 1f271abe6a
commit db1ad0b13f
  1. 8
      example/lib/pages/home_page.dart
  2. 1
      lib/flutter_quill.dart
  3. 9
      lib/src/models/structs/vertical_spacing.dart
  4. 50
      lib/src/widgets/default_styles.dart
  5. 9
      lib/src/widgets/raw_editor.dart
  6. 31
      lib/src/widgets/text_block.dart
  7. 7
      lib/src/widgets/text_line.dart

@ -183,8 +183,8 @@ class _HomePageState extends State<HomePage> {
height: 1.15, height: 1.15,
fontWeight: FontWeight.w300, fontWeight: FontWeight.w300,
), ),
const Tuple2(16, 0), const VerticalSpacing(16, 0),
const Tuple2(0, 0), const VerticalSpacing(0, 0),
null), null),
sizeSmall: const TextStyle(fontSize: 9), sizeSmall: const TextStyle(fontSize: 9),
), ),
@ -218,8 +218,8 @@ class _HomePageState extends State<HomePage> {
height: 1.15, height: 1.15,
fontWeight: FontWeight.w300, fontWeight: FontWeight.w300,
), ),
const Tuple2(16, 0), const VerticalSpacing(16, 0),
const Tuple2(0, 0), const VerticalSpacing(0, 0),
null), null),
sizeSmall: const TextStyle(fontSize: 9), sizeSmall: const TextStyle(fontSize: 9),
), ),

@ -9,6 +9,7 @@ export 'src/models/documents/nodes/line.dart';
export 'src/models/documents/nodes/node.dart'; export 'src/models/documents/nodes/node.dart';
export 'src/models/documents/style.dart'; export 'src/models/documents/style.dart';
export 'src/models/quill_delta.dart'; export 'src/models/quill_delta.dart';
export 'src/models/structs/vertical_spacing.dart';
export 'src/models/themes/quill_custom_button.dart'; export 'src/models/themes/quill_custom_button.dart';
export 'src/models/themes/quill_dialog_theme.dart'; export 'src/models/themes/quill_dialog_theme.dart';
export 'src/models/themes/quill_icon_theme.dart'; export 'src/models/themes/quill_icon_theme.dart';

@ -0,0 +1,9 @@
class VerticalSpacing {
const VerticalSpacing(
this.top,
this.bottom,
);
final double top;
final double bottom;
}

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import '../models/documents/attribute.dart'; import '../models/documents/attribute.dart';
import '../models/documents/style.dart'; import '../models/documents/style.dart';
import '../models/structs/vertical_spacing.dart';
import '../utils/platform.dart'; import '../utils/platform.dart';
import 'style_widgets/checkbox_point.dart'; import 'style_widgets/checkbox_point.dart';
@ -43,11 +44,11 @@ class DefaultTextBlockStyle {
final TextStyle style; final TextStyle style;
/// Vertical spacing around a text block. /// Vertical spacing around a text block.
final Tuple2<double, double> verticalSpacing; final VerticalSpacing verticalSpacing;
/// Vertical spacing for individual lines within a text block. /// Vertical spacing for individual lines within a text block.
/// ///
final Tuple2<double, double> lineSpacing; final VerticalSpacing lineSpacing;
/// Decoration of a text block. /// Decoration of a text block.
/// ///
@ -124,8 +125,8 @@ class InlineCodeStyle {
class DefaultListBlockStyle extends DefaultTextBlockStyle { class DefaultListBlockStyle extends DefaultTextBlockStyle {
DefaultListBlockStyle( DefaultListBlockStyle(
TextStyle style, TextStyle style,
Tuple2<double, double> verticalSpacing, VerticalSpacing verticalSpacing,
Tuple2<double, double> lineSpacing, VerticalSpacing lineSpacing,
BoxDecoration? decoration, BoxDecoration? decoration,
this.checkboxUIBuilder, this.checkboxUIBuilder,
) : super(style, verticalSpacing, lineSpacing, decoration); ) : super(style, verticalSpacing, lineSpacing, decoration);
@ -192,7 +193,7 @@ class DefaultStyles {
height: 1.3, height: 1.3,
decoration: TextDecoration.none, decoration: TextDecoration.none,
); );
const baseSpacing = Tuple2<double, double>(6, 0); const baseSpacing = VerticalSpacing(6, 0);
String fontFamily; String fontFamily;
if (isAppleOS(themeData.platform)) { if (isAppleOS(themeData.platform)) {
fontFamily = 'Menlo'; fontFamily = 'Menlo';
@ -215,8 +216,8 @@ class DefaultStyles {
fontWeight: FontWeight.w300, fontWeight: FontWeight.w300,
decoration: TextDecoration.none, decoration: TextDecoration.none,
), ),
const Tuple2(16, 0), const VerticalSpacing(16, 0),
const Tuple2(0, 0), const VerticalSpacing(0, 0),
null), null),
h2: DefaultTextBlockStyle( h2: DefaultTextBlockStyle(
defaultTextStyle.style.copyWith( defaultTextStyle.style.copyWith(
@ -226,8 +227,8 @@ class DefaultStyles {
fontWeight: FontWeight.normal, fontWeight: FontWeight.normal,
decoration: TextDecoration.none, decoration: TextDecoration.none,
), ),
const Tuple2(8, 0), const VerticalSpacing(8, 0),
const Tuple2(0, 0), const VerticalSpacing(0, 0),
null), null),
h3: DefaultTextBlockStyle( h3: DefaultTextBlockStyle(
defaultTextStyle.style.copyWith( defaultTextStyle.style.copyWith(
@ -237,11 +238,14 @@ class DefaultStyles {
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
decoration: TextDecoration.none, decoration: TextDecoration.none,
), ),
const Tuple2(8, 0), const VerticalSpacing(8, 0),
const Tuple2(0, 0), const VerticalSpacing(0, 0),
null), null),
paragraph: DefaultTextBlockStyle( paragraph: DefaultTextBlockStyle(
baseStyle, const Tuple2(0, 0), const Tuple2(0, 0), null), baseStyle,
const VerticalSpacing(0, 0),
const VerticalSpacing(0, 0),
null),
bold: const TextStyle(fontWeight: FontWeight.bold), bold: const TextStyle(fontWeight: FontWeight.bold),
italic: const TextStyle(fontStyle: FontStyle.italic), italic: const TextStyle(fontStyle: FontStyle.italic),
small: const TextStyle(fontSize: 12), small: const TextStyle(fontSize: 12),
@ -271,15 +275,15 @@ class DefaultStyles {
height: 1.5, height: 1.5,
color: Colors.grey.withOpacity(0.6), color: Colors.grey.withOpacity(0.6),
), ),
const Tuple2(0, 0), const VerticalSpacing(0, 0),
const Tuple2(0, 0), const VerticalSpacing(0, 0),
null), null),
lists: DefaultListBlockStyle( lists: DefaultListBlockStyle(
baseStyle, baseSpacing, const Tuple2(0, 6), null, null), baseStyle, baseSpacing, const VerticalSpacing(0, 6), null, null),
quote: DefaultTextBlockStyle( quote: DefaultTextBlockStyle(
TextStyle(color: baseStyle.color!.withOpacity(0.6)), TextStyle(color: baseStyle.color!.withOpacity(0.6)),
baseSpacing, baseSpacing,
const Tuple2(6, 2), const VerticalSpacing(6, 2),
BoxDecoration( BoxDecoration(
border: Border( border: Border(
left: BorderSide(width: 4, color: Colors.grey.shade300), left: BorderSide(width: 4, color: Colors.grey.shade300),
@ -293,17 +297,23 @@ class DefaultStyles {
height: 1.15, height: 1.15,
), ),
baseSpacing, baseSpacing,
const Tuple2(0, 0), const VerticalSpacing(0, 0),
BoxDecoration( BoxDecoration(
color: Colors.grey.shade50, color: Colors.grey.shade50,
borderRadius: BorderRadius.circular(2), borderRadius: BorderRadius.circular(2),
)), )),
indent: DefaultTextBlockStyle( indent: DefaultTextBlockStyle(
baseStyle, baseSpacing, const Tuple2(0, 6), null), baseStyle, baseSpacing, const VerticalSpacing(0, 6), null),
align: DefaultTextBlockStyle( align: DefaultTextBlockStyle(
baseStyle, const Tuple2(0, 0), const Tuple2(0, 0), null), baseStyle,
const VerticalSpacing(0, 0),
const VerticalSpacing(0, 0),
null),
leading: DefaultTextBlockStyle( leading: DefaultTextBlockStyle(
baseStyle, const Tuple2(0, 0), const Tuple2(0, 0), null), baseStyle,
const VerticalSpacing(0, 0),
const VerticalSpacing(0, 0),
null),
sizeSmall: const TextStyle(fontSize: 10), sizeSmall: const TextStyle(fontSize: 10),
sizeLarge: const TextStyle(fontSize: 18), sizeLarge: const TextStyle(fontSize: 18),
sizeHuge: const TextStyle(fontSize: 22)); sizeHuge: const TextStyle(fontSize: 22));

@ -21,6 +21,7 @@ import '../models/documents/nodes/leaf.dart' as leaf;
import '../models/documents/nodes/line.dart'; import '../models/documents/nodes/line.dart';
import '../models/documents/nodes/node.dart'; import '../models/documents/nodes/node.dart';
import '../models/documents/style.dart'; import '../models/documents/style.dart';
import '../models/structs/vertical_spacing.dart';
import '../utils/cast.dart'; import '../utils/cast.dart';
import '../utils/delta.dart'; import '../utils/delta.dart';
import '../utils/embeds.dart'; import '../utils/embeds.dart';
@ -413,7 +414,7 @@ class RawEditorState extends EditorState
/// baseline. /// baseline.
// This implies that the first line has no styles applied to it. // This implies that the first line has no styles applied to it.
final baselinePadding = final baselinePadding =
EdgeInsets.only(top: _styles!.paragraph!.verticalSpacing.item1); EdgeInsets.only(top: _styles!.paragraph!.verticalSpacing.top);
child = BaselineProxy( child = BaselineProxy(
textStyle: _styles!.paragraph!.style, textStyle: _styles!.paragraph!.style,
padding: baselinePadding, padding: baselinePadding,
@ -777,7 +778,7 @@ class RawEditorState extends EditorState
return editableTextLine; return editableTextLine;
} }
Tuple2<double, double> _getVerticalSpacingForLine( VerticalSpacing _getVerticalSpacingForLine(
Line line, DefaultStyles? defaultStyles) { Line line, DefaultStyles? defaultStyles) {
final attrs = line.style.attributes; final attrs = line.style.attributes;
if (attrs.containsKey(Attribute.header.key)) { if (attrs.containsKey(Attribute.header.key)) {
@ -802,7 +803,7 @@ class RawEditorState extends EditorState
return defaultStyles!.paragraph!.verticalSpacing; return defaultStyles!.paragraph!.verticalSpacing;
} }
Tuple2<double, double> _getVerticalSpacingForBlock( VerticalSpacing _getVerticalSpacingForBlock(
Block node, DefaultStyles? defaultStyles) { Block node, DefaultStyles? defaultStyles) {
final attrs = node.style.attributes; final attrs = node.style.attributes;
if (attrs.containsKey(Attribute.blockQuote.key)) { if (attrs.containsKey(Attribute.blockQuote.key)) {
@ -816,7 +817,7 @@ class RawEditorState extends EditorState
} else if (attrs.containsKey(Attribute.align.key)) { } else if (attrs.containsKey(Attribute.align.key)) {
return defaultStyles!.align!.verticalSpacing; return defaultStyles!.align!.verticalSpacing;
} }
return const Tuple2(0, 0); return const VerticalSpacing(0, 0);
} }
@override @override

@ -4,6 +4,7 @@ import 'package:flutter/rendering.dart';
import '../models/documents/attribute.dart'; import '../models/documents/attribute.dart';
import '../models/documents/nodes/block.dart'; import '../models/documents/nodes/block.dart';
import '../models/documents/nodes/line.dart'; import '../models/documents/nodes/line.dart';
import '../models/structs/vertical_spacing.dart';
import '../utils/delta.dart'; import '../utils/delta.dart';
import 'box.dart'; import 'box.dart';
import 'controller.dart'; import 'controller.dart';
@ -77,7 +78,7 @@ class EditableTextBlock extends StatelessWidget {
final QuillController controller; final QuillController controller;
final TextDirection textDirection; final TextDirection textDirection;
final double scrollBottomInset; final double scrollBottomInset;
final Tuple2 verticalSpacing; final VerticalSpacing verticalSpacing;
final TextSelection textSelection; final TextSelection textSelection;
final Color color; final Color color;
final DefaultStyles? styles; final DefaultStyles? styles;
@ -101,7 +102,7 @@ class EditableTextBlock extends StatelessWidget {
return _EditableBlock( return _EditableBlock(
block: block, block: block,
textDirection: textDirection, textDirection: textDirection,
padding: verticalSpacing as Tuple2<double, double>, padding: verticalSpacing,
scrollBottomInset: scrollBottomInset, scrollBottomInset: scrollBottomInset,
decoration: _getDecorationForBlock(block, defaultStyles) ?? decoration: _getDecorationForBlock(block, defaultStyles) ??
const BoxDecoration(), const BoxDecoration(),
@ -242,7 +243,7 @@ class EditableTextBlock extends StatelessWidget {
return baseIndent + extraIndent; return baseIndent + extraIndent;
} }
Tuple2 _getSpacingForLine( VerticalSpacing _getSpacingForLine(
Line node, int index, int count, DefaultStyles? defaultStyles) { Line node, int index, int count, DefaultStyles? defaultStyles) {
var top = 0.0, bottom = 0.0; var top = 0.0, bottom = 0.0;
@ -251,22 +252,22 @@ class EditableTextBlock extends StatelessWidget {
final level = attrs[Attribute.header.key]!.value; final level = attrs[Attribute.header.key]!.value;
switch (level) { switch (level) {
case 1: case 1:
top = defaultStyles!.h1!.verticalSpacing.item1; top = defaultStyles!.h1!.verticalSpacing.top;
bottom = defaultStyles.h1!.verticalSpacing.item2; bottom = defaultStyles.h1!.verticalSpacing.bottom;
break; break;
case 2: case 2:
top = defaultStyles!.h2!.verticalSpacing.item1; top = defaultStyles!.h2!.verticalSpacing.top;
bottom = defaultStyles.h2!.verticalSpacing.item2; bottom = defaultStyles.h2!.verticalSpacing.bottom;
break; break;
case 3: case 3:
top = defaultStyles!.h3!.verticalSpacing.item1; top = defaultStyles!.h3!.verticalSpacing.top;
bottom = defaultStyles.h3!.verticalSpacing.item2; bottom = defaultStyles.h3!.verticalSpacing.bottom;
break; break;
default: default:
throw 'Invalid level $level'; throw 'Invalid level $level';
} }
} else { } else {
late Tuple2 lineSpacing; late VerticalSpacing lineSpacing;
if (attrs.containsKey(Attribute.blockQuote.key)) { if (attrs.containsKey(Attribute.blockQuote.key)) {
lineSpacing = defaultStyles!.quote!.lineSpacing; lineSpacing = defaultStyles!.quote!.lineSpacing;
} else if (attrs.containsKey(Attribute.indent.key)) { } else if (attrs.containsKey(Attribute.indent.key)) {
@ -281,8 +282,8 @@ class EditableTextBlock extends StatelessWidget {
// use paragraph linespacing as a default // use paragraph linespacing as a default
lineSpacing = defaultStyles!.paragraph!.lineSpacing; lineSpacing = defaultStyles!.paragraph!.lineSpacing;
} }
top = lineSpacing.item1; top = lineSpacing.top;
bottom = lineSpacing.item2; bottom = lineSpacing.bottom;
} }
if (index == 1) { if (index == 1) {
@ -293,7 +294,7 @@ class EditableTextBlock extends StatelessWidget {
bottom = 0.0; bottom = 0.0;
} }
return Tuple2(top, bottom); return VerticalSpacing(top, bottom);
} }
} }
@ -600,13 +601,13 @@ class _EditableBlock extends MultiChildRenderObjectWidget {
final Block block; final Block block;
final TextDirection textDirection; final TextDirection textDirection;
final Tuple2<double, double> padding; final VerticalSpacing padding;
final double scrollBottomInset; final double scrollBottomInset;
final Decoration decoration; final Decoration decoration;
final EdgeInsets? contentPadding; final EdgeInsets? contentPadding;
EdgeInsets get _padding => EdgeInsets get _padding =>
EdgeInsets.only(top: padding.item1, bottom: padding.item2); EdgeInsets.only(top: padding.top, bottom: padding.bottom);
EdgeInsets get _contentPadding => contentPadding ?? EdgeInsets.zero; EdgeInsets get _contentPadding => contentPadding ?? EdgeInsets.zero;

@ -15,6 +15,7 @@ import '../models/documents/nodes/leaf.dart' as leaf;
import '../models/documents/nodes/line.dart'; import '../models/documents/nodes/line.dart';
import '../models/documents/nodes/node.dart'; import '../models/documents/nodes/node.dart';
import '../models/documents/style.dart'; import '../models/documents/style.dart';
import '../models/structs/vertical_spacing.dart';
import '../utils/color.dart'; import '../utils/color.dart';
import '../utils/font.dart'; import '../utils/font.dart';
import '../utils/platform.dart'; import '../utils/platform.dart';
@ -475,7 +476,7 @@ class EditableTextLine extends RenderObjectWidget {
final Widget? leading; final Widget? leading;
final Widget body; final Widget body;
final double indentWidth; final double indentWidth;
final Tuple2 verticalSpacing; final VerticalSpacing verticalSpacing;
final TextDirection textDirection; final TextDirection textDirection;
final TextSelection textSelection; final TextSelection textSelection;
final Color color; final Color color;
@ -525,8 +526,8 @@ class EditableTextLine extends RenderObjectWidget {
EdgeInsetsGeometry _getPadding() { EdgeInsetsGeometry _getPadding() {
return EdgeInsetsDirectional.only( return EdgeInsetsDirectional.only(
start: indentWidth, start: indentWidth,
top: verticalSpacing.item1, top: verticalSpacing.top,
bottom: verticalSpacing.item2); bottom: verticalSpacing.bottom);
} }
} }

Loading…
Cancel
Save