From abc3623026cf52ba4bc6ccf12dbd408214b5a845 Mon Sep 17 00:00:00 2001 From: deltamaya Date: Mon, 28 Oct 2024 16:44:13 +0800 Subject: [PATCH] improve UI --- android/app/build.gradle | 3 ++ lib/components/comic.dart | 82 ++++++++++++++++++++++----------------- lib/pages/comic_page.dart | 20 ++++++---- 3 files changed, 63 insertions(+), 42 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 6469d19..0394805 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -43,6 +43,9 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } + kotlinOptions{ + jvmTarget = JavaVersion.VERSION_17 + } signingConfigs { debug { diff --git a/lib/components/comic.dart b/lib/components/comic.dart index a10d1db..f11ac9e 100644 --- a/lib/components/comic.dart +++ b/lib/components/comic.dart @@ -277,7 +277,8 @@ class ComicTile extends StatelessWidget { onTap: _onTap, onLongPress: enableLongPressed ? () => onLongPress(context) : null, - onSecondaryTapDown: (detail) => onSecondaryTap(detail, context), + onSecondaryTapDown: (detail) => + onSecondaryTap(detail, context), borderRadius: BorderRadius.circular(8), child: const SizedBox.expand(), ), @@ -296,7 +297,7 @@ class ComicTile extends StatelessWidget { var words = []; var all = []; all.addAll(comic.title.split(' ').where((element) => element != '')); - if(comic.subtitle != null && comic.subtitle != "") { + if (comic.subtitle != null && comic.subtitle != "") { all.add(comic.subtitle!); } all.addAll(comic.tags ?? []); @@ -332,7 +333,8 @@ class ComicTile extends StatelessWidget { } appdata.saveData(); context.showMessage(message: 'Blocked'.tl); - comicTileContext.findAncestorStateOfType<_SliverGridComicsState>()! + comicTileContext + .findAncestorStateOfType<_SliverGridComicsState>()! .update(); }, child: Text('Block'.tl), @@ -370,6 +372,9 @@ class _ComicDescription extends StatelessWidget { Widget build(BuildContext context) { if (tags != null) { tags!.removeWhere((element) => element.removeAllBlank == ""); + for (var s in tags!) { + s = s.replaceAll("\n", " "); + } } var enableTranslate = App.locale.languageCode == 'zh' && this.enableTranslate; @@ -384,50 +389,57 @@ class _ComicDescription extends StatelessWidget { ), maxLines: maxLines, overflow: TextOverflow.ellipsis, + softWrap: true, ), if (subtitle != "") Text( subtitle, - style: const TextStyle(fontSize: 10.0), + style: TextStyle( + fontSize: 10.0, + color: context.colorScheme.onSurface.withOpacity(0.7)), maxLines: 1, + softWrap: true, + overflow: TextOverflow.ellipsis, ), const SizedBox( height: 4, ), if (tags != null) - Expanded( - child: LayoutBuilder( - builder: (context, constraints) => Padding( - padding: EdgeInsets.only(bottom: constraints.maxHeight % 23), - child: Wrap( - runAlignment: WrapAlignment.start, - clipBehavior: Clip.antiAlias, - crossAxisAlignment: WrapCrossAlignment.end, - children: [ - for (var s in tags!) - Container( - margin: const EdgeInsets.fromLTRB(0, 0, 4, 3), - padding: const EdgeInsets.fromLTRB(3, 1, 3, 3), - decoration: BoxDecoration( - color: s == "Unavailable" - ? Theme.of(context).colorScheme.errorContainer - : Theme.of(context) - .colorScheme - .secondaryContainer, - borderRadius: - const BorderRadius.all(Radius.circular(8)), - ), - child: Text( - enableTranslate ? TagsTranslation.translateTag(s) : s, - style: const TextStyle(fontSize: 12), - ), + LayoutBuilder(builder: (context, constraints) { + return Container( + constraints: const BoxConstraints(maxHeight: 45), + child: Wrap( + runAlignment: WrapAlignment.start, + clipBehavior: Clip.antiAlias, + crossAxisAlignment: WrapCrossAlignment.end, + spacing: 4, + runSpacing: 3, + children: [ + for (var s in tags!) + Container( + padding: const EdgeInsets.fromLTRB(3, 1, 3, 3), + constraints: BoxConstraints( + maxWidth: constraints.maxWidth * 0.45, ), - ], - ), + decoration: BoxDecoration( + color: s == "Unavailable" + ? Theme.of(context).colorScheme.errorContainer + : Theme.of(context).colorScheme.secondaryContainer, + borderRadius: + const BorderRadius.all(Radius.circular(8)), + ), + child: Text( + enableTranslate ? TagsTranslation.translateTag(s) : s, + style: const TextStyle(fontSize: 12), + softWrap: true, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + ], ), - ), - ), - const SizedBox(height: 2), + ); + }), const Spacer(), if (rating != null) StarRating(value: rating!, size: 18), Row( diff --git a/lib/pages/comic_page.dart b/lib/pages/comic_page.dart index dd349e4..ffe1163 100644 --- a/lib/pages/comic_page.dart +++ b/lib/pages/comic_page.dart @@ -245,7 +245,7 @@ class _ComicPageState extends LoadingState iconColor: context.useTextColor(Colors.red), ), _ActionButton( - icon: const Icon(Icons.bookmark_border), + icon: const Icon(Icons.bookmark_outline_outlined), activeIcon: const Icon(Icons.bookmark), isActive: isFavorite || isAddToLocalFav, text: 'Favorite'.tl, @@ -514,8 +514,9 @@ abstract mixin class _ComicPageActions { cid: comic.id, type: comic.comicType, isFavorite: isFavorite, - onFavorite: (b) { - isFavorite = b; + onFavorite: (local,network) { + isFavorite=network??isFavorite; + isAddToLocalFav=local??isAddToLocalFav; update(); }, favoriteItem: FavoriteItem( @@ -759,6 +760,7 @@ abstract mixin class _ComicPageActions { } class _ActionButton extends StatelessWidget { + const _ActionButton({ required this.icon, required this.text, @@ -768,7 +770,6 @@ class _ActionButton extends StatelessWidget { this.isLoading, this.iconColor, }); - final Widget icon; final Widget? activeIcon; @@ -782,7 +783,6 @@ class _ActionButton extends StatelessWidget { final bool? isLoading; final Color? iconColor; - @override Widget build(BuildContext context) { return Container( @@ -824,6 +824,7 @@ class _ActionButton extends StatelessWidget { } } + class _ComicChapters extends StatefulWidget { const _ComicChapters(); @@ -1118,7 +1119,7 @@ class _FavoritePanel extends StatefulWidget { /// if null, the comic source does not support favorite or support multiple favorite lists final bool? isFavorite; - final void Function(bool) onFavorite; + final void Function(bool?,bool?) onFavorite; final FavoriteItem favoriteItem; @@ -1262,10 +1263,12 @@ class _FavoritePanelState extends State<_FavoritePanel> { LocalFavoritesManager() .deleteComicWithId(folder, widget.cid, widget.type); } + widget.onFavorite(false,null); } else { for (var folder in selectedLocalFolders) { LocalFavoritesManager().addComic(folder, widget.favoriteItem); } + widget.onFavorite(true,null); } context.pop(); }, @@ -1281,7 +1284,9 @@ class _FavoritePanelState extends State<_FavoritePanel> { cid: widget.cid, comicSource: comicSource, isFavorite: widget.isFavorite, - onFavorite: widget.onFavorite, + onFavorite: (network){ + widget.onFavorite(null,network); + }, ); } } @@ -1332,6 +1337,7 @@ class _NetworkFavoritesState extends State<_NetworkFavorites> { setState(() { isLoading = true; }); + var res = await widget.comicSource.favoriteData! .addOrDelFavorite!(widget.cid, '', !isFavorite, null); if (res.success) {