feat(vault): pick a notebook vault folder on first run
Some checks failed
CI / Windows build (push) Has been cancelled

Phase 0 of the file-based storage plan (docs/plans/
2026-06-24-file-based-storage.md). Foundation only — no editor or
DB change yet.

- VaultService (SharedPreferences): stores the vault root path,
  vaultRootValid() = path set AND directory exists.
- VaultSetupScreen: first-run folder picker (file_picker, Windows).
- main.dart gates HomeScreen behind a valid vault, re-prompting if
  the saved folder is gone.
- Settings: a Vault section to change the folder.

Editors still use SQLite; later phases move annotations into
per-file sidecars under the vault. analyze clean, tests green.
This commit is contained in:
2026-06-24 20:45:16 +08:00
parent 875dabcd89
commit 9fcac47ef2
10 changed files with 655 additions and 3 deletions

View File

@@ -256,4 +256,46 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get close => '关闭';
@override
String get vaultSetupTitle => '选择笔记库';
@override
String get vaultSetupHeadline => '为你的笔记本选择一个文件夹';
@override
String get vaultSetupBody =>
'BadNote 会把你的笔记本都存放在你选择的一个文件夹里——就像 Obsidian 的库vault。请选择一个你能掌控的文件夹例如同步盘这样你的笔记会跟着文件一起走。';
@override
String get vaultChooseFolder => '选择文件夹';
@override
String get vaultMissingTitle => '笔记库文件夹不见了';
@override
String get vaultMissingBody => '找不到你选择的文件夹(可能被移动、删除,或所在磁盘已拔出)。请重新定位或另选一个。';
@override
String vaultPickFailed(String error) {
return '无法打开文件夹选择器:$error';
}
@override
String get vaultNotWritable => '该文件夹不可写,请另选一个。';
@override
String get vaultSection => '笔记库';
@override
String get vaultFolderLabel => '笔记库文件夹';
@override
String get vaultNoneSelected => '尚未选择文件夹';
@override
String get vaultChangeFolder => '更改笔记库文件夹';
@override
String get vaultUpdated => '笔记库文件夹已更新';
}