图库: 书库改文件管理器模型 + 关闭缩略图 + 根锁定/无卡容错(M18)

用户反馈四件事一起改:
- 「目录里有一张图就被当成最终目录」→ 取消「目录含图=一本书」全部链路
  (探测/页数/封面/续读角标/懒算 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;交叉构建零警告。
This commit is contained in:
AskaEth committed 2026-11-05 20:26:40 +08:00
1 parent d07b99056f
commit 64336f95d9
16 files changed
+940 -1927

No files matched your search

+9
View File
@@ -2040,6 +2040,7 @@ static void reader_state_reset(void)
static void reader_page_enter(meow_view *v, void *ctx)
{
mr_page_ctrl *c = (mr_page_ctrl *)ctx;
c->view = v;
c->active = 1;
g_quitting = 0;
@@ -2162,6 +2163,14 @@ const char *mr_reader_dir(void)
void mr_reader_open_dir_at(const char *path, int start_index)
{
if (!path) return;
/* 已在本页(书库再次点另一张图/另一本册时可能仍是 ACT_READER):
* SDK 对同一 view 的重复 push 是 no-op(view_enter 见 ENTERED 直接返回),
* 只改 g_dir 会串到旧册状态。先真正 pop(回收当前册 + 续读落盘),
* 换目标后再 push,走完整的 leave/enter 生命周期。 */
int reopen = (meow_ui_activity_active() == ACT_READER) &&
(meow_ui_activity_depth() > 1);
if (reopen) meow_view_page_pop();
snprintf(g_dir, sizeof g_dir, "%s", path);
/* -1=续读(旧入口语义);其它负数钳到 0;上界在 open_book 里按页数钳。 */
g_start_at = start_index == MR_READER_START_RESUME ? MR_READER_START_RESUME