From 3277f08f80cbb6e39e3de9bee1e0d9dcc8f65e6d Mon Sep 17 00:00:00 2001 From: niuhuan Date: Sun, 27 Mar 2022 14:19:08 +0800 Subject: [PATCH] Display viewed list --- ci/version.code.txt | 2 +- ci/version.info.txt | 4 +- go/go.mod | 2 +- go/go.sum | 2 + go/pikapika/database/comic_center/center.go | 8 ++++ go/pikapika/pikapika.go | 16 +++++++ ios/Podfile.lock | 50 +++++++++++++++++++++ ios/Runner/Info.plist | 2 + lib/basic/Method.dart | 5 +++ lib/screens/InitScreen.dart | 2 + lib/screens/components/ComicInfoCard.dart | 38 +++++++++++++++- lib/screens/components/ComicList.dart | 26 +++++++++-- 12 files changed, 147 insertions(+), 10 deletions(-) diff --git a/ci/version.code.txt b/ci/version.code.txt index 5beebea..44c3405 100644 --- a/ci/version.code.txt +++ b/ci/version.code.txt @@ -1 +1 @@ -v1.4.3 \ No newline at end of file +v1.4.4 \ No newline at end of file diff --git a/ci/version.info.txt b/ci/version.info.txt index 06e9222..c9eba11 100644 --- a/ci/version.info.txt +++ b/ci/version.info.txt @@ -1,2 +1,2 @@ -- [x] 增加纯黑主题 -- [x] 设置点击屏幕一次为默认的全屏方式 +- [x] 大部分页面已经支持鼠标右键退回上一页的功能, 但是需要从设置中开启 (并不是所有人都需要) +- [x] 列表中标记出看过的漫画 diff --git a/go/go.mod b/go/go.mod index 47a1678..a7a7fdc 100644 --- a/go/go.mod +++ b/go/go.mod @@ -12,7 +12,7 @@ require ( github.com/niuhuan/pica-go v0.0.0-20220224154849-76bf750f8c4d github.com/pkg/errors v0.9.1 golang.org/x/image v0.0.0-20190802002840-cff245a6509b - golang.org/x/mobile v0.0.0-20220307220422-55113b94f09c // indirect + golang.org/x/mobile v0.0.0-20220325161704-447654d348e3 // indirect golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7 // indirect golang.org/x/text v0.3.7 // indirect diff --git a/go/go.sum b/go/go.sum index b589d73..47239a1 100644 --- a/go/go.sum +++ b/go/go.sum @@ -72,6 +72,8 @@ golang.org/x/mobile v0.0.0-20220224134551-8a0a1e50732f h1:G/wQ/Mbs60nXhRM80J4DOz golang.org/x/mobile v0.0.0-20220224134551-8a0a1e50732f/go.mod h1:pe2sM7Uk+2Su1y7u/6Z8KJ24D7lepUjFZbhFOrmDfuQ= golang.org/x/mobile v0.0.0-20220307220422-55113b94f09c h1:9J0m/JcA5YXYbamDhF5I3T7cJnR7V75OCLnMCPb5gl4= golang.org/x/mobile v0.0.0-20220307220422-55113b94f09c/go.mod h1:pe2sM7Uk+2Su1y7u/6Z8KJ24D7lepUjFZbhFOrmDfuQ= +golang.org/x/mobile v0.0.0-20220325161704-447654d348e3 h1:ZDL7hDvJEQEcHVkoZawKmRUgbqn1pOIzb8EinBh5csU= +golang.org/x/mobile v0.0.0-20220325161704-447654d348e3/go.mod h1:pe2sM7Uk+2Su1y7u/6Z8KJ24D7lepUjFZbhFOrmDfuQ= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= diff --git a/go/pikapika/database/comic_center/center.go b/go/pikapika/database/comic_center/center.go index 210e52a..85de0b6 100644 --- a/go/pikapika/database/comic_center/center.go +++ b/go/pikapika/database/comic_center/center.go @@ -568,6 +568,14 @@ func UpdateTimeCacheImageTime(id uint) { } } +func ViewedList(ids []string) (viewedList []ComicView) { + err := db.Find(&viewedList, ids).Error + if err != nil { + panic(err) + } + return +} + func VACUUM() error { mutex.Lock() defer mutex.Unlock() diff --git a/go/pikapika/pikapika.go b/go/pikapika/pikapika.go index d6323e2..58ee1e7 100644 --- a/go/pikapika/pikapika.go +++ b/go/pikapika/pikapika.go @@ -549,6 +549,20 @@ func defaultHttpClientGet(url string) (string, error) { return string(buff), nil } +func loadViewedList(params string) (string, error) { + var ids []string + err := json.Unmarshal([]byte(params), &ids) + if err != nil { + return "", err + } + viewedList := comic_center.ViewedList(ids) + ids = make([]string, len(viewedList)) + for i, view := range viewedList { + ids[i] = view.ID + } + return serialize(ids, nil) +} + func FlatInvoke(method string, params string) (string, error) { switch method { case "saveProperty": @@ -732,6 +746,8 @@ func FlatInvoke(method string, params string) (string, error) { return updateAvatar(params) case "defaultHttpClientGet": return defaultHttpClientGet(params) + case "loadViewedList": + return loadViewedList(params) } return "", errors.New("method not found : " + method) } diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 1b0ed4c..35c5df8 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,4 +1,38 @@ PODS: + - DKImagePickerController/Core (4.3.2): + - DKImagePickerController/ImageDataManager + - DKImagePickerController/Resource + - DKImagePickerController/ImageDataManager (4.3.2) + - DKImagePickerController/PhotoGallery (4.3.2): + - DKImagePickerController/Core + - DKPhotoGallery + - DKImagePickerController/Resource (4.3.2) + - DKPhotoGallery (0.0.17): + - DKPhotoGallery/Core (= 0.0.17) + - DKPhotoGallery/Model (= 0.0.17) + - DKPhotoGallery/Preview (= 0.0.17) + - DKPhotoGallery/Resource (= 0.0.17) + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Core (0.0.17): + - DKPhotoGallery/Model + - DKPhotoGallery/Preview + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Model (0.0.17): + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Preview (0.0.17): + - DKPhotoGallery/Model + - DKPhotoGallery/Resource + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Resource (0.0.17): + - SDWebImage + - SwiftyGif + - file_picker (0.0.1): + - DKImagePickerController/PhotoGallery + - Flutter - Flutter (1.0.0) - image_cropper (0.0.4): - Flutter @@ -7,11 +41,16 @@ PODS: - Flutter - "permission_handler (5.1.0+2)": - Flutter + - SDWebImage (5.12.5): + - SDWebImage/Core (= 5.12.5) + - SDWebImage/Core (5.12.5) + - SwiftyGif (5.4.3) - TOCropViewController (2.6.1) - url_launcher_ios (0.0.1): - Flutter DEPENDENCIES: + - file_picker (from `.symlinks/plugins/file_picker/ios`) - Flutter (from `Flutter`) - image_cropper (from `.symlinks/plugins/image_cropper/ios`) - image_picker (from `.symlinks/plugins/image_picker/ios`) @@ -20,9 +59,15 @@ DEPENDENCIES: SPEC REPOS: trunk: + - DKImagePickerController + - DKPhotoGallery + - SDWebImage + - SwiftyGif - TOCropViewController EXTERNAL SOURCES: + file_picker: + :path: ".symlinks/plugins/file_picker/ios" Flutter: :path: Flutter image_cropper: @@ -35,10 +80,15 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/url_launcher_ios/ios" SPEC CHECKSUMS: + DKImagePickerController: b5eb7f7a388e4643264105d648d01f727110fc3d + DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 + file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1 Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a image_cropper: 60c2789d1f1a78c873235d4319ca0c34a69f2d98 image_picker: 541dcbb3b9cf32d87eacbd957845d8651d6c62c3 permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0 + SDWebImage: 0905f1b7760fc8ac4198cae0036600d67478751e + SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780 TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863 url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index ad47621..9b4d0bb 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable diff --git a/lib/basic/Method.dart b/lib/basic/Method.dart index 2f44300..357d4f3 100644 --- a/lib/basic/Method.dart +++ b/lib/basic/Method.dart @@ -711,4 +711,9 @@ class Method { "newPassword": newPassword, }); } + + Future> loadViewedList(List list) async { + return List.of(jsonDecode(await _flatInvoke("loadViewedList", list))) + .cast(); + } } diff --git a/lib/screens/InitScreen.dart b/lib/screens/InitScreen.dart index c5721c5..c325314 100644 --- a/lib/screens/InitScreen.dart +++ b/lib/screens/InitScreen.dart @@ -26,6 +26,7 @@ import 'package:pikapika/basic/config/Themes.dart'; import 'package:pikapika/basic/Method.dart'; import 'package:pikapika/basic/config/ListLayout.dart'; import 'package:pikapika/basic/config/TimeOffsetHour.dart'; +import 'package:pikapika/basic/config/UsingRightClickPop.dart'; import 'package:pikapika/basic/config/Version.dart'; import 'package:pikapika/basic/config/VolumeController.dart'; import 'package:pikapika/basic/config/shadowCategoriesMode.dart'; @@ -83,6 +84,7 @@ class _InitScreenState extends State { await initNoAnimation(); await initExportRename(); await initVersion(); + await initUsingRightClickPop(); autoCheckNewVersion(); // 登录, 如果token失效重新登录, 网络不好的时候可能需要1分钟 if (await method.preLogin()) { diff --git a/lib/screens/components/ComicInfoCard.dart b/lib/screens/components/ComicInfoCard.dart index a318605..c7310d9 100644 --- a/lib/screens/components/ComicInfoCard.dart +++ b/lib/screens/components/ComicInfoCard.dart @@ -12,9 +12,14 @@ import 'Images.dart'; class ComicInfoCard extends StatefulWidget { final bool linkItem; final ComicSimple info; + final bool viewed; - const ComicInfoCard(this.info, {Key? key, this.linkItem = false}) - : super(key: key); + const ComicInfoCard( + this.info, { + Key? key, + this.linkItem = false, + this.viewed = false, + }) : super(key: key); @override State createState() => _ComicInfoCard(); @@ -175,6 +180,7 @@ class _ComicInfoCard extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ buildFinished(info.finished), + ...buildViewed(widget.viewed), Expanded(child: Container()), ...(like == null ? [] @@ -299,6 +305,34 @@ Widget buildFinished(bool comicFinished) { return Container(); } +List buildViewed(viewed) { + if (!viewed) { + return []; + } + return [ + Container(height: 5), + Container( + padding: const EdgeInsets.only(left: 8, right: 8), + decoration: BoxDecoration( + color: Colors.yellow.shade800, + borderRadius: BorderRadius.circular(30), + ), + child: const Text( + "看过", + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.bold, + color: Colors.white, + height: 1.2, + ), + strutStyle: StrutStyle( + height: 1.2, + ), + ), + ), + ]; +} + const double _iconSize = 15; final iconFavorite = diff --git a/lib/screens/components/ComicList.dart b/lib/screens/components/ComicList.dart index 0a9da03..df61515 100644 --- a/lib/screens/components/ComicList.dart +++ b/lib/screens/components/ComicList.dart @@ -4,6 +4,7 @@ import 'package:event/event.dart'; import 'package:flutter/material.dart'; import 'package:pikapika/basic/Common.dart'; import 'package:pikapika/basic/Entities.dart'; +import 'package:pikapika/basic/Method.dart'; import 'package:pikapika/basic/config/ShadowCategories.dart'; import 'package:pikapika/basic/config/ListLayout.dart'; import 'package:pikapika/basic/config/shadowCategoriesMode.dart'; @@ -18,17 +19,31 @@ class ComicList extends StatefulWidget { final List comicList; final ScrollController? controller; - const ComicList(this.comicList, - {this.appendWidget, this.controller, Key? key}) - : super(key: key); + const ComicList( + this.comicList, { + this.appendWidget, + this.controller, + Key? key, + }) : super(key: key); @override State createState() => _ComicListState(); } class _ComicListState extends State { + final List viewedList = []; + + Future _loadViewed() async { + if (widget.comicList.isNotEmpty) { + viewedList.addAll(await method + .loadViewedList(widget.comicList.map((e) => e.id).toList())); + setState(() {}); + } + } + @override void initState() { + _loadViewed(); listLayoutEvent.subscribe(_onLayoutChange); super.initState(); } @@ -109,7 +124,10 @@ class _ComicListState extends State { } return LinkToComicInfo( comicId: e.id, - child: ComicInfoCard(e), + child: ComicInfoCard( + e, + viewed: viewedList.contains(e.id), + ), ); }).toList(), ...widget.appendWidget != null