Так что я добился некоторого прогресса с этого поста:
Дублирующая схема TreeView - это расширение кода VS
С тех пор я загрузил код в этот репозиторий:
https://github.com/trebleCode/dxdevcheck.git
Я могу поместить содержимое статического файла JSON в представление, которое мне нужно, в моем пользовательском параметре viewsContainers. Моя идея состоит в том, чтобы активировать это представление, помещая элементы в представление на основе содержимого JSON с неопределенными значениями iconPath
, чтобы при нажатии кнопки обновления запускались некоторые функции и проверялось, считаются ли эти элементы «настроенными», и если да, то обновите их значком, указывающим, настроен или не настроен.
Моя проблема сейчас в том, что я застрял, пытаясь выяснить, почему метод refresh()
, существующий в моем TreeDataViewProvider
, не будет обновлять эти значки, когда я снова попытаюсь вернуть свое представление с новым набором объектов, которые имеют значения в файлы .svg в проекте.
Просто клонируйте репо, запустите npm i
из клонированного каталога, нажмите F5 и оно должно запуститься.
На левой боковой панели появится значок молнии, который после щелчка откроет новое меню с надписью VALIDATE. Под ним будет четыре складных / складных предмета с двумя детьми каждый. В правом верхнем углу этого меню будет круглый значок, когда над ним будет написано «Подтвердите вещи!». При щелчке, это поместит модальное ShowInformationMessage в правом нижнем углу.
Это refresh()
метод в классе ValidateMenuProvider в validateMenu.ts. Я закомментировал код в этом разделе, который я пробовал, и не могу понять, почему он ведет себя так, как он.
Я думаю, что я пытаюсь реализовать обновление значка в неправильном месте в моем расширении, поэтому любые указатели приветствуются.
Мой класс:
import * as vscode from "vscode";
import * as validateMenuItems from "./validateMenu.json";
import * as path from "path";
import * as customUtils from "./customUtils";
export class ValidateMenuProvider implements vscode.TreeDataProvider<ValidateMenu> {
private _onDidChangeTreeData: vscode.EventEmitter<ValidateMenu | undefined> = new vscode.EventEmitter<ValidateMenu | undefined>();
readonly onDidChangeTreeData: vscode.Event<ValidateMenu | undefined> = this._onDidChangeTreeData.event;
constructor() {}
refresh() {
// Why does this not work to update icons?
vscode.window.showInformationMessage('Refresh button clicked!');
return this.getValidateMenu(true);
//
}
getTreeItem(element?: ValidateMenu): vscode.TreeItem {
return element;
}
getChildren(element?: any, withIcons?: boolean): ValidateMenu[] {
if(element) {
return element.children;
}
else {
return this.getValidateMenu();
}
}
getValidateMenu(withIcons?: boolean): ValidateMenu[] {
const toChild = (label: string, icon?: any): ValidateMenu => { return new ValidateMenu(label,vscode.TreeItemCollapsibleState.None);};
function getMenusFromParent(target: any) {
let childrenArray: any = [];
for(let i in target) {
let currentChild: string = target[i].name;
let currentConvertedChild = toChild(currentChild);
if(withIcons === true) {
let configCheck = currentConvertedChild.isConfigured(target[i].name);
if(configCheck === true) {
currentConvertedChild.setConfiguredIcon();
}
else if(configCheck === false) {
currentConvertedChild.setErrorIcon();
}
}
childrenArray.push(currentConvertedChild);
}
return childrenArray;
}
function createMenu(label: string, target: any) {
let childData = getMenusFromParent(target);
return new ValidateMenu(label, vscode.TreeItemCollapsibleState.Expanded, childData);
}
let headings = Object(validateMenuItems.children);
let child1 = headings['child1'];
let child2 = headings['child2'];
let child3 = headings['child3'];
let child4 = headings['child4'];
let menus: any = [];
menus.push(createMenu('child1', child1));
menus.push(createMenu('child2', child2));
menus.push(createMenu('child3', child3));
menus.push(createMenu('child4', child4));
return menus;
}
}
export class ValidateMenu extends vscode.TreeItem {
constructor(
public readonly label: string,
public readonly collapsibleState: vscode.TreeItemCollapsibleState,
public children?: ValidateMenu[],
public readonly command?: vscode.Command,
public iconPath?: { light: string, dark: string }
) {
super(label,collapsibleState);
}
setConfiguredIcon(): void {
let newLightIcon: any;
let newDarkIcon: any;
newLightIcon = path.join(__filename, '..', '..', 'resources', 'light', 'checkmark.svg');
newDarkIcon = path.join(__filename, '..', '..', 'resources', 'dark', 'checkmark2.svg');
if(this.iconPath === undefined) {
this.iconPath = {light: newLightIcon, dark: newDarkIcon};
}
else {
this.iconPath = {light: newLightIcon, dark: newDarkIcon};
}
}
setErrorIcon(): void {
let newLightIcon: any;
let newDarkIcon: any;
newLightIcon = path.join(__filename, '..', '..', 'resources', 'light', 'confused2.svg');
newDarkIcon = path.join(__filename, '..', '..', 'resources', 'dark', 'confused.svg');
if(this.iconPath === undefined) {
this.iconPath = {light: newLightIcon, dark: newDarkIcon};
}
else {
this.iconPath = {light: newLightIcon, dark: newDarkIcon};
}
}
isConfigured(name: string): boolean {
if(customUtils.checkIsConfigured(name) === true) {
return true;
}
else {
return false;
}
}
}
Мой статический файл JSON:
{
"name": "root",
"children": {
"child1": [
{"id": "id1", "name": "child1name1"},
{"id": "id2", "name": "child2name2"}
],
"child2": [
{"id": "id1", "name": "child2name1"},
{"id": "id2", "name": "child2name2"}
],
"child3": [
{"id": "id1", "name": "child3name1"},
{"id": "id2", "name": "child3name2"}
],
"child4": [
{"id": "id1", "name": "child4name1"},
{"id": "id2", "name": "child5name2"}
]
}
}
И некоторые вспомогательные утилиты, которые я вызываю из некоторых импортированных функций (customUtils.ts):
export function checkIsConfigured(name: string): boolean {
let isConfigured: boolean;
switch (name) {
case 'child1':
isConfigured = checkChild1();
break;
case 'child2':
isConfigured = checkChild2();
break;
case 'child1':
isConfigured = checkChild3();
break;
case 'child1':
isConfigured = checkChild4();
break;
}
return isConfigured;
}
export function checkChild1() {
return true;
}
export function checkChild2() {
return false;
}
export function checkChild3() {
return true;
}
export function checkChild4() {
return false;
}
Наконец, package.json:
{
"name": "myview",
"displayName": "MYVIEW",
"description": "checks dev things",
"version": "0.0.2",
"publisher": "someperson",
"engines": {
"vscode": "^1.28.0"
},
"categories": [
"Other"
],
"activationEvents": [
"onView:validateMenu"
],
"main": "./out/extension.js",
"contributes": {
"viewsContainers": {
"activitybar": [
{
"id": "myview",
"title": "My Custom View Container",
"icon": "resources/bolt.svg"
}
]
},
"views": {
"myview": [
{
"id": "validateMenu",
"name": "Validate"
}
]
},
"commands": [
{
"command": "validateMenu.refreshList",
"title": "Validate the things!",
"icon": "resources/spinner.svg"
}
],
"menus": {
"view/title": [
{
"command": "validateMenu.refreshList",
"when": "view == validateMenu",
"group": "navigation"
}
]
}
},
"scripts": {
"vscode:prepublish": "npm run compile",
"compile": "tsc -p ./",
"watch": "tsc -watch -p ./",
"postinstall": "node ./node_modules/vscode/bin/install",
"test": "npm run compile && node ./node_modules/vscode/bin/test"
},
"devDependencies": {
"@types/mocha": "^2.2.42",
"@types/node": "^10.12.21",
"tslint": "^5.12.1",
"typescript": "^3.3.1",
"vscode": "^1.1.28"
},
"dependencies": {}
}