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,
fontWeight: FontWeight.w300,
),
const Tuple2(16, 0),
const Tuple2(0, 0),
const VerticalSpacing(16, 0),
const VerticalSpacing(0, 0),
null),
sizeSmall: const TextStyle(fontSize: 9),
),
@ -218,8 +218,8 @@ class _HomePageState extends State<HomePage> {
height: 1.15,
fontWeight: FontWeight.w300,
),
const Tuple2(16, 0),
const Tuple2(0, 0),
const VerticalSpacing(16, 0),
const VerticalSpacing(0, 0),
null),
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/style.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_dialog_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/style.dart';
import '../models/structs/vertical_spacing.dart';
import '../utils/platform.dart';
import 'style_widgets/checkbox_point.dart';
@ -43,11 +44,11 @@ class DefaultTextBlockStyle {
final TextStyle style;
/// Vertical spacing around a text block.
final Tuple2<double, double> verticalSpacing;
final VerticalSpacing verticalSpacing;
/// Vertical spacing for individual lines within a text block.
///
final Tuple2<double, double> lineSpacing;
final VerticalSpacing lineSpacing;
/// Decoration of a text block.
///
@ -124,8 +125,8 @@ class InlineCodeStyle {
class DefaultListBlockStyle extends DefaultTextBlockStyle {
DefaultListBlockStyle(
TextStyle style,
Tuple2<double, double> verticalSpacing,
Tuple2<double, double> lineSpacing,
VerticalSpacing verticalSpacing,
VerticalSpacing lineSpacing,
BoxDecoration? decoration,
this.checkboxUIBuilder,
) : super(style, verticalSpacing, lineSpacing, decoration);
@ -192,7 +193,7 @@ class DefaultStyles {
height: 1.3,
decoration: TextDecoration.none,
);
const baseSpacing = Tuple2<double, double>(6, 0);
const baseSpacing = VerticalSpacing(6, 0);
String fontFamily;
if (isAppleOS(themeData.platform)) {
fontFamily = 'Menlo';
@ -215,8 +216,8 @@ class DefaultStyles {
fontWeight: FontWeight.w300,
decoration: TextDecoration.none,
),
const Tuple2(16, 0),
const Tuple2(0, 0),
const VerticalSpacing(16, 0),
const VerticalSpacing(0, 0),
null),
h2: DefaultTextBlockStyle(
defaultTextStyle.style.copyWith(
@ -226,8 +227,8 @@ class DefaultStyles {
fontWeight: FontWeight.normal,
decoration: TextDecoration.none,
),
const Tuple2(8, 0),
const Tuple2(0, 0),
const VerticalSpacing(8, 0),
const VerticalSpacing(0, 0),
null),
h3: DefaultTextBlockStyle(
defaultTextStyle.style.copyWith(
@ -237,11 +238,14 @@ class DefaultStyles {
fontWeight: FontWeight.w500,
decoration: TextDecoration.none,
),
const Tuple2(8, 0),
const Tuple2(0, 0),
const VerticalSpacing(8, 0),
const VerticalSpacing(0, 0),
null),
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),
italic: const TextStyle(fontStyle: FontStyle.italic),
small: const TextStyle(fontSize: 12),
@ -271,15 +275,15 @@ class DefaultStyles {
height: 1.5,
color: Colors.grey.withOpacity(0.6),
),
const Tuple2(0, 0),
const Tuple2(0, 0),
const VerticalSpacing(0, 0),
const VerticalSpacing(0, 0),
null),
lists: DefaultListBlockStyle(
baseStyle, baseSpacing, const Tuple2(0, 6), null, null),
baseStyle, baseSpacing, const VerticalSpacing(0, 6), null, null),
quote: DefaultTextBlockStyle(
TextStyle(color: baseStyle.color!.withOpacity(0.6)),
baseSpacing,
const Tuple2(6, 2),
const VerticalSpacing(6, 2),
BoxDecoration(
border: Border(
left: BorderSide(width: 4, color: Colors.grey.shade300),
@ -293,17 +297,23 @@ class DefaultStyles {
height: 1.15,
),
baseSpacing,
const Tuple2(0, 0),
const VerticalSpacing(0, 0),
BoxDecoration(
color: Colors.grey.shade50,
borderRadius: BorderRadius.circular(2),
)),
indent: DefaultTextBlockStyle(
baseStyle, baseSpacing, const Tuple2(0, 6), null),
baseStyle, baseSpacing, const VerticalSpacing(0, 6), null),
align: DefaultTextBlockStyle(
baseStyle, const Tuple2(0, 0), const Tuple2(0, 0), null),
baseStyle,
const VerticalSpacing(0, 0),
const VerticalSpacing(0, 0),
null),
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),
sizeLarge: const TextStyle(fontSize: 18),
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/node.dart';
import '../models/documents/style.dart';
import '../models/structs/vertical_spacing.dart';
import '../utils/cast.dart';
import '../utils/delta.dart';
import '../utils/embeds.dart';
@ -413,7 +414,7 @@ class RawEditorState extends EditorState
/// baseline.
// This implies that the first line has no styles applied to it.
final baselinePadding =
EdgeInsets.only(top: _styles!.paragraph!.verticalSpacing.item1);
EdgeInsets.only(top: _styles!.paragraph!.verticalSpacing.top);
child = BaselineProxy(
textStyle: _styles!.paragraph!.style,
padding: baselinePadding,
@ -777,7 +778,7 @@ class RawEditorState extends EditorState
return editableTextLine;
}
Tuple2<double, double> _getVerticalSpacingForLine(
VerticalSpacing _getVerticalSpacingForLine(
Line line, DefaultStyles? defaultStyles) {
final attrs = line.style.attributes;
if (attrs.containsKey(Attribute.header.key)) {
@ -802,7 +803,7 @@ class RawEditorState extends EditorState
return defaultStyles!.paragraph!.verticalSpacing;
}
Tuple2<double, double> _getVerticalSpacingForBlock(
VerticalSpacing _getVerticalSpacingForBlock(
Block node, DefaultStyles? defaultStyles) {
final attrs = node.style.attributes;
if (attrs.containsKey(Attribute.blockQuote.key)) {
@ -816,7 +817,7 @@ class RawEditorState extends EditorState
} else if (attrs.containsKey(Attribute.align.key)) {
return defaultStyles!.align!.verticalSpacing;
}
return const Tuple2(0, 0);
return const VerticalSpacing(0, 0);
}
@override

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

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

Loading…
Cancel
Save