Display viewed list
This commit is contained in:
parent
9dc7ce03f2
commit
3277f08f80
|
@ -1 +1 @@
|
|||
v1.4.3
|
||||
v1.4.4
|
|
@ -1,2 +1,2 @@
|
|||
- [x] 增加纯黑主题
|
||||
- [x] 设置点击屏幕一次为默认的全屏方式
|
||||
- [x] 大部分页面已经支持鼠标右键退回上一页的功能, 但是需要从设置中开启 (并不是所有人都需要)
|
||||
- [x] 列表中标记出看过的漫画
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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=
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue