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;
|
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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue