Display viewed list

This commit is contained in:
niuhuan 2022-03-27 14:19:08 +08:00
parent 9dc7ce03f2
commit 3277f08f80
12 changed files with 147 additions and 10 deletions

View File

@ -1 +1 @@
v1.4.3
v1.4.4

View File

@ -1,2 +1,2 @@
- [x] 增加纯黑主题
- [x] 设置点击屏幕一次为默认的全屏方式
- [x] 大部分页面已经支持鼠标右键退回上一页的功能, 但是需要从设置中开启 (并不是所有人都需要)
- [x] 列表中标记出看过的漫画

View File

@ -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

View File

@ -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=

View File

@ -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()

View File

@ -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)
}

View File

@ -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

View File

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>

View File

@ -711,4 +711,9 @@ class Method {
"newPassword": newPassword,
});
}
Future<List<String>> loadViewedList(List<String> list) async {
return List.of(jsonDecode(await _flatInvoke("loadViewedList", list)))
.cast();
}
}

View File

@ -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<InitScreen> {
await initNoAnimation();
await initExportRename();
await initVersion();
await initUsingRightClickPop();
autoCheckNewVersion();
// , token失效重新登录, 1
if (await method.preLogin()) {

View File

@ -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<StatefulWidget> createState() => _ComicInfoCard();
@ -175,6 +180,7 @@ class _ComicInfoCard extends State<ComicInfoCard> {
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<Widget> 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 =

View File

@ -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<ComicSimple> 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<StatefulWidget> createState() => _ComicListState();
}
class _ComicListState extends State<ComicList> {
final List<String> 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<ComicList> {
}
return LinkToComicInfo(
comicId: e.id,
child: ComicInfoCard(e),
child: ComicInfoCard(
e,
viewed: viewedList.contains(e.id),
),
);
}).toList(),
...widget.appendWidget != null