| Files | Last commit | Last update |
|---|---|---|
FolderDock:自由拼装文件夹组合的 Windows 文件管理器(Rust + egui) 需求是「像 Zen 管理书签那样自由组装文件夹组合、快速搜索、并保留系统原生右键」。 仓库此前是空的,这里从零实现,并落下一套可复用的 GUI 取证工具。 三条主线: 1) 组 = 一组文件夹的组合(不是单个目录)。组可以为空,再用「+ 文件夹」把任意多个文件夹 拼进去;每格是一个文件夹面板,可并排、调宽、换序、独立导航。组级动作只针对「这一组 文件夹」(复制组合 / 复制文件夹列表 / 清空 / 删除),不提供任何单文件夹语义的入口。 2) 右键不用自绘替代品,直接弹 Windows shell 的 IContextMenu:文件/多选一套、文件夹背景 一套;子类化主窗口转发 IContextMenu2/3,让「发送到」「打开方式」这类动态子菜单真的能 展开(实测拿到 40 项文件菜单)。菜单期间拦 WM_PAINT,避免重入 eframe 的帧循环。 3) 搜索是先建索引再打字:后台按根增量遍历(尊重 .gitignore、跳过隐藏项、每根上限、根集合 LRU),查询时 nucleo 模糊 + 通配/扩展名/路径/排除语法。45k 条索引下单次查询 6–7ms。 图标优先用 shell 提取(SHGetFileInfoW → IImageList → DIB → 预乘 RGBA,按扩展名缓存), 取不到时回落到内置 SVG 路径数据的矢量图标。 顺带修掉几处只有实机跑才会暴露的问题:面板目录列举每帧重发请求导致列表永远停在「读取中」、 拖拽排序的落点写成了自己那一格(排序实际是死的)、行距与 ScrollArea 推算不一致、 中央区域不上色导致浅色主题下露黑缝、搜索 * 命中全部时 46ms→7ms(部分选择替代全排序)。 验证方式全部是实机取证(截图 + 像素测量 + 真实键鼠注入 + 日志时间线), 工具与结论在 .verify/(win.ps1 自带 selftest 12/12 PASS)。 | 24 days ago | |
0.2.1:修拖拽——窗口从没被注册成 OLE 放置目标,且拖出缺协议 用户报「拖拽我试了,不行」。根因分两层,第一层是致命的: 1) **落点整体失效**:winit 只在窗口属性 drag_and_drop 为真时才 RegisterDragDrop (winit-0.30.13/src/platform_impl/windows/window.rs 的 create_window_data), 而我们的 viewport 没开这个开关——窗口上压根没有 OleDropTargetInterface 属性。 于是拖到面板/组合树、从资源管理器拖进来全都收不到落点,DoDragDrop 一律返回 DROPEFFECT_NONE。先前注释里「winit 已经注册过、我们再注册会拿 DRAGDROP_E_ALREADYREGISTERED」是**误判**(当时谁都还没注册,那次报错另有来源)。 开 with_drag_and_drop(true) 后用 GetProp(hwnd,"OleDropTargetInterface") 实测确认已注册。 已跑通:面板→组合树(只改结构)、面板→面板(复制进目标目录,源不动)。 2) **落点位置是旧值**:拖拽期间鼠标被 OLE 抓走,winit 收不到 WM_MOUSEMOVE,egui 手里的 指针位置还停在按下那一刻——按原样取会让落点偏回源面板。改成现问系统要光标 (shell::cursor_client_pos:GetCursorPos + ScreenToClient,再按 pixels_per_point 折成 egui 点)。 3) **拖出补齐协议**:IDataObject::EnumFormatEtc 原来返回 E_NOTIMPL,而资源管理器在落下前后 会枚举格式(实测被连调 8 次),拿不到枚举就判定这份数据不能用;现在返回只列 CF_HDROP + CFSTR_PREFERREDDROPEFFECT 的 IEnumFORMATETC。同时补上 CFSTR_PREFERREDDROPEFFECT(声明允许的效果)与 SetData(CFSTR_PERFORMEDDROPEFFECT) (接受落点回报的实际效果,并按规范接管介质)。 诊断日志保留两条真有用的:[drag] 收到落点 N 项 @(x,y)、[drag] 悬停开始/结束, 外加落点回报的效果——现场排查「拖进来没反应」时,一眼能分清是系统没把拖拽送到窗口, 还是送到了但落点没命中任何目标。 验证:72 单测通过、clippy 零警告;dist.ps1 -Release 出 FolderDock-0.2.1.zip; 分发物实跑(安装 exit=0、卸载 exit=0、数据目录保留、安装目录已清空); 面板→组合树、面板→面板两条真鼠标用例在真窗口上跑通(日志+截图)。 **拖出到资源管理器未能在本机验证**:本机前台有全屏游戏时,连 Windows 自己的 资源管理器→资源管理器拖放都不生效(用资源管理器自己拖 probe.txt 到另一个资源管理器窗口, 实测同样毫无反应),属环境限制,待游戏退出后复验。 | 24 days ago | |
| 24 days ago | ||
FolderDock:自由拼装文件夹组合的 Windows 文件管理器(Rust + egui) 需求是「像 Zen 管理书签那样自由组装文件夹组合、快速搜索、并保留系统原生右键」。 仓库此前是空的,这里从零实现,并落下一套可复用的 GUI 取证工具。 三条主线: 1) 组 = 一组文件夹的组合(不是单个目录)。组可以为空,再用「+ 文件夹」把任意多个文件夹 拼进去;每格是一个文件夹面板,可并排、调宽、换序、独立导航。组级动作只针对「这一组 文件夹」(复制组合 / 复制文件夹列表 / 清空 / 删除),不提供任何单文件夹语义的入口。 2) 右键不用自绘替代品,直接弹 Windows shell 的 IContextMenu:文件/多选一套、文件夹背景 一套;子类化主窗口转发 IContextMenu2/3,让「发送到」「打开方式」这类动态子菜单真的能 展开(实测拿到 40 项文件菜单)。菜单期间拦 WM_PAINT,避免重入 eframe 的帧循环。 3) 搜索是先建索引再打字:后台按根增量遍历(尊重 .gitignore、跳过隐藏项、每根上限、根集合 LRU),查询时 nucleo 模糊 + 通配/扩展名/路径/排除语法。45k 条索引下单次查询 6–7ms。 图标优先用 shell 提取(SHGetFileInfoW → IImageList → DIB → 预乘 RGBA,按扩展名缓存), 取不到时回落到内置 SVG 路径数据的矢量图标。 顺带修掉几处只有实机跑才会暴露的问题:面板目录列举每帧重发请求导致列表永远停在「读取中」、 拖拽排序的落点写成了自己那一格(排序实际是死的)、行距与 ScrollArea 推算不一致、 中央区域不上色导致浅色主题下露黑缝、搜索 * 命中全部时 46ms→7ms(部分选择替代全排序)。 验证方式全部是实机取证(截图 + 像素测量 + 真实键鼠注入 + 日志时间线), 工具与结论在 .verify/(win.ps1 自带 selftest 12/12 PASS)。 | 24 days ago | |
0.2.3:修项目/组合改名,文件夹不再提供改名 项目根同时出现在项目列表和组合树根,两栏都按 renaming == Some(id) 画 TextEdit,共用同一个 widget id:egui 报 ID clash,一次按键被两个输入框同时处理,项目名/组合名因此改不对。现在记录改名的来源栏(RenameHost),只让来源栏画编辑器,两栏共用 rename_buf。 rename_node 只认 active_project:右键非当前项目改名会静默失败。改为遍历全部项目根;项目/组合名统一 trim,空白名拒绝。 文件夹节点只是真实路径,改显示名不会动文件系统,容易让人误以为文件夹被重命名:移除 Folder.label 与文件夹的改名入口,旧的 label 字段在反序列化时被忽略。 测试:非当前项目改名、trim/空名、文件夹拒绝改名、改名编辑器只画一处、一次按键只落一次、两栏 widget id 不冲突;顺带修 shell menu 测试里未对齐的 u16 读取(debug 下会 abort 整个测试进程)。 | 17 days ago | |
0.2.1:修拖拽——窗口从没被注册成 OLE 放置目标,且拖出缺协议 用户报「拖拽我试了,不行」。根因分两层,第一层是致命的: 1) **落点整体失效**:winit 只在窗口属性 drag_and_drop 为真时才 RegisterDragDrop (winit-0.30.13/src/platform_impl/windows/window.rs 的 create_window_data), 而我们的 viewport 没开这个开关——窗口上压根没有 OleDropTargetInterface 属性。 于是拖到面板/组合树、从资源管理器拖进来全都收不到落点,DoDragDrop 一律返回 DROPEFFECT_NONE。先前注释里「winit 已经注册过、我们再注册会拿 DRAGDROP_E_ALREADYREGISTERED」是**误判**(当时谁都还没注册,那次报错另有来源)。 开 with_drag_and_drop(true) 后用 GetProp(hwnd,"OleDropTargetInterface") 实测确认已注册。 已跑通:面板→组合树(只改结构)、面板→面板(复制进目标目录,源不动)。 2) **落点位置是旧值**:拖拽期间鼠标被 OLE 抓走,winit 收不到 WM_MOUSEMOVE,egui 手里的 指针位置还停在按下那一刻——按原样取会让落点偏回源面板。改成现问系统要光标 (shell::cursor_client_pos:GetCursorPos + ScreenToClient,再按 pixels_per_point 折成 egui 点)。 3) **拖出补齐协议**:IDataObject::EnumFormatEtc 原来返回 E_NOTIMPL,而资源管理器在落下前后 会枚举格式(实测被连调 8 次),拿不到枚举就判定这份数据不能用;现在返回只列 CF_HDROP + CFSTR_PREFERREDDROPEFFECT 的 IEnumFORMATETC。同时补上 CFSTR_PREFERREDDROPEFFECT(声明允许的效果)与 SetData(CFSTR_PERFORMEDDROPEFFECT) (接受落点回报的实际效果,并按规范接管介质)。 诊断日志保留两条真有用的:[drag] 收到落点 N 项 @(x,y)、[drag] 悬停开始/结束, 外加落点回报的效果——现场排查「拖进来没反应」时,一眼能分清是系统没把拖拽送到窗口, 还是送到了但落点没命中任何目标。 验证:72 单测通过、clippy 零警告;dist.ps1 -Release 出 FolderDock-0.2.1.zip; 分发物实跑(安装 exit=0、卸载 exit=0、数据目录保留、安装目录已清空); 面板→组合树、面板→面板两条真鼠标用例在真窗口上跑通(日志+截图)。 **拖出到资源管理器未能在本机验证**:本机前台有全屏游戏时,连 Windows 自己的 资源管理器→资源管理器拖放都不生效(用资源管理器自己拖 probe.txt 到另一个资源管理器窗口, 实测同样毫无反应),属环境限制,待游戏退出后复验。 | 24 days ago |