新增epub书摘,高亮文字,适配平板

This commit is contained in:
DelLevin-Home
2026-07-02 05:22:21 +08:00
parent a0a146854b
commit a7e4845e46
27 changed files with 3712 additions and 505 deletions

View File

@@ -145,6 +145,49 @@ class ReaderDao {
);
}
// ─── highlights / annotations (epub) ──────────────────────
/// 保存 EPUB 高亮批注
Future<int> saveHighlight(Map<String, dynamic> annotation) async {
final db = await _db.database;
return db.insert('book_annotations', {
...annotation,
'type': 'highlight',
});
}
/// 获取某 book_idbooks.id的所有 EPUB 高亮
Future<List<Map<String, dynamic>>> getHighlightsByBookId(
String bookId) async {
final db = await _db.database;
return db.query(
'book_annotations',
where: 'book_id = ? AND type = ?',
whereArgs: [bookId, 'highlight'],
orderBy: 'created_at DESC',
);
}
/// 删除高亮
Future<int> deleteHighlight(int id) async {
final db = await _db.database;
return db.delete(
'book_annotations',
where: 'id = ? AND type = ?',
whereArgs: [id, 'highlight'],
);
}
/// 删除摘抄对应的蓝色高亮标注(通过内容匹配)
Future<void> deleteExcerptHighlightByContent(String readerBookId, String content) async {
final db = await _db.database;
await db.delete(
'book_annotations',
where: 'book_id = ? AND content = ? AND color = ?',
whereArgs: [readerBookId, content, 'excerpt'],
);
}
// ─── bookmarks ──────────────────────────────────────────────────
/// 获取某本书的所有书签

View File

@@ -98,5 +98,5 @@ body.lumina-force-override-font,body.lumina-force-override-font *{font-family:va
''';
const String kSkeletonCss = r'''
html,body{margin:0;padding:0;width:100vw;height:100vh;overflow:hidden;background-color:var(--lumina-surface-color, #FFFFFF)!important}#frame-container{position:absolute;top:0;left:0;right:0;bottom:0;background-color:var(--lumina-surface-color, #FFFFFF)!important;overflow:hidden}iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:none;background-color:var(--lumina-surface-color, #FFFFFF)!important;will-change:opacity;transition:none;pointer-events:none}
html,body{margin:0;padding:0;width:100vw;height:100vh;overflow:hidden;background-color:var(--lumina-surface-color, #FFFFFF)!important}#frame-container{position:absolute;top:0;left:0;right:0;bottom:0;background-color:var(--lumina-surface-color, #FFFFFF)!important;overflow:hidden}iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:none;background-color:var(--lumina-surface-color, #FFFFFF)!important;will-change:opacity;transition:none;touch-action:none;}
''';

View File

@@ -242,6 +242,10 @@ class UserPrefs {
String get dismissedVersion => prefs.getString('dismissedVersion') ?? '';
Future<bool> setDismissedVersion(String value) => prefs.setString('dismissedVersion', value);
/// 更新提醒 snooze 到指定时间戳ms24 小时内不弹
int get dismissedUpdateUntil => prefs.getInt('dismissedUpdateUntil') ?? 0;
Future<bool> setDismissedUpdateUntil(int value) => prefs.setInt('dismissedUpdateUntil', value);
// ========== EPUB 阅读器 ==========
/// EPUB 阅读器字体大小
@@ -251,4 +255,8 @@ class UserPrefs {
/// EPUB 书架视图模式: 0=宽松, 1=紧凑
int get epubViewMode => prefs.getInt('epubViewMode') ?? 0;
Future<bool> setEpubViewMode(int value) => prefs.setInt('epubViewMode', value);
/// EPUB 句读列表视图模式: 0=瀑布流, 1=列表
int get highlightsViewMode => prefs.getInt('highlightsViewMode') ?? 0;
Future<bool> setHighlightsViewMode(int value) => prefs.setInt('highlightsViewMode', value);
}