用户要求:文件夹拆开可进之后仍保留进度,但入口只在**进入了该文件夹**之后才出现, 不在上层列表的文件夹行加角标/按钮。 - ui/library/library.c:顶栏按 mr_cont_resume_page(g_cur_dir, 图片数) 判定,有进度才加 MEOW_ICON_PLAY_ARROW「续读」动作(label 保留为语义名);点按 = mr_reader_open_dir_at (g_cur_dir, MR_READER_START_RESUME)。SDK 的 TopAppBar 动作创建期固定、无隐藏 API, 因此可见性变化时整条顶栏重建:无进度是真的 2 个动作(没有空占位/死点击区), 续读插最左,刷新/设置的下标与命中区不变。 - 可见性实时重判:load_dir(进入/返回/刷新)与 library_page_enter(从阅读器返回, 进度可能刚写盘)都调 resume_refresh;根目录有进度时同样显示。 - logic/reader.c/.h:新增 mr_cont_resume_page(dir, pages)——无记录/空目录 → -1(不显示); 保存页超页数(文件被删)→ 钳到末页并 INFO 日志;页数未知(列表被 2000 截断)不夹持, 上界交给阅读器 open_book 自己的 mr_nav_clamp_page。 - 不改列表行语义(不重新引入 M18 删掉的「目录自动当书」)。 - 宿主回归(test_browse_ui_host U8):有进度目录 3 个动作/无进度 2 个、三个动作的点击区 互不遮挡、点续读从当前目录续读页打开、超页数钳到末页、空目录不显示、上层/进入/返回 与阅读器返回后的可见性切换;test_library T5 覆盖 mr_cont_resume_page 的全部边界。
64 lines
3.3 KiB
C
64 lines
3.3 KiB
C
/* logic/reader.h — 阅读器纯逻辑接缝(M4 填充实现,M3 先落状态 API;M7 追加模式与每册续读状态)。
|
||
*
|
||
* 阅读方向默认 RTL(日式漫画从右往左翻);设置页/阅读器可切 LTR。
|
||
* 阅读模式(翻页/条漫)与每册 last page 走 meow_config 持久化,键含册标识。
|
||
* 本模块保持纯 C(不 include meow_ui.h),宿主可直接测。
|
||
*/
|
||
#ifndef MR_READER_H
|
||
#define MR_READER_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#define MR_DIR_RTL 1 /* 默认:右到左(日漫) */
|
||
#define MR_DIR_LTR 0 /* 左到右 */
|
||
|
||
int mr_reader_get_direction(void);
|
||
/* 只接受 MR_DIR_RTL / MR_DIR_LTR;其它值忽略(保持原方向)。 */
|
||
void mr_reader_set_direction(int dir);
|
||
|
||
/* ============================================================ */
|
||
/* 阅读模式(M7):左右翻页 / 条漫竖向连续滚动 */
|
||
/* ============================================================ */
|
||
#define MR_MODE_PAGED 0 /* 左右翻页(默认) */
|
||
#define MR_MODE_WEBTOON 1 /* 条漫:垂直连续滚动 */
|
||
|
||
int mr_mode_valid(int mode);
|
||
const char *mr_mode_name(int mode); /* "paged" / "webtoon"(配置值;非法按 paged) */
|
||
int mr_mode_parse(const char *s); /* -1=未知 */
|
||
|
||
/* ============================================================ */
|
||
/* 每册续读状态(last page + mode,meow_config 持久化) */
|
||
/* ------------------------------------------------------------
|
||
* 键 = reader.<field>.<FNV-1a64(规范化目录路径)>:同一册(同一目录)跨启动恢复,
|
||
* 不同册互不影响;目录改名/移动视为新册。写失败只 WARN(best-effort,不阻断阅读)。
|
||
* 依赖:只 include 配置/日志两个模块头,宿主测试用 settings_reader_stub 顶替。
|
||
* ============================================================ */
|
||
#define MR_CONT_PATH_MAX 512 /* 册路径规范化的本地缓冲(同 MR_PATH_MAX 口径) */
|
||
#define MR_CONT_PAGE_MAX 1000000 /* 配置里 last page 的合理上限(防坏值) */
|
||
|
||
int mr_cont_key(const char *dir, const char *field, char *out, int outsz);
|
||
int mr_cont_get_mode(const char *dir, int def);
|
||
void mr_cont_set_mode(const char *dir, int mode);
|
||
int mr_cont_get_page(const char *dir, int def);
|
||
void mr_cont_set_page(const char *dir, int page);
|
||
/* 一次写 page+mode(尽最大努力,两键分别尝试)。 */
|
||
void mr_cont_save(const char *dir, int page, int mode);
|
||
/* 书库行续读角标:1=写入 "续读 P5"(page>0 才有记录);0=无。 */
|
||
int mr_cont_badge(const char *dir, char *out, int outsz);
|
||
|
||
/* 目录内「续读」入口的可用页(M33:按钮在**进入目录后**的顶栏,不在上层列表行)。
|
||
* pages > 0:该目录当前图片页数;保存页 >= pages(文件被删/目录变短)→ 钳到 pages-1
|
||
* 并 INFO 日志注明,保证「续读」永远落在有效页;
|
||
* pages == 0:空目录/无图片 → 恒 -1(入口不显示);
|
||
* pages < 0:页数未知(书库列表被 MR_LIB_SCAN_MAX 截断)→ 有记录就原样返回,
|
||
* 上界交给阅读器 open_book 的 mr_nav_clamp_page 钳制。
|
||
* 返回 -1 = 当前目录没有可用的续读记录(不显示入口)。 */
|
||
int mr_cont_resume_page(const char *dir, int pages);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
#endif /* MR_READER_H */
|