Vscode 插件开发 - TreeView

树状视图很多插件都可能用到,通常作为一个简单的列表使用,比如管理项目依赖、展示搜索结果。那么 Vscode 的 TreeView 具体怎么玩呢?

基础操作

1.创建视图

在 package.json 的 contributes.views 节点下定义视图:

{"name": "custom-view-samples",..."contributes": {"views": {"my-tree-view": [{"id": "myTreeView","name": "My Tree View"}]}},...
}

创建视图:

vscode.window.createTreeView('myTreeView', {});

2.实现树节点

首先实现树节点的数据结构:

class MyTreeItem extends vscode.TreeItem {constructor(public readonly label: string,public readonly collapsibleState: vscode.TreeItemCollapsibleState) {super(label, collapsibleState);this.tooltip = `MyTreeItem - ${this.label}`;this.iconPath = new vscode.ThemeIcon('file');this.command = {title: 'Click on me',command: 'myExtension.myTree.onClick',arguments: [{label}]};}
}

vscode.TreeItem 预定义了诸多属性,允许我们控制 TreeItem 的外观与行为:

  • label:用于节点展示文本
  • iconPath:用于设置节点图标,可通过 new vscode.ThemeIcon(‘file’); 引用 Vscode 内置图标
  • description:节点描述,设置之后将展示在 label 内容之后
  • tooltip:节点提示,当鼠标悬停时展示
  • command:用于设置鼠标点击时绑定的操作,这是一个对象:
  • title:名称
  • command:命令 ID
  • arguments:参数数组
  • collapsibleState:控制节点是否能够展开
  • contextValue:用来控制树状视图的特殊行为,与 action(视图绑定的操作)产生联动,在定义 action 时,通过判断节点 contextValue 来实现在指定节点上绑定操作,如:
// package.json
"contributes": {"menus": {"view/item/context": [{"command": "myExtension.myTree.deleteNode","when": "viewItem == nodeA" // nodeA 为 contextValue}]}
}

3.为视图提供数据

通过实现vscode.TreeDataProvider为树状视图提供数据,主要实现以下方法:

  • getChildren(element?: T): ProviderResult<T[]>;

在加载根节点时,入参为undefined;入参有值时,表示加载该节点的子节点。T 是泛型,需要替换为自己实现的树节点类型。如:

  getChildren(element?: MyTreeItem): vscode.ProviderResult<MyTreeItem[]> {if (element) {return Promise.resolve(this.loadItemsOfRootNode());} else {return Promise.resolve(this.loadItemsUnder(element));}}

4.注册 TreeDataProvider

通过调用 registerTreeDataProvider 注册视图数据 Provider:

vscode.window.registerTreeDataProvider('myTreeDataProvider', // 视图 IDnew MyTreeDataProvider()
);

或者在创建视图时绑定:

vscode.window.createTreeView('myTreeView', {  treeDataProvider: new MyTreeDataProvider()});

5.刷新视图

要实现视图刷新,我们需要实现 TreeDataProvider 的事件触发器属性:

  • _onDidChangeTreeData
  • onDidChangeTreeData
    这两个属性一个 public 可见,一个 private 可见。实现如下:
private _onDidChangeTreeData: vscode.EventEmitter<Dependency | undefined | null | void> = new vscode.EventEmitter<Dependency | undefined | null | void>();
readonly onDidChangeTreeData: vscode.Event<Dependency | undefined | null | void> = this._onDidChangeTreeData.event;

我们可以通过 _onDidChangeTreeData 触发刷新:

this._onDidChangeTreeData.fire();

Vscode 在监听到该事件后会重新渲染视图。其他 module 可以访问 onDidChangeTreeData 属性监听刷新事件:

myTreeDataProvider.onDidChangeTreeData(() => { console.log('do something') });

进阶

1.实现拖拽

首先实现 vscode.TreeDragAndDropController,定义如下:

export interface TreeDragAndDropController<T> {  readonly dropMimeTypes: readonly string[];  readonly dragMimeTypes: readonly string[];  handleDrag?(source: readonly T[], dataTransfer: DataTransfer, token: CancellationToken): Thenable<void> | void;  handleDrop?(target: T | undefined, dataTransfer: DataTransfer, token: CancellationToken): Thenable<void> | void;}

dropMimeTypes 和 dragMimeTypes 的值是与树状视图的 id 关联的,也就是用来告诉 Vscode 该控制器只处理从 dragMimeTypes 指定的视图 A 拖拽到 dropMimeTypes 指定的视图 B,如:

dropMimeTypes: readonly string[] = ['application/vnd.code.tree.myExtension_myTreeView'];dragMimeTypes: readonly string[] = ['application/vnd.code.tree.myExtension_myTreeView'];

这里的 ‘application/vnd.code.tree.myExtension_myTreeView’ 对应了 package.json 里定义的:

"views": {"automan": [{"id": "myExtension.myTreeView","name": "MyTreeView"}]},

注意命名转换规则,vscode 对此要求比较严格但官方文档解释又很简略:

  • 点号转换为下划线
  • 点好分割出的每个词必须首字母小写
    接下来需要实现 handleDrop 和 handleDrag 的逻辑。handleDrag 为拖拽开始时要做的动作,在这个方法里我们能知道拖拽开始于哪个元素,同时我们需要将数据使用 MIME_TYPE 进行标记、以传递给 handleDrop 方法:
handleDrag(source: readonly MyTreeItem[], dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Thenable<void> | void {  dataTransfer.set(MIME_TYPE, new vscode.DataTransferItem(source));}

接着在 handleDrop 中取出数据,实现移动逻辑:

handleDrop(target: MyTreeItem | undefined, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Thenable<void> | void {  const transferItem = dataTransfer.get(MIME_TYPE);  if (!transferItem) {    return;  }...
}

将控制器绑定到视图上:

vscode.window.createTreeView('myTreeView', {  treeDataProvider: new MyTreeDataProvider(),  showCollapseAll: true,  canSelectMany: true,  dragAndDropController: new MyTreeDragAndDropController()});

在创建视图的同时设置 canSelectMany,以允许同时拖拽多个项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452898.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot的网上服装商城推荐系统的设计与实现

基于springboot的网上服装商城推荐系统的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xf…

upload-labs靶场Pass-01

upload-labs靶场Pass-01 分析 查看提示&#xff0c;提示如下 查看源码 function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件!");return false;}//定义允许上传…

Halcon 使用二维像素分类对图像进行分割

文章目录 算子histo_2dim 计算双通道灰度值图像的直方图class_2dim_sup 使用二维像素分类对图像进行分割 示例 算子 histo_2dim 计算双通道灰度值图像的直方图 histo_2dim(Regions, ImageCol, ImageRow : Histo2Dim : : )Regions (输入对象)&#xff1a;在此区域内计算直方图…

[STM32] 简单介绍 (一)

文章目录 1.STM32简介2.ARM3.STM32F103ZET6/STM32F103C8T64.STM32命名规则5.STM32最小系统板6.STM32开发方式7.STM32系统架构8.STM32时钟系统9.STM32中断系统9.1 NVIC嵌套向量中断控制器9.2 EXIT外部中断控制器 10.STM32定时器 1.STM32简介 STM32是ST公司基于ARM Cortex-M内核…

水题四道。

我的 水题四道--题目目录 问题 A: 依次输出第k小整数 代码1 问题 B: 第k小整数(knumber) 代码2 树的统计 代码3 枪声问题 代码4 问题 A: 依次输出第k小整数 现有n个正整数&#xff0c;n≤10000&#xff0c;要求出这n个正整数中的第1小的整数&#xff0c;第2小的整数&#xf…

基于Multisim温控电风扇控制电路(含仿真和报告)

【全套资料.zip】温控电风扇控制电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 2.1 设计内容 设计制作一个温控风扇自动控制系统电路。 2.2 设计要求 设计一温控风扇控制系统&am…

汽车管理系统——主界面制作

目录 主界面需要有什么&#xff1f;然后要做什么&#xff1f;添加两个主菜单&#xff08;声明&#xff09;下一步应该干什么&#xff1f;能够跳转到文件有哪几个动作&#xff1f;动作如何声明&#xff1f;为什么用选择声明指针&#xff0c;不选择直接声明这个对象&#xff1f; …

IO进程_day1

目录 概要 标准IO 1.概念&#xff1a; 2.特点&#xff1a; 3.缓存区 3.1行缓存&#xff1a;和终端操作相关 3.2全缓存&#xff1a;和文件操作相关 ​​​​​​​3.3不缓存&#xff1a;标准错误 stderr 4.函数 ​​​​​​​4.1打开文件 ​​​​​​​4.2关闭文件…

Java项目-基于springboot框架的体育馆运营系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

【STM32学习】PWM学习(四),散热风扇的控制,PWM调速调制,

目录 1、基础概念 2、PWM调速风扇功能介绍 2.1风扇功率 2.2、PWM输出流程图 2.3、PWM占空比计算 2.4参数计算 3、配置实现 3.1、添加TIM1功能 3.2、生成代码 3.3、修改代码 1、基础概念 参考&#xff1a;【STM32学习】PWM脉冲宽度调制学习笔记&#xff0c;&#xff…

量化交易:最大回撤(Drawdown)算法

量化交易:最大回撤(Drawdown)算法 写在前面: 本文为本人学习用于回测报告中的最大回撤算法指标时整理的学习笔记,欢迎沟通交流~ 一、基本概念 1.1 最大回撤(Max Drawdown) 回撤:对于任意日期区间,回撤 = 钱包的亏损比例 =(现值 - 原值)/ 原值 = 现值 / 原值 - 1 =…

基于SpringBoot+Vue的厨艺交流系统的设计与实现(源码+定制开发)厨艺知识与美食交流系统开发、在线厨艺分享与交流平台开发、智能厨艺交流与分享系统开发

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

java -jar 命令自动重启 Java 项目

一、java -jar 方式运行项目 重启Java项目通常意味着你需要先停止当前运行的Java进程&#xff0c;然后再次启动它。下面是在CentOS上执行这些步骤的一种常见方法&#xff1a; 停止Java进程 找到Java进程的PID&#xff1a; 使用ps命令配合grep来查找运行中的Java进程的PID&#…

关于WPF项目降低.Net版本

本来有项目是.NET Framework 4.8的&#xff0c;为了兼容升级到.NET 8.0&#xff0c;后期又为了兼容放弃.NET 8.0&#xff0c;升级的步骤&#xff1a;利用vs2022 的 .NET Upgrade Assistant 扩展&#xff0c;磕磕绊绊也升级完成了&#xff1b; 扩展链接&#xff1a; Upgrading…

windows下安装VirtualBox7.1.4

记录详细的安装过程与遇到的问题&#xff1b; 下载地址 virtualbox官网 清华镜像源下载 下载完成后文件&#xff1a; 双击打开&#xff1b; 报错了 意思是需要pc上先安装Microsoft Visual C 2019 https://learn.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redi…

分布式数据库环境(HBase分布式数据库)的搭建与配置

分布式数据库环境&#xff08;HBase分布式数据库&#xff09;的搭建与配置 1. VMWare安装CentOS7.9.20091.1 下载 CentOS7.9.2009 映像文件1.2启动 VMware WorkstationPro&#xff0c;点击“创建新的虚拟机”1.3在新建虚拟机向导界面选择“典型&#xff08;推荐&#xff09;”1…

2024java高频面试之JVM

说说 JVM 内存区域 程序计数器 是「程序控制流的指示器&#xff0c;循环&#xff0c;跳转&#xff0c;异常处理&#xff0c;线程的恢复等工作都需要依赖程序计数器去完成」。程序计数器是「线程私有」的&#xff0c;它的「生命周期是和线程保持一致」的&#xff0c;我们知道&a…

【STM32开发笔记】移植AI框架TensorFlow【DSP指令加速篇】

【STM32开发笔记】移植AI框架TensorFlow【DSP指令加速篇】 一、前文回顾二、CMSIS-NN简介2.1 为什么介绍CMSIS-NN&#xff1f;2.2 CMSIS-NN是什么&#xff1f;2.3 CMSIS-NN核心特性2.4 CMSIS-NN算子支持 三、TFLMCMSIS-NN集成3.1 包含TFLM的STM32项目3.2 理解TFLM中CMSIS-NN相关…

【前端学习】HTML+CSS+JavaScript 入门教程

文章目录 前言1. HTML、CSS、JavaScript 的关系2. HTML2.1 什么是 HTML2.2 认识标签2.3 HTML 常见标签1&#xff09;标题标签&#xff1a;h1 - h62&#xff09;段落标签&#xff1a;p3&#xff09;换行标签&#xff1a;br4&#xff09;图片标签&#xff1a;img5&#xff09;超链…

Linux系统:(Linux系统概述与安装)

硬件计算机硬件是指计算机系统中所有物理部件的总称。包括计算机主机、显示器、键盘、鼠标、内存、硬盘、处理器、主板等等。这些硬件部件是计算机系统运行的基础 不管是电脑系统(个人电脑、服务器等)、还是移动端操作系统(手机、平板等)。它的功能就是做为用户和硬件之间的桥梁…