用户反馈四件事一起改: - 「目录里有一张图就被当成最终目录」→ 取消「目录含图=一本书」全部链路 (探测/页数/封面/续读角标/懒算 worker/sr2 补位),列表 = 目录 + 图片 + .cbz/.zip(目录优先、组内自然序)。点目录=进入(空目录也进),点图片= mr_reader_open_dir_at(当前目录, 图片自然序下标),点档案册=打开档案册。 - 「文件夹浏览特别卡」→ 删除缩略图线程/磁盘 bmp 缓存/LRU/解码路径与行内 缩略图;首帧只做一次 opendir/readdir+lstat,副标题(类型·大小)扫描期 生成一次,行合成/滚动/点击零 IO 零格式化;去掉逐行 snap(自由滚动手感)。 2000 项目录扫描 ~2.8ms(opendir=1, lstat=2000),行合成 2.78ms/200 万次 (宿主实测;旧实现 2000 项 entry 含 512B cover,内存 2.7MB→1.7MB)。 - 「不要访问 SD 卡上级目录」→ 浏览根锁定 MR_ROOT_DIR:删除越根的顶栏 「上级」/library_go_parent,根隐藏顶栏返回,左缘返回到根=退出 App。 - 「没有 SD 卡不要报错」→ 根不可访问(未插卡/挂载失败/根是文件)时友好空态 「未检测到 SD 卡」+ 顶栏刷新/重进页面重试;子目录不可读才弹提示横幅。 集成陷阱:书库图片下标与阅读器目录册共享同一套过滤器(隐藏项/图片扩展名/ 普通文件/符号链接)与 mr_natural_cmp,test_browse_lazy 直接对比 mr_dir_book_init 顺序,test_open_book_host 断言「点 img10 就开 img10」。 reader 侧 M17 遗留:mr_reader_open_dir_at 在阅读页已激活时先 pop 再 push, 走完整 leave/enter(SDK 对同 view 重复 push 是 no-op 且会压重复 activity)。 回归:run_tests.sh / run_webtoon_tests.sh 全 PASS;交叉构建零警告。
65 lines
2.9 KiB
C
65 lines
2.9 KiB
C
/* tuku_internal.h — 图库应用内部共享头(只 extern 声明,不定义)。
|
||
*
|
||
* 分层(照 examples/hello):
|
||
* - logic/ 纯 C(library 扫描/自然排序、reader 方向状态),不依赖 meow_ui.h,宿主可裸测;
|
||
* - ui/ 每页一个 view 文件(library/reader/settings/lock),只碰 SDK;
|
||
* - app.c main + 装配 + meow_ui_run 回调路由 + 主题监听。
|
||
*
|
||
* 页面:ACT_LIBRARY(0) 根页(保留状态栏)、ACT_READER(1) 全屏、ACT_SETTINGS(2)、ACT_LOCK(3)。
|
||
* 并行开发接缝(后续任务只填自己的文件,不改 app.c/internal.h):
|
||
* - M4 阅读器:ui/reader/reader.c 实现,方向状态用 logic/reader 的 mr_reader_get/set_direction;
|
||
* 书库列表点图片/档案册经 mr_reader_open_dir_at()(ui/reader/reader.h)进入本页。
|
||
* - M5 锁屏/PIN:ui/lock/lock.c 实现 lock_view_should_show();本批桩返回 0(不锁)。
|
||
*/
|
||
#ifndef TUKU_INTERNAL_H
|
||
#define TUKU_INTERNAL_H
|
||
|
||
#include <stdint.h>
|
||
|
||
#include "meow_ui.h"
|
||
#include "meow_ui_view.h"
|
||
#include "logic/library.h"
|
||
#include "logic/reader.h"
|
||
|
||
/* ---- Activity 归属(稳定 id,< MEOW_VIEW_BY_ID_MAX) ---- */
|
||
#define ACT_LIBRARY 0
|
||
#define ACT_READER 1
|
||
#define ACT_SETTINGS 2
|
||
#define ACT_LOCK 3
|
||
|
||
#define MR_ROOT_DIR "/usr/data/mnt/sd_0" /* 书库浏览根 = TF 卡根(不允许上溯到其上级) */
|
||
|
||
/* ---- 视图控制器(biz-UI 绑定点) ---- */
|
||
typedef struct mr_page_ctrl {
|
||
meow_view *view;
|
||
int active;
|
||
} mr_page_ctrl;
|
||
|
||
/* ---- 书库页(ui/library/library.c,文件管理器模型) ---- */
|
||
meow_view *library_view_create(void);
|
||
int library_at_root(void); /* 1=当前在浏览根(生产=MR_ROOT_DIR,宿主测试可改根) */
|
||
int library_go_up(void); /* 系统返回语义:逐级上移;浏览根返回 0(app.c 据此退出) */
|
||
void library_on_tap(int x, int y);
|
||
void library_on_swipe(int dir, int dist); /* dist=SDK on_swipe 的位移量(UP/DOWN 用) */
|
||
void library_on_touch_down(int x, int y);
|
||
void library_on_touch_move(int x, int y);
|
||
void library_on_tick(void); /* 16ms tick:提示横幅到期清除 */
|
||
|
||
/* ---- 阅读器页(ui/reader/reader.c,M4 填充) ---- */
|
||
meow_view *reader_view_create(void);
|
||
void reader_on_tap(int x, int y);
|
||
void mr_reader_open_dir(const char *path); /* 书库→阅读器的桩导航接口 */
|
||
const char *mr_reader_dir(void); /* 当前待打开目录(骨架显示用) */
|
||
|
||
/* ---- 设置页(ui/settings/settings.c) ---- */
|
||
meow_view *settings_view_create(void);
|
||
|
||
/* ---- 锁屏页(ui/lock/lock.c,M5 填充) ---- */
|
||
meow_view *lock_view_create(void);
|
||
int lock_view_should_show(void); /* 1=启动先显示锁屏;本批桩返回 0 */
|
||
|
||
/* ---- App 级(app.c) ---- */
|
||
void mr_nav_report(void); /* 向 launcher 上报当前页栈深/顶层 */
|
||
|
||
#endif /* TUKU_INTERNAL_H */
|