From a094ebeaf13a3357e1326ad8a564a1275c86384b Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 12 Apr 2020 10:42:48 +0900 Subject: [PATCH] fixed section layout for multiline headers with leading icon --- lib/widgets/album/collection_list_sliver.dart | 12 ++++++----- lib/widgets/album/grid/header_generic.dart | 20 +++++++++++++++---- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/lib/widgets/album/collection_list_sliver.dart b/lib/widgets/album/collection_list_sliver.dart index 583193722..7e559da5e 100644 --- a/lib/widgets/album/collection_list_sliver.dart +++ b/lib/widgets/album/collection_list_sliver.dart @@ -29,13 +29,15 @@ class CollectionListSliver extends StatelessWidget { @override Widget build(BuildContext context) { final sectionLayouts = []; - final sectionKeys = collection.sections.keys.toList(); + final source = collection.source; + final sections = collection.sections; + final sectionKeys = sections.keys.toList(); var currentIndex = 0, currentOffset = 0.0; sectionKeys.forEach((sectionKey) { - final sectionEntryCount = collection.sections[sectionKey].length; + final sectionEntryCount = sections[sectionKey].length; final sectionChildCount = 1 + (sectionEntryCount / columnCount).ceil(); - final headerExtent = showHeader ? SectionHeader.computeHeaderExtent(collection, sectionKey, scrollableWidth) : 0.0; + final headerExtent = showHeader ? SectionHeader.computeHeaderHeight(source, sectionKey, scrollableWidth) : 0.0; final sectionFirstIndex = currentIndex; currentIndex += sectionChildCount; @@ -59,13 +61,13 @@ class CollectionListSliver extends StatelessWidget { if (listIndex == 0) { return SectionHeader( collection: collection, - sections: collection.sections, + sections: sections, sectionKey: sectionKey, ); } listIndex--; - final section = collection.sections[sectionKey]; + final section = sections[sectionKey]; final minEntryIndex = listIndex * columnCount; final maxEntryIndex = min(sectionEntryCount, minEntryIndex + columnCount); final children = []; diff --git a/lib/widgets/album/grid/header_generic.dart b/lib/widgets/album/grid/header_generic.dart index 429bfe346..2600133f8 100644 --- a/lib/widgets/album/grid/header_generic.dart +++ b/lib/widgets/album/grid/header_generic.dart @@ -1,7 +1,9 @@ import 'dart:math'; import 'package:aves/model/collection_lens.dart'; +import 'package:aves/model/collection_source.dart'; import 'package:aves/model/image_entry.dart'; +import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/album/grid/header_album.dart'; import 'package:aves/widgets/album/grid/header_date.dart'; @@ -64,16 +66,26 @@ class SectionHeader extends StatelessWidget { } // TODO TLAD cache header extent computation? - static double computeHeaderExtent(CollectionLens collection, dynamic sectionKey, double scrollableWidth) { + static double computeHeaderHeight(CollectionSource source, dynamic sectionKey, double scrollableWidth) { var headerExtent = 0.0; if (sectionKey is String) { // only compute height for album headers, as they're the only likely ones to split on multiple lines - final text = collection.source.getUniqueAlbumName(sectionKey); + final hasIcon = androidFileUtils.getAlbumType(sectionKey) != AlbumType.Default; + final text = source.getUniqueAlbumName(sectionKey); final maxWidth = scrollableWidth - TitleSectionHeader.padding.horizontal; final para = RenderParagraph( TextSpan( - text: text, - style: Constants.titleTextStyle, + children: [ + if (hasIcon) + // `RenderParagraph` fails to lay out `WidgetSpan` offscreen as of Flutter v1.17.0 + // so we use a hair space times a magic number to match leading width + // 23 hair spaces match a width of 40.0 + TextSpan(text: '\u200A' * 23), + TextSpan( + text: text, + style: Constants.titleTextStyle, + ), + ], ), textDirection: TextDirection.ltr, )..layout(BoxConstraints(maxWidth: maxWidth), parentUsesSize: true);