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;
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;

View file

@ -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<TileExtentController>().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,

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/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,7 +152,9 @@ class _GridScaleGestureDetectorState<T> extends State<GridScaleGestureDetector<T
case TileLayout.list:
final tileCenter = renderMetaData.localToGlobal(Offset(halfSize.width, halfSize.height));
_overlayEntry = OverlayEntry(
builder: (context) => FixedExtentScaleOverlay(
builder: (context) => TileExtentControllerProvider(
controller: tileExtentController,
child: FixedExtentScaleOverlay(
tileLayout: tileLayout,
tileCenter: tileCenter,
contentRect: contentRect,
@ -165,6 +168,7 @@ class _GridScaleGestureDetectorState<T> extends State<GridScaleGestureDetector<T
),
),
),
),
);
}
Overlay.of(scrollableContext).insert(_overlayEntry!);

View file

@ -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<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) {
@ -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,