- folder 模式从「按第一级目录分段」改为当前目录视图:子目录在前(带子树书数), 直接书在后;进入/返回只过滤已扫平的 g_books,不 readdir、不重扫(M32 索引不动)。 - 纯函数 shelf_build_rows_at(books,n,folder,cwd,...) + nav 工具(enter/up/breadcrumb/ count)全部宿主可测;format 模式行序列/副题逐字不变,path 仍是完整路径(进度键不变)。 - 交互:点目录进入;顶栏返回箭头/左缘返回手势回上一级,根层再返回退出 App;顶栏标题= 当前目录名(按像素宽截断),副题行=面包屑全路径+当前层书数;list/grid 均支持导航。 - 状态:folder↔format、list↔grid 切换保留 cwd;刷新重扫后 cwd 失效则收缩到有书的祖先。 - 边界:空目录不显示(导航只读 g_books,不额外 readdir);深层目录逐级进入;真实名为 「未分类」的目录按普通目录处理,不与根层书合并。 - 测试:shelf_group_smoke 63→99 断言;M27 的按第一级分组断言改写为「逐级进入后可见该书」 (同等强度),新增进入/返回/面包屑/计数/空目录/纯内存/rowcap/UTF-8 截断断言。 - 交付 0.1.7/code8(M32 已占用任务书里的 0.1.6/code7);真机 0.1.4 未被覆盖。
60 lines
2.8 KiB
C
60 lines
2.8 KiB
C
/* reader_internal.h — os.meow.reader 应用内部共享声明(视图 + 装配)。
|
||
*
|
||
* 层级(仿 hello_app):app.c 只做 init/建页/事件分发;shelf(书架)、reader(阅读页)各一个
|
||
* meow_view(ACTIVITY)。阅读页用 W_CUSTOM 画布 + App 自绘 back_buf(翻页 blit 局部脏区)。
|
||
*/
|
||
#ifndef READER_INTERNAL_H
|
||
#define READER_INTERNAL_H
|
||
|
||
#include "meow_ui.h"
|
||
#include "meow_ui_view.h"
|
||
|
||
#define ACT_SHELF 0
|
||
#define ACT_READER 1
|
||
#define ACT_SETTINGS 2
|
||
|
||
/* ---- 书架(app/shelf.c)---- */
|
||
meow_view *shelf_view_create(void);
|
||
int shelf_is_active(void);
|
||
int shelf_on_tap(int x, int y);
|
||
void shelf_on_swipe(int dir, int dx, int dy);
|
||
void shelf_redraw(void);
|
||
int shelf_back(void); /* M33:folder 模式返回上一级;1=已回退 0=已在根 */
|
||
void shelf_set_view(int grid); /* 1=grid 0=list;读 reader.conf ui.shelf_layout(A) */
|
||
void shelf_set_group(int folder); /* 1=folder 0=format;写 ui.shelf_group(M27) */
|
||
void shelf_on_tick(uint64_t now); /* 提示条 6s 到期消失(书架前台时由 app.c 调) */
|
||
|
||
/* ---- 阅读页(app/reader.c)---- */
|
||
meow_view *reader_view_create(void);
|
||
int reader_is_active(void);
|
||
void reader_on_tap(int x, int y);
|
||
void reader_on_swipe(int dir, int dx, int dy);
|
||
void reader_on_tick(uint64_t now);
|
||
void reader_on_touch_down(int x, int y); /* R3 段刮擦:右缘拖动快速定位 */
|
||
void reader_on_touch_move(int x, int y);
|
||
|
||
/* 打开一本书(书架调;成功后由书架 push ACT_READER 进入阅读页)。path=TXT 完整路径。
|
||
* 返回 0=成功(书已打开、页位图已备、可 push);非 0=失败(未能打开,调用方不 push)。 */
|
||
int reader_open(const char *path);
|
||
|
||
/* R3.4 章节重解析(app/settings.c 调用):是否打开了支持章节解析的书(TXT+seg 模式)。
|
||
* reader_reparse_chapters 返回 n=章节数 / 0=无章节(成功)/ -1=不可用 / -2=扫描失败(未落盘)。 */
|
||
int reader_has_chapter_book(void);
|
||
int reader_reparse_chapters(void);
|
||
|
||
/* ---- 全局设置页(app/settings.c,C)---- */
|
||
meow_view *settings_view_create(void);
|
||
int settings_is_active(void);
|
||
int settings_on_tap(int x, int y);
|
||
void settings_reload(void); /* 改配置后让设置页/其它页重读 reader.conf */
|
||
|
||
/* 系统翻页信号(app/reader_ipc.c 后台线程收到 MSG_KEY_PAGEUP/PAGEDOWN 后调;
|
||
* 仅置 pending 计数,UI 线程 reader_on_tick 消费转 reader_turn_animated,E)。 */
|
||
void reader_page_key(int dir); /* dir=+1 下一页;-1 上一页 */
|
||
|
||
/* 返回可执行文件所在包根(用于定位 /usr/data/mnt/sd_0)——由 app.c 注入与否;
|
||
* R1 用固定 TF 根 /usr/data/mnt/sd_0。 */
|
||
#define READER_SD_ROOT "/usr/data/mnt/sd_0"
|
||
|
||
#endif /* READER_INTERNAL_H */
|