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 81977ea commit 97ffbfa
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 18 deletions.
2 changes: 2 additions & 0 deletions lib/model/metadata/catalog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ class CatalogMetadata {
Address? address;
int rating;

// less lenient than Flutter's `precisionErrorTolerance` (1e-10)
static const double _precisionErrorTolerance = 1e-9;

static const _isAnimatedMask = 1 << 0;
static const _isFlippedMask = 1 << 1;
static const _isGeotiffMask = 1 << 2;
Expand Down
15 changes: 12 additions & 3 deletions lib/widgets/collection/grid/list_details_theme.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'package:aves/theme/format.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/tile_extent_controller.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:provider/provider.dart';
Expand Down Expand Up @@ -28,10 +30,12 @@ class EntryListDetailsTheme extends StatelessWidget {
final textScaler = mq.textScaler;

final textTheme = Theme.of(context).textTheme;
var titleStyle = textTheme.bodyMedium!;
var 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);
titleStyle = titleStyle.copyWith(height: titleStyle.height ?? defaultTextHeight);
captionStyle = captionStyle.copyWith(height: captionStyle.height ?? defaultTextHeight);

final titleLineHeightParagraph = RenderParagraph(
TextSpan(
Expand All @@ -58,6 +62,9 @@ class EntryListDetailsTheme extends StatelessWidget {
var showDate = false;
var showLocation = false;

final gridExtentMin = context.read<TileExtentController>().effectiveExtentMin;
final isMinExtent = (extent - gridExtentMin).abs() < precisionErrorTolerance;

var availableHeight = extent - contentMargin.vertical - contentPadding.vertical;
if (availableHeight >= titleLineHeight + titleDetailPadding + captionLineHeight) {
showDate = true;
Expand All @@ -72,6 +79,7 @@ class EntryListDetailsTheme extends StatelessWidget {
return EntryListDetailsThemeData(
extent: extent,
titleMaxLines: titleMaxLines,
isMinExtent: isMinExtent,
showDate: showDate,
showLocation: showLocation,
titleStyle: titleStyle,
Expand All @@ -90,13 +98,14 @@ class EntryListDetailsTheme extends StatelessWidget {
class EntryListDetailsThemeData {
final double extent;
final int titleMaxLines;
final bool showDate, showLocation;
final bool isMinExtent, showDate, showLocation;
final TextStyle titleStyle, captionStyle;
final IconThemeData iconTheme;

const EntryListDetailsThemeData({
required this.extent,
required this.titleMaxLines,
required this.isMinExtent,
required this.showDate,
required this.showLocation,
required this.titleStyle,
Expand Down
26 changes: 15 additions & 11 deletions lib/widgets/common/grid/scaling.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:aves/widgets/common/grid/sections/fixed/scale_overlay.dart';
import 'package:aves/widgets/common/grid/sections/mosaic/scale_overlay.dart';
import 'package:aves/widgets/common/grid/sections/section_layout_builder.dart';
import 'package:aves/widgets/common/grid/theme.dart';
import 'package:aves/widgets/common/providers/tile_extent_controller_provider.dart';
import 'package:aves/widgets/common/tile_extent_controller.dart';
import 'package:aves_model/aves_model.dart';
import 'package:collection/collection.dart';
Expand Down Expand Up @@ -151,17 +152,20 @@ class _GridScaleGestureDetectorState<T> extends State<GridScaleGestureDetector<T
case TileLayout.list:
final tileCenter = renderMetaData.localToGlobal(Offset(halfSize.width, halfSize.height));
_overlayEntry = OverlayEntry(
builder: (context) => FixedExtentScaleOverlay(
tileLayout: tileLayout,
tileCenter: tileCenter,
contentRect: contentRect,
scaledSizeNotifier: _scaledSizeNotifier!,
gridBuilder: widget.gridBuilder,
builder: (scaledTileSize) => SizedBox.fromSize(
size: scaledTileSize,
child: GridTheme(
extent: tileLayout == TileLayout.grid ? scaledTileSize.width : scaledTileSize.height,
child: widget.scaledItemBuilder(_metadata!.item, scaledTileSize),
builder: (context) => TileExtentControllerProvider(
controller: tileExtentController,
child: FixedExtentScaleOverlay(
tileLayout: tileLayout,
tileCenter: tileCenter,
contentRect: contentRect,
scaledSizeNotifier: _scaledSizeNotifier!,
gridBuilder: widget.gridBuilder,
builder: (scaledTileSize) => SizedBox.fromSize(
size: scaledTileSize,
child: GridTheme(
extent: tileLayout == TileLayout.grid ? scaledTileSize.width : scaledTileSize.height,
child: widget.scaledItemBuilder(_metadata!.item, scaledTileSize),
),
),
),
),
Expand Down
19 changes: 15 additions & 4 deletions lib/widgets/filter_grids/common/list_details_theme.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import 'dart:math';
import 'package:aves/theme/format.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/identity/aves_filter_chip.dart';
import 'package:aves/widgets/common/tile_extent_controller.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:provider/provider.dart';
Expand Down Expand Up @@ -32,11 +34,15 @@ class FilterListDetailsTheme extends StatelessWidget {
final textScaler = mq.textScaler;

final textTheme = Theme.of(context).textTheme;
final titleStyleBase = textTheme.bodyMedium!;
var titleStyle = textTheme.bodyMedium!;
var 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);
titleStyle = titleStyle.copyWith(
fontSize: textScaler.scale(titleStyle.fontSize!),
height: titleStyle.height ?? defaultTextHeight,
);
captionStyle = captionStyle.copyWith(height: captionStyle.height ?? defaultTextHeight);

final titleIconSize = textScaler.scale(AvesFilterChip.iconSize);
final titleLineHeightParagraph = RenderParagraph(
Expand All @@ -59,6 +65,9 @@ class FilterListDetailsTheme extends StatelessWidget {
var showCount = false;
var showDate = false;

final gridExtentMin = context.read<TileExtentController>().effectiveExtentMin;
final isMinExtent = (extent - gridExtentMin).abs() < precisionErrorTolerance;

var availableHeight = extent - contentMargin.vertical - contentPadding.vertical;
final firstTitleLineHeight = max(titleLineHeight, titleIconSize);
if (availableHeight >= firstTitleLineHeight + titleDetailPadding + captionLineHeight) {
Expand All @@ -74,6 +83,7 @@ class FilterListDetailsTheme extends StatelessWidget {
return FilterListDetailsThemeData(
extent: extent,
titleMaxLines: titleMaxLines,
isMinExtent: isMinExtent,
showCount: showCount,
showDate: showDate,
titleStyle: titleStyle,
Expand All @@ -93,14 +103,15 @@ class FilterListDetailsTheme extends StatelessWidget {
class FilterListDetailsThemeData {
final double extent;
final int titleMaxLines;
final bool showCount, showDate;
final bool isMinExtent, showCount, showDate;
final TextStyle titleStyle, captionStyle;
final double titleIconSize;
final IconThemeData captionIconTheme;

const FilterListDetailsThemeData({
required this.extent,
required this.titleMaxLines,
required this.isMinExtent,
required this.showCount,
required this.showDate,
required this.titleStyle,
Expand Down

0 comments on commit 97ffbfa

Please sign in to comment.