Skip to content

feat: 同步章节内阅读进度,新增窗口快捷键与同步状态提示(v1.6.0) - #24

Open
sakaiyuuji4 wants to merge 3 commits into
nancheung:masterfrom
sakaiyuuji4:master
Open

feat: 同步章节内阅读进度,新增窗口快捷键与同步状态提示(v1.6.0)#24
sakaiyuuji4 wants to merge 3 commits into
nancheung:masterfrom
sakaiyuuji4:master

Conversation

@sakaiyuuji4

Copy link
Copy Markdown

改动概述

本 PR 解决了「IDE 内阅读位置无法同步回阅读 APP/服务器」的核心痛点,并补充了若干体验改进,版本升级至 1.6.0。

新增功能

📖 同步章节内阅读进度

  • 新增 ProgressSyncService(Application Service):滚动/翻页停止 2
    秒后,将章节内位置(durChapterPos)防抖同步到服务器,连续滚动不会产生请求风暴
  • 工具窗口正文滚动时,取首个可见字符偏移(扣除标题行)作为阅读位置
  • 翻页(Ctrl+滚轮)时取当前页起始偏移(PageData.startPos()
  • 返回书架时 flush() 立即同步,退出阅读不丢最后位置
  • 同步数据在触发时快照,延迟执行不依赖会话状态;失败静默降级,不影响阅读

🔔 同步状态提示

  • 新增 ProgressSyncEvent(SYNCING / SYNCED / SYNC_FAILED)接入 sealed 事件体系
  • 正文面板顶部右侧展示「进度同步中… / 进度已同步(3 秒自动消失)/ 进度同步失败」

⌨️ 阅读窗口快捷键

  • 新增 Alt+D 快速显示/隐藏阅读工具窗口(ToggleToolWindowAction),可在 Keymap 中自定义

🚪 错误页退出按钮

  • 章节加载失败页面右上角新增「退出阅读」按钮,服务器断开时也能一键返回书架重新操作

问题修复

  • 翻页 Action 被行内模式门控NextPageAction/PreviousPageAction 原先在行内模式关闭时被禁用,导致工具窗口阅读时
    Ctrl+滚轮完全失效(通过 IDE 日志确认:翻页指令从未被分发)。现改为「有分页数据即可用」,双模式通用
  • 「返回书架」绕过指令链路:工具栏按钮原先直接操作 UI,不经过 BACK_TO_BOOKSHELF
    Handler,导致会话未清理、进度未冲刷。现统一走指令分发,UI 响应 SESSION_ENDED 事件刷新书架

其他

  • ApiUtil.saveBookProgress 增加显式 bookUrl 重载,供延迟同步场景使用
  • 版本号 1.5.1 → 1.6.0,更新 CHANGELOG.md、README(徽章与快捷键表)、CLAUDE.md

测试

  • ✅ 本地 buildPlugin 构建通过,插件包内 plugin.xml/change-notes 已验证
  • ✅ 实际安装验证:滚动阅读后 idea.log 出现「同步页内阅读进度成功」,手机 APP 打开定位到对应位置

lizeheng added 3 commits July 23, 2026 15:32
- 实现防抖机制避免频繁同步页内阅读位置
- 添加返回书架时立即同步最后进度的功能
- 新增ProgressSyncService处理同步任务调度
- 重构ApiUtil支持显式指定书籍地址进行同步
- 更新CLAUDE.md文档说明防抖同步机制
- 优化翻页动作启用条件适配双模式
- 添加阅读窗口显示隐藏快捷键功能
- 新增 ProgressSyncEvent 事件类型用于同步状态通知
- 在正文面板顶部右侧添加同步状态提示标签
- 重构返回书架操作通过命令总线异步执行
- 优化进度同步服务发布同步状态事件
- 更新 UI 订阅基类支持处理进度同步事件
- 在错误面板添加退出阅读按钮便于返回书架
- 新增 ProgressSyncEvent 事件类型用于同步状态通知
- 在正文面板顶部右侧添加同步状态提示标签
- 重构返回书架操作通过命令总线异步执行
- 优化进度同步服务发布同步状态事件
- 更新 UI 订阅基类支持处理进度同步事件
- 在错误面板添加退出阅读按钮便于返回书架
@nancheung

Copy link
Copy Markdown
Owner

@copilot review 一下

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

该 PR 聚焦解决「IDE 内阅读位置无法同步回阅读 APP/服务器」的问题:在 ToolWindow 滚动阅读与分页翻页时,防抖同步章节内位置(durChapterPos)并通过事件体系在 UI 顶部展示同步状态;同时补充阅读工具窗口快捷键与若干交互修复,并将版本升级至 1.6.0。

Changes:

  • 新增进度同步链路:ProgressSyncService + ProgressSyncEvent,并在 ToolWindow 正文顶部展示同步状态提示。
  • 新增阅读工具窗口显示/隐藏快捷键(Alt+D)与对应 Action 注册。
  • 修复翻页 Action 门控逻辑与“返回书架”绕过指令链路的问题,并补充错误页“退出阅读”按钮。

Reviewed changes

Copilot reviewed 20 out of 20 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/main/resources/META-INF/plugin.xml 注册 Alt+D 的阅读工具窗口显示/隐藏 Action
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/service/ProgressSyncService.java 新增防抖同步服务,调度保存 durChapterPos 并发布同步状态事件
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/presentation/toolwindow/panel/TextBodyPanel.java ToolWindow 正文新增滚动同步触发与顶部同步状态提示 UI
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/presentation/toolwindow/MainReaderPanel.java 接入 ProgressSyncEvent 的 UI 事件处理入口
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/presentation/toolwindow/handler/MainPanelEventHandler.java 展示同步状态提示;会话结束时刷新书架
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/presentation/common/UIEventSubscriber.java UI 事件分发新增 ProgressSyncEvent 分支
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/event/ReaderEvent.java sealed ReaderEvent permits 增加 ProgressSyncEvent
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/event/ProgressSyncEvent.java 新增进度同步事件类型(SYNCING/SYNCED/SYNC_FAILED)
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/command/handler/PreviousPageHandler.java 翻页后调度同步(使用 page startPos)
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/command/handler/NextPageHandler.java 翻页后调度同步(使用 page startPos)
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/command/handler/BackToBookshelfHandler.java 返回书架前 flush 防抖同步,避免退出时丢最后位置
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/api/ApiUtil.java saveBookProgress 增加显式 bookUrl 重载以支持延迟同步
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/action/ToggleToolWindowAction.java 新增 ToolWindow 显示/隐藏 Action 实现
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/action/PreviousPageAction.java 翻页 Action 的可用性改为以分页数据为准(双模式通用)
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/action/NextPageAction.java 翻页 Action 的可用性改为以分页数据为准(双模式通用)
src/main/java/com/nancheung/plugins/jetbrains/legadoreader/action/BackBookshelfAction.java 返回书架改为走 BACK_TO_BOOKSHELF 指令链路
README.md 更新徽章版本与快捷键表(新增 Alt+D)
gradle.properties 插件版本号 1.5.1 → 1.6.0
CLAUDE.md 更新项目说明/架构与快捷键文档
CHANGELOG.md 新增 1.6.0 版本记录与对比链接更新

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +93 to +94
// 滚动阅读时防抖同步章节内位置(首个可见字符的偏移)
scrollPane.getViewport().addChangeListener(e -> syncScrollProgress(scrollPane.getViewport()));
Comment on lines +218 to +232
public void showSyncStatus(String text, int autoHideMs) {
if (syncStatusHideTimer != null) {
syncStatusHideTimer.stop();
syncStatusHideTimer = null;
}

syncStatusLabel.setText(text);
syncStatusLabel.setVisible(true);

if (autoHideMs > 0) {
syncStatusHideTimer = new Timer(autoHideMs, e -> syncStatusLabel.setVisible(false));
syncStatusHideTimer.setRepeats(false);
syncStatusHideTimer.start();
}
}
Comment on lines +153 to +158
@Override
public void dispose() {
// 关闭前执行待同步任务,尽量保住最后进度
runPending();
scheduler.shutdownNow();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants