fixed text / strut styles

This commit is contained in:
Thibault Deckers 2023-12-20 15:28:02 +01:00
parent 81977ea4d8
commit 97ffbfa95b
4 changed files with 44 additions and 18 deletions

View file

@ -12,7 +12,9 @@ class CatalogMetadata {
Address? address; Address? address;
int rating; int rating;
// less lenient than Flutter's `precisionErrorTolerance` (1e-10)
static const double _precisionErrorTolerance = 1e-9; static const double _precisionErrorTolerance = 1e-9;
static const _isAnimatedMask = 1 << 0; static const _isAnimatedMask = 1 << 0;
static const _isFlippedMask = 1 << 1; static const _isFlippedMask = 1 << 1;
static const _isGeotiffMask = 1 << 2; static const _isGeotiffMask = 1 << 2;

View file

@ -1,5 +1,7 @@
import 'package:aves/theme/format.dart'; import 'package:aves/theme/format.dart';
import 'package:aves/widgets/common/extensions/build_context.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/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -28,10 +30,12 @@ class EntryListDetailsTheme extends StatelessWidget {
final textScaler = mq.textScaler; final textScaler = mq.textScaler;
final textTheme = Theme.of(context).textTheme; final textTheme = Theme.of(context).textTheme;
var titleStyle = textTheme.bodyMedium!;
var captionStyle = textTheme.bodySmall!;
// specify `height` for accurate paragraph height measurement // specify `height` for accurate paragraph height measurement
final defaultTextHeight = DefaultTextStyle.of(context).style.height; final defaultTextHeight = DefaultTextStyle.of(context).style.height;
final titleStyle = textTheme.bodyMedium!.copyWith(height: defaultTextHeight); titleStyle = titleStyle.copyWith(height: titleStyle.height ?? defaultTextHeight);
final captionStyle = textTheme.bodySmall!.copyWith(height: defaultTextHeight); captionStyle = captionStyle.copyWith(height: captionStyle.height ?? defaultTextHeight);
final titleLineHeightParagraph = RenderParagraph( final titleLineHeightParagraph = RenderParagraph(
TextSpan( TextSpan(
@ -58,6 +62,9 @@ class EntryListDetailsTheme extends StatelessWidget {
var showDate = false; var showDate = false;
var showLocation = false; var showLocation = false;
final gridExtentMin = context.read<TileExtentController>().effectiveExtentMin;
final isMinExtent = (extent - gridExtentMin).abs() < precisionErrorTolerance;
var availableHeight = extent - contentMargin.vertical - contentPadding.vertical; var availableHeight = extent - contentMargin.vertical - contentPadding.vertical;
if (availableHeight >= titleLineHeight + titleDetailPadding + captionLineHeight) { if (availableHeight >= titleLineHeight + titleDetailPadding + captionLineHeight) {
showDate = true; showDate = true;
@ -72,6 +79,7 @@ class EntryListDetailsTheme extends StatelessWidget {
return EntryListDetailsThemeData( return EntryListDetailsThemeData(
extent: extent, extent: extent,
titleMaxLines: titleMaxLines, titleMaxLines: titleMaxLines,
isMinExtent: isMinExtent,
showDate: showDate, showDate: showDate,
showLocation: showLocation, showLocation: showLocation,
titleStyle: titleStyle, titleStyle: titleStyle,
@ -90,13 +98,14 @@ class EntryListDetailsTheme extends StatelessWidget {
class EntryListDetailsThemeData { class EntryListDetailsThemeData {
final double extent; final double extent;
final int titleMaxLines; final int titleMaxLines;
final bool showDate, showLocation; final bool isMinExtent, showDate, showLocation;
final TextStyle titleStyle, captionStyle; final TextStyle titleStyle, captionStyle;
final IconThemeData iconTheme; final IconThemeData iconTheme;
const EntryListDetailsThemeData({ const EntryListDetailsThemeData({
required this.extent, required this.extent,
required this.titleMaxLines, required this.titleMaxLines,
required this.isMinExtent,
required this.showDate, required this.showDate,
required this.showLocation, required this.showLocation,
required this.titleStyle, required this.titleStyle,

View file

@ -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/mosaic/scale_overlay.dart';
import 'package:aves/widgets/common/grid/sections/section_layout_builder.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/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/widgets/common/tile_extent_controller.dart';
import 'package:aves_model/aves_model.dart'; import 'package:aves_model/aves_model.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
@ -151,17 +152,20 @@ class _GridScaleGestureDetectorState<T> extends State<GridScaleGestureDetector<T
case TileLayout.list: case TileLayout.list:
final tileCenter = renderMetaData.localToGlobal(Offset(halfSize.width, halfSize.height)); final tileCenter = renderMetaData.localToGlobal(Offset(halfSize.width, halfSize.height));
_overlayEntry = OverlayEntry( _overlayEntry = OverlayEntry(
builder: (context) => FixedExtentScaleOverlay( builder: (context) => TileExtentControllerProvider(
tileLayout: tileLayout, controller: tileExtentController,
tileCenter: tileCenter, child: FixedExtentScaleOverlay(
contentRect: contentRect, tileLayout: tileLayout,
scaledSizeNotifier: _scaledSizeNotifier!, tileCenter: tileCenter,
gridBuilder: widget.gridBuilder, contentRect: contentRect,
builder: (scaledTileSize) => SizedBox.fromSize( scaledSizeNotifier: _scaledSizeNotifier!,
size: scaledTileSize, gridBuilder: widget.gridBuilder,
child: GridTheme( builder: (scaledTileSize) => SizedBox.fromSize(
extent: tileLayout == TileLayout.grid ? scaledTileSize.width : scaledTileSize.height, size: scaledTileSize,
child: widget.scaledItemBuilder(_metadata!.item, scaledTileSize), child: GridTheme(
extent: tileLayout == TileLayout.grid ? scaledTileSize.width : scaledTileSize.height,
child: widget.scaledItemBuilder(_metadata!.item, scaledTileSize),
),
), ),
), ),
), ),

View file

@ -3,6 +3,8 @@ import 'dart:math';
import 'package:aves/theme/format.dart'; import 'package:aves/theme/format.dart';
import 'package:aves/widgets/common/extensions/build_context.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/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/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -32,11 +34,15 @@ class FilterListDetailsTheme extends StatelessWidget {
final textScaler = mq.textScaler; final textScaler = mq.textScaler;
final textTheme = Theme.of(context).textTheme; 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 // specify `height` for accurate paragraph height measurement
final defaultTextHeight = DefaultTextStyle.of(context).style.height; final defaultTextHeight = DefaultTextStyle.of(context).style.height;
final titleStyle = titleStyleBase.copyWith(fontSize: textScaler.scale(titleStyleBase.fontSize!), height: defaultTextHeight); titleStyle = titleStyle.copyWith(
final captionStyle = textTheme.bodySmall!.copyWith(height: defaultTextHeight); fontSize: textScaler.scale(titleStyle.fontSize!),
height: titleStyle.height ?? defaultTextHeight,
);
captionStyle = captionStyle.copyWith(height: captionStyle.height ?? defaultTextHeight);
final titleIconSize = textScaler.scale(AvesFilterChip.iconSize); final titleIconSize = textScaler.scale(AvesFilterChip.iconSize);
final titleLineHeightParagraph = RenderParagraph( final titleLineHeightParagraph = RenderParagraph(
@ -59,6 +65,9 @@ class FilterListDetailsTheme extends StatelessWidget {
var showCount = false; var showCount = false;
var showDate = false; var showDate = false;
final gridExtentMin = context.read<TileExtentController>().effectiveExtentMin;
final isMinExtent = (extent - gridExtentMin).abs() < precisionErrorTolerance;
var availableHeight = extent - contentMargin.vertical - contentPadding.vertical; var availableHeight = extent - contentMargin.vertical - contentPadding.vertical;
final firstTitleLineHeight = max(titleLineHeight, titleIconSize); final firstTitleLineHeight = max(titleLineHeight, titleIconSize);
if (availableHeight >= firstTitleLineHeight + titleDetailPadding + captionLineHeight) { if (availableHeight >= firstTitleLineHeight + titleDetailPadding + captionLineHeight) {
@ -74,6 +83,7 @@ class FilterListDetailsTheme extends StatelessWidget {
return FilterListDetailsThemeData( return FilterListDetailsThemeData(
extent: extent, extent: extent,
titleMaxLines: titleMaxLines, titleMaxLines: titleMaxLines,
isMinExtent: isMinExtent,
showCount: showCount, showCount: showCount,
showDate: showDate, showDate: showDate,
titleStyle: titleStyle, titleStyle: titleStyle,
@ -93,7 +103,7 @@ class FilterListDetailsTheme extends StatelessWidget {
class FilterListDetailsThemeData { class FilterListDetailsThemeData {
final double extent; final double extent;
final int titleMaxLines; final int titleMaxLines;
final bool showCount, showDate; final bool isMinExtent, showCount, showDate;
final TextStyle titleStyle, captionStyle; final TextStyle titleStyle, captionStyle;
final double titleIconSize; final double titleIconSize;
final IconThemeData captionIconTheme; final IconThemeData captionIconTheme;
@ -101,6 +111,7 @@ class FilterListDetailsThemeData {
const FilterListDetailsThemeData({ const FilterListDetailsThemeData({
required this.extent, required this.extent,
required this.titleMaxLines, required this.titleMaxLines,
required this.isMinExtent,
required this.showCount, required this.showCount,
required this.showDate, required this.showDate,
required this.titleStyle, required this.titleStyle,