Skip to content

feat: Update CssBoxWidget to handle rtl marker boxes #1270

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -296,11 +296,11 @@ class MyHomePageState extends State<MyHomePage> {
backgroundColor: const Color.fromARGB(0x50, 0xee, 0xee, 0xee),
),
"th": Style(
padding: const EdgeInsets.all(6),
padding: HtmlPaddings.all(6),
backgroundColor: Colors.grey,
),
"td": Style(
padding: const EdgeInsets.all(6),
padding: HtmlPaddings.all(6),
border: const Border(bottom: BorderSide(color: Colors.grey)),
),
'h5': Style(maxLines: 2, textOverflow: TextOverflow.ellipsis),
Expand Down
13 changes: 10 additions & 3 deletions lib/src/builtins/styled_element_builtin.dart
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,6 @@ class StyledElementBuiltIn extends HtmlExtension {
continue italics;
case "div":
styledElement.style = Style(
margin: Margins.all(0),
display: Display.block,
);
break;
Expand Down Expand Up @@ -338,14 +337,22 @@ class StyledElementBuiltIn extends HtmlExtension {
styledElement.style = Style(
display: Display.block,
listStyleType: ListStyleType.decimal,
padding: const EdgeInsets.only(left: 40),
padding: HtmlPaddings.only(inlineStart: 40),
margin: Margins(
blockStart: Margin(1, Unit.em),
blockEnd: Margin(1, Unit.em),
),
);
break;
case "ul":
styledElement.style = Style(
display: Display.block,
listStyleType: ListStyleType.disc,
padding: const EdgeInsets.only(left: 40),
padding: HtmlPaddings.only(inlineStart: 40),
margin: Margins(
blockStart: Margin(1, Unit.em),
blockEnd: Margin(1, Unit.em),
),
);
break;
case "p":
Expand Down
64 changes: 47 additions & 17 deletions lib/src/css_box_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,19 @@ class CssBoxWidget extends StatelessWidget {
? _generateMarkerBoxSpan(style)
: null;

final direction = _checkTextDirection(context, textDirection);
final padding = style.padding?.resolve(direction);

return _CSSBoxRenderer(
width: style.width ?? Width.auto(),
height: style.height ?? Height.auto(),
paddingSize: style.padding?.collapsedSize ?? Size.zero,
paddingSize: padding?.collapsedSize ?? Size.zero,
borderSize: style.border?.dimensions.collapsedSize ?? Size.zero,
margins: style.margin ?? Margins.zero,
display: style.display ?? Display.inline,
childIsReplaced: childIsReplaced,
emValue: _calculateEmValue(style, context),
textDirection: _checkTextDirection(context, textDirection),
textDirection: direction,
shrinkWrap: shrinkWrap,
children: [
Container(
Expand All @@ -74,7 +77,7 @@ class CssBoxWidget extends StatelessWidget {
color: style.backgroundColor, //Colors the padding and content boxes
),
width: _shouldExpandToFillBlock() ? double.infinity : null,
padding: style.padding ?? EdgeInsets.zero,
padding: padding,
child: top
? child
: MediaQuery(
Expand Down Expand Up @@ -224,8 +227,8 @@ class _CSSBoxRenderer extends MultiChildRenderObjectWidget {
final bool shrinkWrap;

@override
_RenderCSSBox createRenderObject(BuildContext context) {
return _RenderCSSBox(
RenderCSSBox createRenderObject(BuildContext context) {
return RenderCSSBox(
display: display,
width: width..normalize(emValue),
height: height..normalize(emValue),
Expand All @@ -239,7 +242,7 @@ class _CSSBoxRenderer extends MultiChildRenderObjectWidget {
}

@override
void updateRenderObject(BuildContext context, _RenderCSSBox renderObject) {
void updateRenderObject(BuildContext context, RenderCSSBox renderObject) {
renderObject
..display = display
..width = (width..normalize(emValue))
Expand All @@ -253,10 +256,21 @@ class _CSSBoxRenderer extends MultiChildRenderObjectWidget {
}

Margins _preProcessMargins(Margins margins, bool shrinkWrap) {
Margin leftMargin = margins.left ?? Margin.zero();
Margin rightMargin = margins.right ?? Margin.zero();
Margin topMargin = margins.top ?? Margin.zero();
Margin bottomMargin = margins.bottom ?? Margin.zero();
late Margin leftMargin;
late Margin rightMargin;
Margin topMargin = margins.top ?? margins.blockStart ?? Margin.zero();
Margin bottomMargin = margins.bottom ?? margins.blockEnd ?? Margin.zero();

switch (textDirection) {
case TextDirection.rtl:
leftMargin = margins.left ?? margins.inlineEnd ?? Margin.zero();
rightMargin = margins.right ?? margins.inlineStart ?? Margin.zero();
break;
case TextDirection.ltr:
leftMargin = margins.left ?? margins.inlineStart ?? Margin.zero();
rightMargin = margins.right ?? margins.inlineEnd ?? Margin.zero();
break;
}

//Preprocess margins to a pixel value
leftMargin.normalize(emValue);
Expand Down Expand Up @@ -295,12 +309,14 @@ class _CSSBoxRenderer extends MultiChildRenderObjectWidget {
}
}

@visibleForTesting

/// Implements the CSS layout algorithm
class _RenderCSSBox extends RenderBox
class RenderCSSBox extends RenderBox
with
ContainerRenderObjectMixin<RenderBox, CSSBoxParentData>,
RenderBoxContainerDefaultsMixin<RenderBox, CSSBoxParentData> {
_RenderCSSBox({
RenderCSSBox({
required Display display,
required Width width,
required Height height,
Expand Down Expand Up @@ -593,7 +609,20 @@ class _RenderCSSBox extends RenderBox
final offsetHeight = distance -
(markerBox.getDistanceToBaseline(TextBaseline.alphabetic) ??
markerBox.size.height);
markerBoxParentData.offset = Offset(-markerBox.size.width, offsetHeight);
switch (_textDirection) {
case TextDirection.rtl:
markerBoxParentData.offset = Offset(
child.size.width,
offsetHeight,
);
break;
case TextDirection.ltr:
markerBoxParentData.offset = Offset(
-markerBox.size.width,
offsetHeight,
);
break;
}
}
}

Expand Down Expand Up @@ -701,10 +730,11 @@ class _RenderCSSBox extends RenderBox
}

return Margins(
left: marginLeft,
right: marginRight,
top: margins.top,
bottom: margins.bottom);
left: marginLeft,
right: marginRight,
top: margins.top,
bottom: margins.bottom,
);
}

@override
Expand Down
Loading