Skip to content

feat: 首次安装时让用户确认 BetterNCM 数据目录#90

Open
arisewind wants to merge 1 commit into
std-microblock:mainfrom
arisewind:feat/prompt-data-dir-on-install
Open

feat: 首次安装时让用户确认 BetterNCM 数据目录#90
arisewind wants to merge 1 commit into
std-microblock:mainfrom
arisewind:feat/prompt-data-dir-on-install

Conversation

@arisewind

Copy link
Copy Markdown

背景

BetterNCM 的数据目录(插件、配置等)由环境变量 BETTERNCM_PROFILE 决定。当前 installer 在点"安装"时不会询问数据目录,直接开始下载并复制 DLL;数据目录完全交给 BetterNCM DLL 在运行时按内部默认值 C:\betterncm 处理。

这带来两个问题:

  1. 用户在网易云里点"打开插件文件夹"时,BetterNCM 会在 C:\betterncm 无脑创建文件夹,用户对此毫无感知也无法干预。
  2. 虽然本仓库已经提供了"修改数据地址"按钮(button_set_path)来事后修改 BETTERNCM_PROFILE,但用户必须主动去找这个按钮,且首次安装时已经默认在 C 盘创建了文件——事后修改也无法清理已创建的目录。

目标

让用户在首次安装时就决定数据目录的位置,而不是被动接受 C 盘默认值。具体要求:

  • 首次安装(BETTERNCM_PROFILE 未设置)→ 弹出文件夹选择框,让用户确认或修改
  • 默认值仍保持 C:\betterncm完全向后兼容——用户不改、直接确认或取消,行为与现在一致
  • 已经设置过 BETTERNCM_PROFILE 的用户(重装、升级)→ 不再打扰,沿用已有值

改动

仅修改 src/main.rs,无新增依赖(rfdwinreg 均已在 Cargo.toml 中)。

1. 抽取两个 helper 函数

把原本内联在 button_set_path 里的注册表读写 + 文件夹对话框逻辑抽取为可复用的函数,避免代码重复:

  • prompt_and_set_data_dir(force: bool) — 核心逻辑。读取当前 BETTERNCM_PROFILE,决定是否弹窗、用户选了/取消后写什么值。
  • write_betterncm_profile(value: &str) — 把值同时写入 HKLM\...\EnvironmentHKCU\Environment(沿用原"修改数据地址"的双写实现)。

引入 const DEFAULT_BETTERNCM_PROFILE: &str = "C:\\betterncm" 统一管理默认值,消除原本散落在代码里的多处硬编码字面量。

2. button_install 在下载前插入询问

on_click 闭包开头、std::thread::spawn 之前调用 prompt_and_set_data_dir(false)

  • force = false 表示"仅当 BETTERNCM_PROFILE 未设过时才弹窗",已设过的用户(重装/升级)不受打扰。
  • 把询问放在 spawn 之前,确保它运行在 GUI 线程(与 button_set_pathbutton_set_ncm_path 的现有模式一致——rfd 的模态对话框本就设计为在 UI 线程调用),且用户做选择时下载/安装尚未开始,可以放心取消整个安装流程。

3. button_set_path 重构为复用 helper

原 28 行内联逻辑替换为单行调用 prompt_and_set_data_dir(true)force = true 表示"总是弹窗"),消除与首次安装路径的代码重复。

行为对照

场景 改动前 改动后
首次安装(BETTERNCM_PROFILE 未设) 不询问,DLL 运行时按内部默认值落到 C:\betterncm 弹文件夹选择框,预填 C:\betterncm;用户可改可确认
↑ 用户在弹窗里选择了目录 写入所选路径到 HKLM + HKCU
↑ 用户在弹窗里取消 写入默认值 C:\betterncm(保证留下明确的注册表值,而非依赖 DLL 硬编码回落)
已设过 BETTERNCM_PROFILE 再点"安装" 不询问 不弹窗,沿用现有值(与改动前一致)
点"重装/更新" 不询问 不变
点"修改数据地址" 弹窗;取消时不改动注册表 弹窗;取消时仍不改动现有值(保留原语义,避免覆盖用户已有的自定义路径)
点"重置数据地址" 删除 HKLM + HKCU 的 BETTERNCM_PROFILE 不变

备注

  • force = true("修改数据地址")和 force = false(首次安装)在用户取消时的行为有意做了区分:首次安装取消会写默认值(确保留下明确记录);修改地址取消保持原状(零副作用,尊重已有配置)。详见 prompt_and_set_data_dir 中的 None if !force 分支注释。
  • 本 PR 不引入新的 GUI 控件(如路径输入框),仅复用现有的 rfd::FileDialog,保持安装器界面布局不变。
  • 首次安装的弹窗会短暂阻塞 GUI 线程(模态对话框),这与现有的"修改数据地址"按钮行为模式一致。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant