Skip to content

Commit

Permalink
fixed text / strut styles
Browse files Browse the repository at this point in the history
  • Loading branch information
deckerst committed Dec 20, 2023
1 parent 2d5de66 commit 81977ea
Show file tree
Hide file tree
Showing 18 changed files with 59 additions and 59 deletions.
4 changes: 0 additions & 4 deletions lib/theme/styles.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,6 @@ import 'dart:ui';
import 'package:flutter/painting.dart';

class AStyles {
// as of Flutter v2.8.0, overflowing `Text` miscalculates height and some text (e.g. 'Å') is clipped
// so we give it a `strutStyle` with a slightly larger height
static const overflowStrut = StrutStyle(height: 1.3);

static const knownTitleText = TextStyle(
fontSize: 20,
fontWeight: FontWeight.w300,
Expand Down
1 change: 0 additions & 1 deletion lib/widgets/about/translators.dart
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,6 @@ class _RandomTextSpanHighlighterState extends State<_RandomTextSpanHighlighter>
])
],
),
strutStyle: const StrutStyle(height: 1.5, forceStrutHeight: true),
);
}
}
2 changes: 0 additions & 2 deletions lib/widgets/collection/grid/list_details.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import 'package:aves/model/settings/enums/coordinate_format.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/theme/format.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/theme/text.dart';
import 'package:aves/utils/collection_utils.dart';
import 'package:aves/utils/file_utils.dart';
Expand Down Expand Up @@ -60,7 +59,6 @@ class EntryListDetails extends StatelessWidget {
children: spans,
),
style: style,
strutStyle: AStyles.overflowStrut,
softWrap: false,
overflow: TextOverflow.fade,
);
Expand Down
18 changes: 12 additions & 6 deletions lib/widgets/collection/grid/list_details_theme.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:aves/theme/format.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
Expand Down Expand Up @@ -29,22 +28,29 @@ class EntryListDetailsTheme extends StatelessWidget {
final textScaler = mq.textScaler;

final textTheme = Theme.of(context).textTheme;
final titleStyle = textTheme.bodyMedium!;
final captionStyle = textTheme.bodySmall!;
// specify `height` for accurate paragraph height measurement
final defaultTextHeight = DefaultTextStyle.of(context).style.height;
final titleStyle = textTheme.bodyMedium!.copyWith(height: defaultTextHeight);
final captionStyle = textTheme.bodySmall!.copyWith(height: defaultTextHeight);

final titleLineHeightParagraph = RenderParagraph(
TextSpan(text: 'Fake Title', style: titleStyle),
TextSpan(
text: 'Fake Title',
style: titleStyle,
),
textDirection: TextDirection.ltr,
textScaler: textScaler,
)..layout(const BoxConstraints(), parentUsesSize: true);
final titleLineHeight = titleLineHeightParagraph.getMaxIntrinsicHeight(double.infinity);
titleLineHeightParagraph.dispose();

final captionLineHeightParagraph = RenderParagraph(
TextSpan(text: formatDateTime(DateTime.now(), locale, use24hour), style: captionStyle),
TextSpan(
text: formatDateTime(DateTime.now(), locale, use24hour),
style: captionStyle,
),
textDirection: TextDirection.ltr,
textScaler: textScaler,
strutStyle: AStyles.overflowStrut,
)..layout(const BoxConstraints(), parentUsesSize: true);
final captionLineHeight = captionLineHeightParagraph.getMaxIntrinsicHeight(double.infinity);

Expand Down
19 changes: 14 additions & 5 deletions lib/widgets/common/basic/text/animated_diff.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@ class _AnimatedDiffTextState extends State<AnimatedDiffText> with SingleTickerPr
late final Animation<double> _animation;
final List<_TextDiff> _diffs = [];

TextStyle get _textStyle {
final style = widget.textStyle ?? const TextStyle();
// specify `height` for accurate paragraph height measurement
return style.copyWith(height: style.height ?? DefaultTextStyle.of(context).style.height);
}

StrutStyle? get _strutStyle => widget.strutStyle;

@override
void initState() {
super.initState();
Expand Down Expand Up @@ -101,24 +109,25 @@ class _AnimatedDiffTextState extends State<AnimatedDiffText> with SingleTickerPr
child: Text(
text,
key: Key(text),
style: _textStyle,
),
),
),
);
}).toList(),
),
strutStyle: widget.strutStyle,
strutStyle: _strutStyle,
);
},
);
}

Size textSize(String text) {
Size _textSize(String text) {
final paragraph = RenderParagraph(
TextSpan(text: text, style: widget.textStyle),
TextSpan(text: text, style: _textStyle),
textDirection: Directionality.of(context),
textScaler: MediaQuery.textScalerOf(context),
strutStyle: widget.strutStyle,
strutStyle: _strutStyle,
)..layout(const BoxConstraints(), parentUsesSize: true);
final width = paragraph.getMaxIntrinsicWidth(double.infinity);
final height = paragraph.getMaxIntrinsicHeight(double.infinity);
Expand All @@ -140,7 +149,7 @@ class _AnimatedDiffTextState extends State<AnimatedDiffText> with SingleTickerPr
..clear()
..addAll(d.map((diff) {
final text = diff.text;
final size = textSize(text);
final size = _textSize(text);
return switch (diff.operation) {
Operation.delete => (text, null, size, Size.zero),
Operation.insert => (null, text, Size.zero, size),
Expand Down
12 changes: 9 additions & 3 deletions lib/widgets/common/grid/header.dart
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class SectionHeader<T> extends StatelessWidget {
sectionKey: sectionKey,
browsingBuilder: leading != null
? (context) => Container(
padding: const EdgeInsetsDirectional.only(end: 8, bottom: 4),
padding: const EdgeInsetsDirectional.only(end: 8),
width: leadingSize.width,
height: leadingSize.height,
child: leading,
Expand All @@ -80,7 +80,7 @@ class SectionHeader<T> extends StatelessWidget {
),
TextSpan(
text: title,
style: AStyles.unknownTitleText,
style: _headerTextStyle(context),
),
if (trailing != null)
WidgetSpan(
Expand Down Expand Up @@ -152,7 +152,7 @@ class SectionHeader<T> extends StatelessWidget {
if (hasTrailing) TextSpan(text: '\u200A' * 17),
TextSpan(
text: title,
style: AStyles.unknownTitleText,
style: _headerTextStyle(context),
),
],
),
Expand All @@ -163,6 +163,12 @@ class SectionHeader<T> extends StatelessWidget {
paragraph.dispose();
return height;
}

static TextStyle _headerTextStyle(BuildContext context) {
// specify `height` for accurate paragraph height measurement
final defaultTextHeight = DefaultTextStyle.of(context).style.height;
return AStyles.unknownTitleText.copyWith(height: defaultTextHeight);
}
}

class _SectionSelectableLeading<T> extends StatelessWidget {
Expand Down
10 changes: 7 additions & 3 deletions lib/widgets/common/identity/buttons/captioned_button.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class CaptionedButton extends StatefulWidget {
var height = width;
if (showCaption) {
final paragraph = RenderParagraph(
TextSpan(text: text, style: CaptionedButtonText.textStyle(context)),
TextSpan(text: text, style: CaptionedButtonText._textStyle(context)),
textDirection: TextDirection.ltr,
textScaler: MediaQuery.textScalerOf(context),
maxLines: CaptionedButtonText.maxLines,
Expand Down Expand Up @@ -112,7 +112,7 @@ class _CaptionedButtonState extends State<CaptionedButton> {
child: ValueListenableBuilder<bool>(
valueListenable: _focusedNotifier,
builder: (context, focused, child) {
final style = CaptionedButtonText.textStyle(context);
final style = CaptionedButtonText._textStyle(context);
return AnimatedDefaultTextStyle(
style: focused
? style.copyWith(
Expand Down Expand Up @@ -176,5 +176,9 @@ class CaptionedButtonText extends StatelessWidget {
);
}

static TextStyle textStyle(BuildContext context) => Theme.of(context).textTheme.bodySmall!;
static TextStyle _textStyle(BuildContext context) {
// specify `height` for accurate paragraph height measurement
final defaultTextHeight = DefaultTextStyle.of(context).style.height;
return Theme.of(context).textTheme.bodySmall!.copyWith(height: defaultTextHeight);
}
}
3 changes: 0 additions & 3 deletions lib/widgets/dialogs/pick_dialogs/location_pick_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import 'package:aves/services/common/services.dart';
import 'package:aves/services/geocoding_service.dart';
import 'package:aves/theme/durations.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/theme/text.dart';
import 'package:aves/utils/debouncer.dart';
import 'package:aves/widgets/common/basic/scaffold.dart';
Expand Down Expand Up @@ -280,7 +279,6 @@ class _AddressRowState extends State<_AddressRow> {
builder: (context, addressLine, child) {
return Text(
addressLine ?? AText.valueNotAvailable,
strutStyle: AStyles.overflowStrut,
softWrap: false,
overflow: TextOverflow.fade,
maxLines: 1,
Expand Down Expand Up @@ -331,7 +329,6 @@ class _CoordinateRow extends StatelessWidget {
Expanded(
child: Text(
location != null ? settings.coordinateFormat.format(context, location!) : AText.valueNotAvailable,
strutStyle: AStyles.overflowStrut,
softWrap: false,
overflow: TextOverflow.fade,
maxLines: 1,
Expand Down
3 changes: 0 additions & 3 deletions lib/widgets/filter_grids/common/list_details.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/source/collection_source.dart';
import 'package:aves/theme/format.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/theme/text.dart';
import 'package:aves/utils/android_file_utils.dart';
import 'package:aves/utils/file_utils.dart';
Expand Down Expand Up @@ -107,7 +106,6 @@ class FilterListDetails<T extends CollectionFilter> extends StatelessWidget {
child: Text(
dateText,
style: detailsTheme.captionStyle,
strutStyle: AStyles.overflowStrut,
softWrap: false,
overflow: TextOverflow.fade,
),
Expand Down Expand Up @@ -158,7 +156,6 @@ class FilterListDetails<T extends CollectionFilter> extends StatelessWidget {
Text(
'${l10n.itemCount(source.count(filter))} • ${formatFileSize(locale, source.size(filter))}',
style: detailsTheme.captionStyle,
strutStyle: AStyles.overflowStrut,
softWrap: false,
overflow: TextOverflow.fade,
),
Expand Down
8 changes: 4 additions & 4 deletions lib/widgets/filter_grids/common/list_details_theme.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'dart:math';

import 'package:aves/theme/format.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/identity/aves_filter_chip.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -34,8 +33,10 @@ class FilterListDetailsTheme extends StatelessWidget {

final textTheme = Theme.of(context).textTheme;
final titleStyleBase = textTheme.bodyMedium!;
final titleStyle = titleStyleBase.copyWith(fontSize: textScaler.scale(titleStyleBase.fontSize!));
final captionStyle = textTheme.bodySmall!;
// specify `height` for accurate paragraph height measurement
final defaultTextHeight = DefaultTextStyle.of(context).style.height;
final titleStyle = titleStyleBase.copyWith(fontSize: textScaler.scale(titleStyleBase.fontSize!), height: defaultTextHeight);
final captionStyle = textTheme.bodySmall!.copyWith(height: defaultTextHeight);

final titleIconSize = textScaler.scale(AvesFilterChip.iconSize);
final titleLineHeightParagraph = RenderParagraph(
Expand All @@ -50,7 +51,6 @@ class FilterListDetailsTheme extends StatelessWidget {
TextSpan(text: formatDateTime(DateTime.now(), locale, use24hour), style: captionStyle),
textDirection: TextDirection.ltr,
textScaler: textScaler,
strutStyle: AStyles.overflowStrut,
)..layout(const BoxConstraints(), parentUsesSize: true);
final captionLineHeight = captionLineHeightParagraph.getMaxIntrinsicHeight(double.infinity);
captionLineHeightParagraph.dispose();
Expand Down
2 changes: 0 additions & 2 deletions lib/widgets/map/address_row.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import 'package:aves/model/settings/settings.dart';
import 'package:aves/services/common/services.dart';
import 'package:aves/services/geocoding_service.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/theme/text.dart';
import 'package:flutter/material.dart';

Expand Down Expand Up @@ -78,7 +77,6 @@ class _MapAddressRowState extends State<MapAddressRow> {
TextSpan(text: location),
],
),
strutStyle: AStyles.overflowStrut,
softWrap: false,
overflow: TextOverflow.fade,
maxLines: 1,
Expand Down
2 changes: 0 additions & 2 deletions lib/widgets/map/date_row.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:aves/model/entry/entry.dart';
import 'package:aves/theme/format.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/theme/text.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/map/info_row.dart';
Expand Down Expand Up @@ -35,7 +34,6 @@ class MapDateRow extends StatelessWidget {
TextSpan(text: dateText),
],
),
strutStyle: AStyles.overflowStrut,
softWrap: false,
overflow: TextOverflow.fade,
maxLines: 1,
Expand Down
5 changes: 2 additions & 3 deletions lib/widgets/viewer/overlay/details/date.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/entry/extensions/props.dart';
import 'package:aves/theme/format.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/theme/text.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/viewer/multipage/controller.dart';
Expand Down Expand Up @@ -37,8 +36,8 @@ class OverlayDateRow extends StatelessWidget {
children: [
DecoratedIcon(AIcons.date, size: ViewerDetailOverlayContent.iconSize, shadows: ViewerDetailOverlayContent.shadows(context)),
const SizedBox(width: ViewerDetailOverlayContent.iconPadding),
Expanded(flex: 3, child: Text(dateText, strutStyle: AStyles.overflowStrut)),
Expanded(flex: 2, child: Text(resolutionText, strutStyle: AStyles.overflowStrut)),
Expanded(flex: 3, child: Text(dateText)),
Expanded(flex: 2, child: Text(resolutionText)),
],
);
}
Expand Down
2 changes: 0 additions & 2 deletions lib/widgets/viewer/overlay/details/description.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:aves/theme/icons.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/widgets/viewer/overlay/details/details.dart';
import 'package:decorated_icon/decorated_icon.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -31,7 +30,6 @@ class OverlayDescriptionRow extends StatelessWidget {
TextSpan(text: description),
],
),
strutStyle: AStyles.overflowStrut,
);
}
}
3 changes: 1 addition & 2 deletions lib/widgets/viewer/overlay/details/location.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import 'package:aves/model/entry/extensions/location.dart';
import 'package:aves/model/settings/enums/coordinate_format.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/theme/text.dart';
import 'package:aves/widgets/viewer/overlay/details/details.dart';
import 'package:decorated_icon/decorated_icon.dart';
Expand Down Expand Up @@ -33,7 +32,7 @@ class OverlayLocationRow extends AnimatedWidget {
children: [
DecoratedIcon(AIcons.location, size: ViewerDetailOverlayContent.iconSize, shadows: ViewerDetailOverlayContent.shadows(context)),
const SizedBox(width: ViewerDetailOverlayContent.iconPadding),
Expanded(child: Text(location ?? AText.valueNotAvailable, strutStyle: AStyles.overflowStrut)),
Expanded(child: Text(location ?? AText.valueNotAvailable)),
],
);
}
Expand Down
13 changes: 6 additions & 7 deletions lib/widgets/viewer/overlay/details/position_title.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/multipage.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/theme/text.dart';
import 'package:aves/widgets/viewer/multipage/controller.dart';
import 'package:flutter/foundation.dart';
Expand All @@ -25,12 +24,12 @@ class OverlayPositionTitleRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
Text toText({String? pagePosition}) => Text(
[
if (collectionPosition != null) collectionPosition,
if (pagePosition != null) pagePosition,
if (title != null) '${Unicode.FSI}$title${Unicode.PDI}',
].join(AText.separator),
strutStyle: AStyles.overflowStrut);
[
if (collectionPosition != null) collectionPosition,
if (pagePosition != null) pagePosition,
if (title != null) '${Unicode.FSI}$title${Unicode.PDI}',
].join(AText.separator),
);

if (multiPageController == null) return toText();

Expand Down
2 changes: 0 additions & 2 deletions lib/widgets/viewer/overlay/details/rating_tags.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'package:aves/model/entry/entry.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/theme/text.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/viewer/overlay/details/details.dart';
Expand Down Expand Up @@ -57,7 +56,6 @@ class OverlayRatingTagsRow extends AnimatedWidget {
]
],
),
strutStyle: AStyles.overflowStrut,
);
}
}
Loading

0 comments on commit 81977ea

Please sign in to comment.