跳到主要内容

上下文键(Context Keys)与 when:控制按钮/欢迎页显不显示

是什么​

package.json 里菜单、欢迎页可以写 when: "某个表达式"。表达式里可以用:

  • VS Code 内置 变量(如 view == '...')
  • 插件自己设置的 自定义键(布尔或字符串)

插件 不能 直接隐藏某个按钮 DOM,而是通过 vscode.commands.executeCommand('setContext', 键名, 值) 更新键值,VS Code 重新计算 when,界面上的 Play/Pause、欢迎页等随之变化。

通信方向:Extension Host 执行 setContext → VS Code UI 更新菜单/欢迎页可见性。


本项目的自定义上下文键​

键名含义设为 true 的典型时机设为 false 的典型时机
hardwareMonitorIsRunning监控是否在跑(用于标题栏 Play/Pause)开始监控、侧栏可见且启动停止监控、侧栏隐藏
hardwareMonitorHasData是否已有至少一次快照(用于欢迎页)第一次 treeProvider.update 有数据(本项目不设回 false)

常量 hardwareMonitorIsRunning 在代码里叫 MONITORING_CONTEXT:

/** 控制活动栏标题按钮显示状态的上下文键 */
const MONITORING_CONTEXT = "hardwareMonitorIsRunning";

setContext 在哪里调用​

1. 侧栏可见性同步(开始/停止 + 改键)​

src/extension.ts → syncMonitoringWithSidebarVisibility:

可见时:

if (visible) {
monitorService.updateInterval(getRefreshIntervalMs());
monitorService.start();
void vscode.commands.executeCommand(
"setContext",
MONITORING_CONTEXT,
true,
);

不可见时:

monitorService.stop();
void vscode.commands.executeCommand(
"setContext",
MONITORING_CONTEXT,
false,
);

2. 用户点标题栏 Play / Pause(命令回调里改键)​

开始:

void vscode.commands.executeCommand(
"setContext",
MONITORING_CONTEXT,
true,
);

停止:

void vscode.commands.executeCommand(
"setContext",
MONITORING_CONTEXT,
false,
);

注意:改键和 monitorService.start/stop 是一起的;键只负责 UI 显示哪个按钮,不负责采集本身。

3. 第一次有树数据(隐藏欢迎页)​

src/hardwareTreeProvider.ts → update:

void vscode.commands.executeCommand(
"setContext",
"hardwareMonitorHasData",
true,
);

package.json 里 when 怎么用这些键​

侧栏标题:Refresh 始终在该视图显示;Play / Pause 互斥​

"view/title": [
{
"command": "hardware-core-monitor.refreshMonitoring",
"when": "view == hardware-core-monitor.sidebarView",
...
},
{
"command": "hardware-core-monitor.startMonitoring",
"when": "view == hardware-core-monitor.sidebarView && !hardwareMonitorIsRunning",
...
},
{
"command": "hardware-core-monitor.stopMonitoring",
"when": "view == hardware-core-monitor.sidebarView && hardwareMonitorIsRunning",
...
}
]

读法:

  • view == hardware-core-monitor.sidebarView:只有在本插件侧栏树视图时显示这些按钮。
  • !hardwareMonitorIsRunning:上下文为 false 或未设时显示 开始。
  • hardwareMonitorIsRunning:为 true 时显示 暂停。

用户点 Play → 命令里 setContext(..., true) → VS Code 隐藏 Play、显示 Pause。

欢迎页:还没数据时显示​

"viewsWelcome": [
{
"view": "hardware-core-monitor.sidebarView",
"contents": "%view.welcome%",
"when": "!hardwareMonitorHasData"
}
],

第一次 hardwareMonitorHasData 设为 true 后,欢迎文案不再显示,树由 TreeDataProvider 提供内容(见 03-ui-providers.md)。


和 TreeItem 的 contextValue(本项目)​

有些扩展用 treeItem.contextValue = 'xxx',在 menus 的 view/item/context 里写 when: "viewItem == xxx" 控制 右键菜单。本插件当前 没有 用节点级 context 菜单,只有视图标题栏和欢迎页用到上下文键。


小结:谁写键、谁读键​

写键(插件)读键(VS Code UI)
executeCommand('setContext', 'hardwareMonitorIsRunning', …)menus.view/title 里 Play/Pause 的 when
executeCommand('setContext', 'hardwareMonitorHasData', true)viewsWelcome 的 when: "!hardwareMonitorHasData"

命令 ID 与 setContext 的关系见 01-commands.md。