Files
MeowOS-SDK/tuku/logic/reader.h
T
AskaEth c5985b2c67 图库: 进入文件夹后顶栏显示「续读」,一键回到上次那页(M33)
用户要求:文件夹拆开可进之后仍保留进度,但入口只在**进入了该文件夹**之后才出现,
不在上层列表的文件夹行加角标/按钮。

- 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 的全部边界。
2026-11-06 19:35:43 +08:00

64 lines
3.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 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 */