fixed text / strut styles
This commit is contained in:
parent
81977ea4d8
commit
97ffbfa95b
4 changed files with 44 additions and 18 deletions
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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!);
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue