From 0f1d8ec760ffe948d395cf3ae3b1e17f83e8d22e Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Wed, 26 Jun 2024 22:13:27 +0200 Subject: [PATCH] explorer fixes --- lib/widgets/about/tv_license_page.dart | 8 +- .../common/action_mixins/feedback.dart | 8 +- .../action_mixins/overlay_snack_bar.dart | 2 +- .../draggable_scrollbar/arrow_clipper.dart | 2 +- lib/widgets/common/basic/link_chip.dart | 2 +- .../common/basic/popup/menu_button.dart | 2 +- lib/widgets/common/grid/theme.dart | 2 +- .../common/identity/aves_filter_chip.dart | 7 +- lib/widgets/explorer/explorer_page.dart | 31 ++++-- .../common/action_delegates/chip.dart | 12 ++- .../common/quick_actions/editor_page.dart | 2 +- .../privacy/file_picker/crumb_line.dart | 99 +++++++++---------- .../privacy/file_picker/file_picker_page.dart | 31 ++++-- lib/widgets/viewer/info/color_section.dart | 2 +- lib/widgets/viewer/overlay/bottom.dart | 2 +- lib/widgets/welcome_page.dart | 2 +- 16 files changed, 119 insertions(+), 95 deletions(-) diff --git a/lib/widgets/about/tv_license_page.dart b/lib/widgets/about/tv_license_page.dart index e40b67d26..7efb673ee 100644 --- a/lib/widgets/about/tv_license_page.dart +++ b/lib/widgets/about/tv_license_page.dart @@ -233,13 +233,13 @@ class _PackageLicensePageState extends State<_PackageLicensePage> { if (!mounted) return; setState(() { _licenses.add(const Padding( - padding: EdgeInsets.all(18.0), + padding: EdgeInsets.all(18), child: Divider(), )); for (final LicenseParagraph paragraph in paragraphs) { if (paragraph.indent == LicenseParagraph.centeredIndent) { _licenses.add(Padding( - padding: const EdgeInsets.only(top: 16.0), + padding: const EdgeInsets.only(top: 16), child: Text( paragraph.text, style: const TextStyle(fontWeight: FontWeight.bold), @@ -249,7 +249,7 @@ class _PackageLicensePageState extends State<_PackageLicensePage> { } else { assert(paragraph.indent >= 0); _licenses.add(Padding( - padding: EdgeInsetsDirectional.only(top: 8.0, start: 16.0 * paragraph.indent), + padding: EdgeInsetsDirectional.only(top: 8, start: 16.0 * paragraph.indent), child: Text(paragraph.text), )); } @@ -278,7 +278,7 @@ class _PackageLicensePageState extends State<_PackageLicensePage> { ..._licenses, if (!_loaded) const Padding( - padding: EdgeInsets.symmetric(vertical: 24.0), + padding: EdgeInsets.symmetric(vertical: 24), child: Center( child: CircularProgressIndicator(), ), diff --git a/lib/widgets/common/action_mixins/feedback.dart b/lib/widgets/common/action_mixins/feedback.dart index 7e5181025..cf29fccaf 100644 --- a/lib/widgets/common/action_mixins/feedback.dart +++ b/lib/widgets/common/action_mixins/feedback.dart @@ -121,7 +121,7 @@ mixin FeedbackMixin { static double snackBarHorizontalPadding(SnackBarThemeData snackBarTheme) { final isFloatingSnackBar = (snackBarTheme.behavior ?? SnackBarBehavior.fixed) == SnackBarBehavior.floating; - final horizontalPadding = isFloatingSnackBar ? 16.0 : 24.0; + final double horizontalPadding = isFloatingSnackBar ? 16.0 : 24.0; return horizontalPadding; } @@ -181,9 +181,9 @@ class _ReportOverlayState extends State> with SingleTickerPr Stream get opStream => widget.opStream; - static const fontSize = 18.0; - static const diameter = 160.0; - static const strokeWidth = 8.0; + static const double fontSize = 18.0; + static const double diameter = 160.0; + static const double strokeWidth = 8.0; @override void initState() { diff --git a/lib/widgets/common/action_mixins/overlay_snack_bar.dart b/lib/widgets/common/action_mixins/overlay_snack_bar.dart index ed2d5a710..ecd88f143 100644 --- a/lib/widgets/common/action_mixins/overlay_snack_bar.dart +++ b/lib/widgets/common/action_mixins/overlay_snack_bar.dart @@ -212,7 +212,7 @@ class _OverlaySnackBarState extends State { final IconButton? iconButton = showCloseIcon ? IconButton( icon: const Icon(Icons.close), - iconSize: 24.0, + iconSize: 24, color: widget.closeIconColor ?? snackBarTheme.closeIconColor ?? defaults.closeIconColor, onPressed: () => ScaffoldMessenger.of(context).hideCurrentSnackBar(reason: SnackBarClosedReason.dismiss), tooltip: MaterialLocalizations.of(context).closeButtonTooltip, diff --git a/lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart b/lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart index e665bcc68..94deba547 100644 --- a/lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart +++ b/lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart @@ -10,7 +10,7 @@ class ArrowClipper extends CustomClipper { path.lineTo(0.0, 0.0); path.close(); - const arrowWidth = 8.0; + const double arrowWidth = 8.0; final startPointX = (size.width - arrowWidth) / 2; var startPointY = size.height / 2 - arrowWidth / 2; path.moveTo(startPointX, startPointY); diff --git a/lib/widgets/common/basic/link_chip.dart b/lib/widgets/common/basic/link_chip.dart index 35422ed05..53ddc6553 100644 --- a/lib/widgets/common/basic/link_chip.dart +++ b/lib/widgets/common/basic/link_chip.dart @@ -30,7 +30,7 @@ class LinkChip extends StatelessWidget { borderRadius: borderRadius, onTap: onTap ?? () => AvesApp.launchUrl(urlString), child: Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all(8), child: Row( mainAxisSize: MainAxisSize.min, children: [ diff --git a/lib/widgets/common/basic/popup/menu_button.dart b/lib/widgets/common/basic/popup/menu_button.dart index 6e69368fd..f0f3d178b 100644 --- a/lib/widgets/common/basic/popup/menu_button.dart +++ b/lib/widgets/common/basic/popup/menu_button.dart @@ -11,7 +11,7 @@ class AvesPopupMenuButton extends PopupMenuButton { super.onCanceled, super.tooltip, super.elevation, - super.padding = const EdgeInsets.all(8.0), + super.padding = const EdgeInsets.all(8), super.child, super.icon, super.offset = Offset.zero, diff --git a/lib/widgets/common/grid/theme.dart b/lib/widgets/common/grid/theme.dart index a9c4c73a7..9050e7b5b 100644 --- a/lib/widgets/common/grid/theme.dart +++ b/lib/widgets/common/grid/theme.dart @@ -29,7 +29,7 @@ class GridTheme extends StatelessWidget { return ProxyProvider2( update: (context, settings, mq, previous) { final margin = OverlayIcon.defaultMargin.vertical; - var iconSize = min(24.0, ((extent - margin) / 5).floorToDouble() - margin); + var iconSize = min(24.0, ((extent - margin) / 5).floorToDouble() - margin); final fontSize = (iconSize * .7).floorToDouble(); iconSize = mq.textScaler.scale(iconSize); final highlightBorderWidth = extent * .1; diff --git a/lib/widgets/common/identity/aves_filter_chip.dart b/lib/widgets/common/identity/aves_filter_chip.dart index 1a20cc697..def2ceaf6 100644 --- a/lib/widgets/common/identity/aves_filter_chip.dart +++ b/lib/widgets/common/identity/aves_filter_chip.dart @@ -100,8 +100,11 @@ class AvesFilterChip extends StatefulWidget { static Future showDefaultLongPressMenu(BuildContext context, CollectionFilter filter, Offset tapPosition) async { if (context.read>().value.canNavigate) { - final actions = [ - if (filter is AlbumFilter) ChipAction.goToAlbumPage, + final actions = [ + if (filter is AlbumFilter) ...[ + ChipAction.goToAlbumPage, + ChipAction.goToExplorerPage, + ], if ((filter is LocationFilter && filter.level == LocationLevel.country)) ChipAction.goToCountryPage, if ((filter is LocationFilter && filter.level == LocationLevel.place)) ChipAction.goToPlacePage, if (filter is TagFilter) ChipAction.goToTagPage, diff --git a/lib/widgets/explorer/explorer_page.dart b/lib/widgets/explorer/explorer_page.dart index 36d83de3c..6119e7098 100644 --- a/lib/widgets/explorer/explorer_page.dart +++ b/lib/widgets/explorer/explorer_page.dart @@ -194,11 +194,18 @@ class _ExplorerPageState extends State { } } - return Center( - child: EmptyContent( - icon: AIcons.folder, - text: '', - bottom: bottom, + return SafeArea( + top: false, + bottom: false, + child: Padding( + padding: const EdgeInsets.all(8), + child: Center( + child: EmptyContent( + icon: AIcons.folder, + text: '', + bottom: bottom, + ), + ), ), ); }, @@ -215,21 +222,25 @@ class _ExplorerPageState extends State { final album = _getAlbumPath(source, content); final baseIconTheme = IconTheme.of(context); + const leadingDim = AvesFilterChip.minChipWidth; return ListTile( - leading: const Icon(AIcons.folder), - title: Text('${Unicode.FSI}${pContext.split(content.path).last}${Unicode.PDI}'), - trailing: album != null + leading: album != null ? IconTheme.merge( data: baseIconTheme, child: AvesFilterChip( filter: AlbumFilter(album, source.getAlbumDisplayName(context, album)), showText: false, - maxWidth: AvesFilterChip.minChipWidth, + maxWidth: leadingDim, onTap: (filter) => _goToCollectionPage(context, filter), onLongPress: null, ), ) - : null, + : const SizedBox( + width: leadingDim, + height: leadingDim, + child: Icon(AIcons.folder), + ), + title: Text('${Unicode.FSI}${pContext.split(content.path).last}${Unicode.PDI}'), onTap: () => _goTo(content.path), ); } diff --git a/lib/widgets/filter_grids/common/action_delegates/chip.dart b/lib/widgets/filter_grids/common/action_delegates/chip.dart index d4cd709b5..c0d8c4797 100644 --- a/lib/widgets/filter_grids/common/action_delegates/chip.dart +++ b/lib/widgets/filter_grids/common/action_delegates/chip.dart @@ -53,13 +53,19 @@ class ChipActionDelegate with FeedbackMixin, VaultAwareMixin { case ChipAction.goToTagPage: _goTo(context, filter, TagListPage.routeName, (context) => const TagListPage()); case ChipAction.goToExplorerPage: - if (filter is PathFilter) { + String? path; + if (filter is AlbumFilter) { + path = filter.album; + } else if (filter is PathFilter) { + path = filter.path; + } + if (path != null) { Navigator.maybeOf(context)?.pushAndRemoveUntil( MaterialPageRoute( settings: const RouteSettings(name: ExplorerPage.routeName), - builder: (context) => ExplorerPage(path: filter.path), + builder: (context) => ExplorerPage(path: path), ), - (route) => false, + (route) => false, ); } case ChipAction.ratingOrGreater: diff --git a/lib/widgets/settings/common/quick_actions/editor_page.dart b/lib/widgets/settings/common/quick_actions/editor_page.dart index e31b2d7e1..27248437c 100644 --- a/lib/widgets/settings/common/quick_actions/editor_page.dart +++ b/lib/widgets/settings/common/quick_actions/editor_page.dart @@ -98,7 +98,7 @@ class _QuickActionEditorBodyState extends State { directory.getVolumeDescription(context), ...pContext.split(directory.relativeDir), ]; - final crumbStyle = Theme.of(context).textTheme.bodyMedium; - final crumbColor = crumbStyle!.color!.withOpacity(.4); - return DefaultTextStyle( - style: crumbStyle.copyWith( - color: crumbColor, - fontWeight: FontWeight.w500, - ), - child: ListView.builder( - scrollDirection: Axis.horizontal, - controller: _scrollController, - padding: const EdgeInsets.symmetric(horizontal: 8), - itemBuilder: (context, index) { - Widget _buildText(String text) => Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Text(text), - ); - - if (index >= parts.length) return const SizedBox(); - final text = parts[index]; - if (index == parts.length - 1) { - return Center( - child: DefaultTextStyle.merge( - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - ), - child: _buildText(text), - ), + final crumbColor = DefaultTextStyle.of(context).style.color; + return ListView.builder( + scrollDirection: Axis.horizontal, + controller: _scrollController, + padding: const EdgeInsets.symmetric(horizontal: 8), + itemBuilder: (context, index) { + Widget _buildText(String text) => Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Text(text), ); - } - return GestureDetector( - onTap: () { - final path = pContext.joinAll([ - directory.volumePath, - ...parts.skip(1).take(index), - ]); - widget.onTap(path); - }, - child: Container( - // use a `Container` with a dummy color to make it expand - // so that we can also detect taps around the title `Text` - color: Colors.transparent, - child: Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - _buildText(text), - Icon( - AIcons.next, - color: crumbColor, - ), - ], + + if (index >= parts.length) return const SizedBox(); + final text = parts[index]; + if (index == parts.length - 1) { + return Center( + child: DefaultTextStyle.merge( + style: TextStyle( + color: Theme.of(context).colorScheme.primary, ), + child: _buildText(text), ), ); - }, - itemCount: parts.length, - ), + } + return GestureDetector( + onTap: () { + final path = pContext.joinAll([ + directory.volumePath, + ...parts.skip(1).take(index), + ]); + widget.onTap(path); + }, + child: Container( + // use a `Container` with a dummy color to make it expand + // so that we can also detect taps around the title `Text` + color: Colors.transparent, + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _buildText(text), + Icon( + AIcons.next, + color: crumbColor, + ), + ], + ), + ), + ); + }, + itemCount: parts.length, ); } } diff --git a/lib/widgets/settings/privacy/file_picker/file_picker_page.dart b/lib/widgets/settings/privacy/file_picker/file_picker_page.dart index 6dc2942c8..d8d5c09b2 100644 --- a/lib/widgets/settings/privacy/file_picker/file_picker_page.dart +++ b/lib/widgets/settings/privacy/file_picker/file_picker_page.dart @@ -101,16 +101,7 @@ class _FilePickerPageState extends State { body: SafeArea( child: Column( children: [ - SizedBox( - height: kMinInteractiveDimension, - child: CrumbLine( - directory: _directory, - onTap: (path) { - _goTo(path); - setState(() {}); - }, - ), - ), + _buildCrumbLine(context), const Divider(height: 0), Expanded( child: visibleContents == null @@ -144,6 +135,26 @@ class _FilePickerPageState extends State { ); } + Widget _buildCrumbLine(BuildContext context) { + final crumbStyle = Theme.of(context).textTheme.bodyMedium!; + return SizedBox( + height: kMinInteractiveDimension, + child: DefaultTextStyle( + style: crumbStyle.copyWith( + color: crumbStyle.color!.withOpacity(.4), + fontWeight: FontWeight.w500, + ), + child: CrumbLine( + directory: _directory, + onTap: (path) { + _goTo(path); + setState(() {}); + }, + ), + ), + ); + } + String _getTitle(BuildContext context) { if (_directory.relativeDir.isEmpty) { return _directory.getVolumeDescription(context); diff --git a/lib/widgets/viewer/info/color_section.dart b/lib/widgets/viewer/info/color_section.dart index 087e15f3e..2dec25bd7 100644 --- a/lib/widgets/viewer/info/color_section.dart +++ b/lib/widgets/viewer/info/color_section.dart @@ -63,7 +63,7 @@ class _ColorSectionSliverState extends State { const SectionRow(icon: AIcons.palette), ...colors.map( (v) => Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all(8), child: Row( mainAxisSize: MainAxisSize.min, children: [ diff --git a/lib/widgets/viewer/overlay/bottom.dart b/lib/widgets/viewer/overlay/bottom.dart index 9a6024f17..06f00808b 100644 --- a/lib/widgets/viewer/overlay/bottom.dart +++ b/lib/widgets/viewer/overlay/bottom.dart @@ -302,7 +302,7 @@ class ExtraBottomOverlay extends StatelessWidget { Widget build(BuildContext context) { final viewInsets = this.viewInsets ?? MediaQuery.viewInsetsOf(context); final viewPadding = this.viewPadding ?? MediaQuery.viewPaddingOf(context); - final safePadding = (viewInsets + viewPadding).copyWith(bottom: 8) + const EdgeInsets.symmetric(horizontal: 8.0); + final safePadding = (viewInsets + viewPadding).copyWith(bottom: 8) + const EdgeInsets.symmetric(horizontal: 8); return Padding( padding: safePadding, diff --git a/lib/widgets/welcome_page.dart b/lib/widgets/welcome_page.dart index 1bde23fa2..1ad184eab 100644 --- a/lib/widgets/welcome_page.dart +++ b/lib/widgets/welcome_page.dart @@ -137,7 +137,7 @@ class _WelcomePageState extends State { context.l10n.welcomeMessage, style: Theme.of(context).textTheme.headlineSmall, ); - final padding = isPortrait ? 16.0 : 8.0; + final double padding = isPortrait ? 16.0 : 8.0; return [ SizedBox(height: padding), ...(isPortrait