Skip to content

Commit c462c48

Browse files
committed
✨ 标题设置&更新
1 parent 3d6a2af commit c462c48

File tree

5 files changed

+118
-17
lines changed

5 files changed

+118
-17
lines changed

lib/database/app/app_bmf.dart

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class BtsAppBmf {
3838
);
3939
''');
4040
BTLogTool.info('Create table $_tableName');
41+
hasTitle = true;
4142
}
4243

4344
/// 为了兼容旧版本,这里需要检查是否有title字段
@@ -62,6 +63,7 @@ class BtsAppBmf {
6263
Future<List<AppBmfModel>> readAll() async {
6364
await _instance.preCheck();
6465
var result = await _instance.sqlite.db.query(_tableName);
66+
if (result.isEmpty) return [];
6567
return result.map(AppBmfModel.fromJson).toList();
6668
}
6769

lib/pages/app/bmf_page.dart

+9-6
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
88
// Project imports:
99
import '../../database/app/app_bmf.dart';
1010
import '../../database/app/app_rss.dart';
11+
import '../../models/database/app_bmf_model.dart';
1112
import '../../ui/bt_infobar.dart';
1213
import '../../widgets/bangumi/subject_detail/bsd_bmf.dart';
1314

@@ -29,7 +30,7 @@ class _BmfPageState extends State<BmfPage> with AutomaticKeepAliveClientMixin {
2930
final BtsAppRss rss = BtsAppRss();
3031

3132
/// Bmf 数据,只包括subject
32-
List<int> bmfList = [];
33+
List<AppBmfModel> bmfList = [];
3334

3435
/// 保存状态
3536
@override
@@ -71,11 +72,9 @@ class _BmfPageState extends State<BmfPage> with AutomaticKeepAliveClientMixin {
7172

7273
/// 初始化
7374
Future<void> init() async {
74-
bmfList = [];
75+
bmfList.clear();
7576
setState(() {});
76-
var read = await sqlite.readAll();
77-
var list = read.map((e) => e.subject).toList();
78-
bmfList = list;
77+
bmfList = await sqlite.readAll();
7978
setState(() {});
8079
}
8180

@@ -109,7 +108,11 @@ class _BmfPageState extends State<BmfPage> with AutomaticKeepAliveClientMixin {
109108
child: buildHeader(context),
110109
),
111110
content: ListView.separated(
112-
itemBuilder: (_, i) => BsdBmfWidget(bmfList[i], isConfig: true),
111+
itemBuilder: (_, i) => BsdBmfWidget(
112+
bmfList[i].subject,
113+
bmfList[i].title ?? '',
114+
isConfig: true,
115+
),
113116
separatorBuilder: (_, __) => SizedBox(height: 8.h),
114117
itemCount: bmfList.length,
115118
padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 8.h),

lib/pages/bangumi/bangumi_detail.dart

+4-1
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,10 @@ class _BangumiDetailState extends ConsumerState<BangumiDetail>
331331
],
332332
BsdUserEpisodes(data!),
333333
SizedBox(height: 12.h),
334-
BsdBmfWidget(data!.id),
334+
BsdBmfWidget(
335+
data!.id,
336+
data!.nameCn.isEmpty ? data!.name : data!.nameCn,
337+
),
335338
SizedBox(height: 12.h),
336339
BsdRelation(data!.id),
337340
SizedBox(height: 12.h),

lib/request/bangumi/bangumi_api.dart

-7
Original file line numberDiff line numberDiff line change
@@ -172,13 +172,6 @@ class BtrBangumiApi {
172172
}
173173
}
174174

175-
/// 获取番剧详情(精简版)
176-
Future<BangumiSubject?> getSubjectDetail2(String id) async {
177-
var resp = await getSubjectDetail(id);
178-
if (resp.code != 0 || resp.data == null) return null;
179-
return resp.data;
180-
}
181-
182175
/// 获取条目关联条目
183176
Future<BTResponse> getSubjectRelations(int id) async {
184177
try {

lib/widgets/bangumi/subject_detail/bsd_bmf.dart

+103-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ import 'package:path/path.dart' as path;
1111
import 'package:url_launcher/url_launcher_string.dart';
1212

1313
// Project imports:
14+
import '../../../controller/app/progress_controller.dart';
1415
import '../../../database/app/app_bmf.dart';
1516
import '../../../database/app/app_rss.dart';
17+
import '../../../models/bangumi/bangumi_model.dart';
1618
import '../../../models/database/app_bmf_model.dart';
19+
import '../../../request/bangumi/bangumi_api.dart';
1720
import '../../../store/nav_store.dart';
1821
import '../../../tools/file_tool.dart';
1922
import '../../../tools/notifier_tool.dart';
@@ -29,11 +32,19 @@ class BsdBmfWidget extends StatefulWidget {
2932
/// subjectId
3033
final int subjectId;
3134

35+
/// title
36+
final String title;
37+
3238
/// 模式-是用于详情页还是用于配置页
3339
final bool isConfig;
3440

3541
/// 构造函数
36-
const BsdBmfWidget(this.subjectId, {super.key, this.isConfig = false});
42+
const BsdBmfWidget(
43+
this.subjectId,
44+
this.title, {
45+
super.key,
46+
this.isConfig = false,
47+
});
3748

3849
@override
3950
State<BsdBmfWidget> createState() => _BsdBmfWidgetState();
@@ -48,11 +59,20 @@ class _BsdBmfWidgetState extends State<BsdBmfWidget>
4859
/// rss 数据库
4960
final BtsAppRss sqliteRss = BtsAppRss();
5061

62+
/// bgmApi
63+
final BtrBangumiApi apiBgm = BtrBangumiApi();
64+
65+
/// progress
66+
late ProgressController progress = ProgressController();
67+
5168
/// file tool
5269
final BTFileTool fileTool = BTFileTool();
5370

5471
/// bmf
55-
late AppBmfModel bmf = AppBmfModel(subject: widget.subjectId);
72+
late AppBmfModel bmf = AppBmfModel(
73+
subject: widget.subjectId,
74+
title: widget.title,
75+
);
5676

5777
/// 是否保持状态
5878
@override
@@ -86,6 +106,67 @@ class _BsdBmfWidgetState extends State<BsdBmfWidget>
86106
);
87107
}
88108

109+
/// 获取title
110+
Future<String?> getTitle() async {
111+
if (mounted) {
112+
progress = ProgressWidget.show(context, title: '正在查找标题', text: '请稍后');
113+
}
114+
var resp = await apiBgm.getSubjectDetail(widget.subjectId.toString());
115+
progress.end();
116+
if (resp.code != 0 || resp.data == null) {
117+
if (mounted) await showRespErr(resp, context);
118+
return null;
119+
}
120+
var data = resp.data as BangumiSubject;
121+
if (data.nameCn.isEmpty) return data.name;
122+
return data.nameCn;
123+
}
124+
125+
/// 标题检测
126+
Future<void> titleCheck() async {
127+
if (bmf.title != null && bmf.title!.isNotEmpty) return;
128+
var confirm = await showConfirm(
129+
context,
130+
title: '尝试获取标题?',
131+
content: '检测到标题为空',
132+
);
133+
if (!confirm) return;
134+
var title = await getTitle();
135+
if (title != null) bmf.title = title;
136+
setState(() {});
137+
await sqliteBmf.write(bmf);
138+
if (mounted) {
139+
await BtInfobar.success(context, '[${bmf.subject}]已设置标题:${bmf.title}');
140+
}
141+
}
142+
143+
/// 更新标题
144+
Future<void> updateTitle() async {
145+
var hasTitle = bmf.title != null && bmf.rss!.isNotEmpty;
146+
var title = bmf.title;
147+
if (!hasTitle) title = await getTitle();
148+
title ??= "";
149+
if (mounted) {
150+
var res = await showInput(
151+
context,
152+
title: hasTitle ? '修改标题' : '设置标题',
153+
value: title,
154+
content: '',
155+
);
156+
if (res != null) {
157+
setState(() {
158+
bmf.title = title;
159+
});
160+
if (mounted) {
161+
await BtInfobar.success(
162+
context,
163+
'[${bmf.subject}]已设置标题:${bmf.title}',
164+
);
165+
}
166+
}
167+
}
168+
}
169+
89170
/// 更新Rss链接
90171
Future<void> updateRss() async {
91172
var input = await showInput(
@@ -108,6 +189,7 @@ class _BsdBmfWidgetState extends State<BsdBmfWidget>
108189
if (mounted) await BtInfobar.success(context, '成功删除旧 RSS 数据');
109190
}
110191
bmf.rss = input;
192+
await titleCheck();
111193
await sqliteBmf.write(bmf);
112194
var read = await sqliteBmf.read(bmf.subject);
113195
if (read != null) {
@@ -127,6 +209,7 @@ class _BsdBmfWidgetState extends State<BsdBmfWidget>
127209
return;
128210
}
129211
bmf.download = dir;
212+
await titleCheck();
130213
await sqliteBmf.write(bmf);
131214
var read = await sqliteBmf.read(bmf.subject);
132215
if (read != null) {
@@ -136,6 +219,18 @@ class _BsdBmfWidgetState extends State<BsdBmfWidget>
136219
if (mounted) await BtInfobar.success(context, '成功设置下载目录');
137220
}
138221

222+
/// buildHeaderActTitle
223+
Widget buildHeaderActTitle(BuildContext context) {
224+
var hasTitle = bmf.title != null && bmf.rss!.isNotEmpty;
225+
return Tooltip(
226+
message: hasTitle ? '修改标题' : '设置标题',
227+
child: IconButton(
228+
icon: BtIcon(hasTitle ? MdiIcons.bookEdit : MdiIcons.bookEditOutline),
229+
onPressed: updateTitle,
230+
),
231+
);
232+
}
233+
139234
/// buildHeaderActRss
140235
Widget buildHeaderActRss(BuildContext context) {
141236
var hasRss = bmf.rss != null && bmf.rss!.isNotEmpty;
@@ -186,6 +281,8 @@ class _BsdBmfWidgetState extends State<BsdBmfWidget>
186281
Widget buildHeaderAction(BuildContext context) {
187282
return Row(
188283
children: [
284+
buildHeaderActTitle(context),
285+
SizedBox(width: 12.w),
189286
buildHeaderActRss(context),
190287
SizedBox(width: 12.w),
191288
buildHeaderActFile(context),
@@ -222,7 +319,10 @@ class _BsdBmfWidgetState extends State<BsdBmfWidget>
222319
child: Expander(
223320
leading: BsdBmfLeading(widget.isConfig, bmf),
224321
header: widget.isConfig
225-
? Text(bmf.subject.toString(), style: TextStyle(fontSize: 24.sp))
322+
? Text(
323+
'${bmf.title ?? ''}(${bmf.subject})',
324+
style: TextStyle(fontSize: 24.sp),
325+
)
226326
: Text('BMF Config', style: TextStyle(fontSize: 24.sp)),
227327
content: Column(
228328
crossAxisAlignment: CrossAxisAlignment.start,

0 commit comments

Comments
 (0)