From 91747efb0f32bef75b4e284862b424f68e2c0045 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Wed, 14 Jul 2021 03:29:52 +0800 Subject: [PATCH] Extract album grid item builder --- .../builder/album_grid_item_builder.dart | 94 +++++++++++++++++++ lib/widget/home_albums.dart | 69 ++------------ 2 files changed, 100 insertions(+), 63 deletions(-) create mode 100644 lib/widget/builder/album_grid_item_builder.dart diff --git a/lib/widget/builder/album_grid_item_builder.dart b/lib/widget/builder/album_grid_item_builder.dart new file mode 100644 index 00000000..8514713a --- /dev/null +++ b/lib/widget/builder/album_grid_item_builder.dart @@ -0,0 +1,94 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:nc_photos/account.dart'; +import 'package:nc_photos/api/api.dart'; +import 'package:nc_photos/api/api_util.dart' as api_util; +import 'package:nc_photos/entity/album.dart'; +import 'package:nc_photos/entity/album/provider.dart'; +import 'package:nc_photos/theme.dart'; +import 'package:nc_photos/widget/album_grid_item.dart'; + +/// Build a standard [AlbumGridItem] for an [Album] +class AlbumGridItemBuilder { + AlbumGridItemBuilder({ + @required this.account, + @required this.album, + this.isSelected = false, + this.onTap, + this.onLongPress, + }); + + AlbumGridItem build(BuildContext context) { + var subtitle = ""; + String subtitle2; + if (album.provider is AlbumStaticProvider) { + subtitle = AppLocalizations.of(context) + .albumSize(AlbumStaticProvider.of(album).items.length); + } else if (album.provider is AlbumDirProvider) { + final provider = album.provider as AlbumDirProvider; + subtitle = provider.dirs.first.strippedPath; + if (provider.dirs.length > 1) { + subtitle2 = "+${provider.dirs.length - 1}"; + } + } + return AlbumGridItem( + cover: _buildAlbumCover(context, album), + title: album.name, + subtitle: subtitle, + subtitle2: subtitle2, + icon: album.provider is AlbumDirProvider ? Icons.folder : null, + isSelected: isSelected, + onTap: onTap, + onLongPress: onLongPress, + ); + } + + Widget _buildAlbumCover(BuildContext context, Album album) { + Widget cover; + try { + final coverFile = album.coverProvider.getCover(album); + final previewUrl = api_util.getFilePreviewUrl(account, coverFile, + width: 512, height: 512); + cover = FittedBox( + clipBehavior: Clip.hardEdge, + fit: BoxFit.cover, + child: CachedNetworkImage( + imageUrl: previewUrl, + httpHeaders: { + "Authorization": Api.getAuthorizationHeaderValue(account), + }, + fadeInDuration: const Duration(), + filterQuality: FilterQuality.high, + errorWidget: (context, url, error) { + // just leave it empty + return Container(); + }, + imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet, + ), + ); + } catch (_) { + cover = Icon( + Icons.panorama, + color: Colors.white.withOpacity(.8), + size: 88, + ); + } + + return ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Container( + color: AppTheme.getListItemBackgroundColor(context), + constraints: const BoxConstraints.expand(), + child: cover, + ), + ); + } + + final Account account; + final Album album; + final bool isSelected; + final VoidCallback onTap; + final VoidCallback onLongPress; +} diff --git a/lib/widget/home_albums.dart b/lib/widget/home_albums.dart index 3179bdb8..fd122162 100644 --- a/lib/widget/home_albums.dart +++ b/lib/widget/home_albums.dart @@ -1,4 +1,3 @@ -import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -8,8 +7,6 @@ import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:kiwi/kiwi.dart'; import 'package:logging/logging.dart'; import 'package:nc_photos/account.dart'; -import 'package:nc_photos/api/api.dart'; -import 'package:nc_photos/api/api_util.dart' as api_util; import 'package:nc_photos/bloc/list_album.dart'; import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album/provider.dart'; @@ -23,8 +20,10 @@ import 'package:nc_photos/theme.dart'; import 'package:nc_photos/use_case/remove.dart'; import 'package:nc_photos/widget/album_grid_item.dart'; import 'package:nc_photos/widget/album_importer.dart'; +import 'package:nc_photos/widget/album_search_delegate.dart'; import 'package:nc_photos/widget/album_viewer.dart'; import 'package:nc_photos/widget/archive_viewer.dart'; +import 'package:nc_photos/widget/builder/album_grid_item_builder.dart'; import 'package:nc_photos/widget/dynamic_album_viewer.dart'; import 'package:nc_photos/widget/home_app_bar.dart'; import 'package:nc_photos/widget/new_album_dialog.dart'; @@ -196,69 +195,13 @@ class _HomeAlbumsState extends State Widget _buildAlbumItem(BuildContext context, int index) { final item = _items[index]; - var subtitle = ""; - String subtitle2; - if (item.album.provider is AlbumStaticProvider) { - subtitle = AppLocalizations.of(context) - .albumSize(AlbumStaticProvider.of(item.album).items.length); - } else if (item.album.provider is AlbumDirProvider) { - final provider = item.album.provider as AlbumDirProvider; - subtitle = provider.dirs.first.strippedPath; - if (provider.dirs.length > 1) { - subtitle2 = "+${provider.dirs.length - 1}"; - } - } - return AlbumGridItem( - cover: _buildAlbumCover(context, item.album), - title: item.album.name, - subtitle: subtitle, - subtitle2: subtitle2, - icon: item.album.provider is AlbumDirProvider ? Icons.folder : null, + return AlbumGridItemBuilder( + account: widget.account, + album: item.album, isSelected: _selectedItems.contains(item), onTap: () => _onItemTap(item), onLongPress: _isSelectionMode ? null : () => _onItemLongPress(item), - ); - } - - Widget _buildAlbumCover(BuildContext context, Album album) { - Widget cover; - try { - final coverFile = album.coverProvider.getCover(album); - final previewUrl = api_util.getFilePreviewUrl(widget.account, coverFile, - width: 512, height: 512); - cover = FittedBox( - clipBehavior: Clip.hardEdge, - fit: BoxFit.cover, - child: CachedNetworkImage( - imageUrl: previewUrl, - httpHeaders: { - "Authorization": Api.getAuthorizationHeaderValue(widget.account), - }, - fadeInDuration: const Duration(), - filterQuality: FilterQuality.high, - errorWidget: (context, url, error) { - // just leave it empty - return Container(); - }, - imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet, - ), - ); - } catch (_) { - cover = Icon( - Icons.panorama, - color: Colors.white.withOpacity(.8), - size: 88, - ); - } - - return ClipRRect( - borderRadius: BorderRadius.circular(8), - child: Container( - color: AppTheme.getListItemBackgroundColor(context), - constraints: const BoxConstraints.expand(), - child: cover, - ), - ); + ).build(context); } Widget _buildArchiveItem(BuildContext context) {