From 97ffbfa95b4a8c657f08e2d6762aef8f0ff3bed6 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Wed, 20 Dec 2023 15:28:02 +0100 Subject: [PATCH] fixed text / strut styles --- lib/model/metadata/catalog.dart | 2 ++ .../collection/grid/list_details_theme.dart | 15 ++++++++--- lib/widgets/common/grid/scaling.dart | 26 +++++++++++-------- .../common/list_details_theme.dart | 19 +++++++++++--- 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/lib/model/metadata/catalog.dart b/lib/model/metadata/catalog.dart index 2e059f6ec..157c348aa 100644 --- a/lib/model/metadata/catalog.dart +++ b/lib/model/metadata/catalog.dart @@ -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; diff --git a/lib/widgets/collection/grid/list_details_theme.dart b/lib/widgets/collection/grid/list_details_theme.dart index 2fc551f8b..41da131a3 100644 --- a/lib/widgets/collection/grid/list_details_theme.dart +++ b/lib/widgets/collection/grid/list_details_theme.dart @@ -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'; @@ -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( @@ -58,6 +62,9 @@ class EntryListDetailsTheme extends StatelessWidget { var showDate = false; var showLocation = false; + final gridExtentMin = context.read().effectiveExtentMin; + final isMinExtent = (extent - gridExtentMin).abs() < precisionErrorTolerance; + var availableHeight = extent - contentMargin.vertical - contentPadding.vertical; if (availableHeight >= titleLineHeight + titleDetailPadding + captionLineHeight) { showDate = true; @@ -72,6 +79,7 @@ class EntryListDetailsTheme extends StatelessWidget { return EntryListDetailsThemeData( extent: extent, titleMaxLines: titleMaxLines, + isMinExtent: isMinExtent, showDate: showDate, showLocation: showLocation, titleStyle: titleStyle, @@ -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, diff --git a/lib/widgets/common/grid/scaling.dart b/lib/widgets/common/grid/scaling.dart index c05b3f63e..87d2cb98c 100644 --- a/lib/widgets/common/grid/scaling.dart +++ b/lib/widgets/common/grid/scaling.dart @@ -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'; @@ -151,17 +152,20 @@ class _GridScaleGestureDetectorState extends State 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), + ), ), ), ), diff --git a/lib/widgets/filter_grids/common/list_details_theme.dart b/lib/widgets/filter_grids/common/list_details_theme.dart index dbf1b3a8a..d5af3e26d 100644 --- a/lib/widgets/filter_grids/common/list_details_theme.dart +++ b/lib/widgets/filter_grids/common/list_details_theme.dart @@ -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'; @@ -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( @@ -59,6 +65,9 @@ class FilterListDetailsTheme extends StatelessWidget { var showCount = false; var showDate = false; + final gridExtentMin = context.read().effectiveExtentMin; + final isMinExtent = (extent - gridExtentMin).abs() < precisionErrorTolerance; + var availableHeight = extent - contentMargin.vertical - contentPadding.vertical; final firstTitleLineHeight = max(titleLineHeight, titleIconSize); if (availableHeight >= firstTitleLineHeight + titleDetailPadding + captionLineHeight) { @@ -74,6 +83,7 @@ class FilterListDetailsTheme extends StatelessWidget { return FilterListDetailsThemeData( extent: extent, titleMaxLines: titleMaxLines, + isMinExtent: isMinExtent, showCount: showCount, showDate: showDate, titleStyle: titleStyle, @@ -93,7 +103,7 @@ 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; @@ -101,6 +111,7 @@ class FilterListDetailsThemeData { const FilterListDetailsThemeData({ required this.extent, required this.titleMaxLines, + required this.isMinExtent, required this.showCount, required this.showDate, required this.titleStyle,