From d96b0e93e654bd4bf965db3a6c7ed808518bd330 Mon Sep 17 00:00:00 2001 From: David Kincaid Date: Thu, 13 Jun 2024 12:16:04 -0400 Subject: [PATCH 1/7] Rename Scene Preview "pinning" to "locking" --- package.json | 30 ++++++++++++++++++------------ src/scene_tools/preview.ts | 12 ++++++------ 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index fe4426d90..31e630801 100644 --- a/package.json +++ b/package.json @@ -153,15 +153,21 @@ }, { "category": "Godot Tools", - "command": "godotTools.scenePreview.pin", - "title": "Pin Scene Preview", - "icon": "resources/pin_off.svg" + "command": "godotTools.scenePreview.lock", + "title": "Lock Scene Preview", + "icon": { + "light": "resources/godot_icons/light/Unlock.svg", + "dark": "resources/godot_icons/dark/Unlock.svg" + } }, { "category": "Godot Tools", - "command": "godotTools.scenePreview.unpin", - "title": "Unpin Scene Preview", - "icon": "resources/pin_on.svg" + "command": "godotTools.scenePreview.unlock", + "title": "Unlock Scene Preview", + "icon": { + "light": "resources/godot_icons/light/Lock.svg", + "dark": "resources/godot_icons/dark/Lock.svg" + } }, { "category": "Godot Tools", @@ -641,11 +647,11 @@ "when": "false" }, { - "command": "godotTools.scenePreview.pin", + "command": "godotTools.scenePreview.lock", "when": "false" }, { - "command": "godotTools.scenePreview.unpin", + "command": "godotTools.scenePreview.unlock", "when": "false" }, { @@ -693,13 +699,13 @@ "group": "navigation" }, { - "command": "godotTools.scenePreview.pin", - "when": "view == scenePreview && !godotTools.context.scenePreview.pinned", + "command": "godotTools.scenePreview.lock", + "when": "view == scenePreview && !godotTools.context.scenePreview.locked", "group": "navigation" }, { - "command": "godotTools.scenePreview.unpin", - "when": "view == scenePreview && godotTools.context.scenePreview.pinned", + "command": "godotTools.scenePreview.unlock", + "when": "view == scenePreview && godotTools.context.scenePreview.locked", "group": "navigation" } ], diff --git a/src/scene_tools/preview.ts b/src/scene_tools/preview.ts index aab4a9c5e..c207a24d4 100644 --- a/src/scene_tools/preview.ts +++ b/src/scene_tools/preview.ts @@ -60,8 +60,8 @@ export class ScenePreviewProvider implements TreeDataProvider, TreeDr { language: "gdscript", scheme: "file" }, ]; context.subscriptions.push( - register_command("scenePreview.pin", this.pin_preview.bind(this)), - register_command("scenePreview.unpin", this.unpin_preview.bind(this)), + register_command("scenePreview.lock", this.lock_preview.bind(this)), + register_command("scenePreview.unlock", this.unlock_preview.bind(this)), register_command("scenePreview.copyNodePath", this.copy_node_path.bind(this)), register_command("scenePreview.copyResourcePath", this.copy_resource_path.bind(this)), register_command("scenePreview.openScene", this.open_scene.bind(this)), @@ -162,14 +162,14 @@ export class ScenePreviewProvider implements TreeDataProvider, TreeDr } } - private pin_preview() { + private lock_preview() { this.scenePreviewPinned = true; - set_context("scenePreview.pinned", true); + set_context("scenePreview.locked", true); } - private unpin_preview() { + private unlock_preview() { this.scenePreviewPinned = false; - set_context("scenePreview.pinned", false); + set_context("scenePreview.locked", false); this.refresh(); } From e438e35473b8d06f28e360e6241cad501921e26e Mon Sep 17 00:00:00 2001 From: David Kincaid Date: Thu, 13 Jun 2024 12:30:51 -0400 Subject: [PATCH 2/7] Add "refresh scene preview" command as button --- package.json | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 31e630801..f8609f719 100644 --- a/package.json +++ b/package.json @@ -149,7 +149,11 @@ { "category": "Godot Tools", "command": "godotTools.scenePreview.refresh", - "title": "Refresh Scene Preview" + "title": "Refresh Scene Preview", + "icon": { + "light": "resources/godot_icons/light/Reload.svg", + "dark": "resources/godot_icons/dark/Reload.svg" + } }, { "category": "Godot Tools", @@ -701,12 +705,17 @@ { "command": "godotTools.scenePreview.lock", "when": "view == scenePreview && !godotTools.context.scenePreview.locked", - "group": "navigation" + "group": "navigation@1" }, { "command": "godotTools.scenePreview.unlock", "when": "view == scenePreview && godotTools.context.scenePreview.locked", - "group": "navigation" + "group": "navigation@1" + }, + { + "command": "godotTools.scenePreview.refresh", + "when": "view == scenePreview", + "group": "navigation@2" } ], "view/item/context": [ From 78f3a321b7a13ca7706b84630693982384ed0c2a Mon Sep 17 00:00:00 2001 From: David Kincaid Date: Thu, 13 Jun 2024 12:31:16 -0400 Subject: [PATCH 3/7] Expose scene preview commands to command palette --- package.json | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/package.json b/package.json index f8609f719..5f1ed0c93 100644 --- a/package.json +++ b/package.json @@ -638,10 +638,6 @@ "command": "godotTools.listGodotClasses", "when": "godotTools.context.connectedToLSP" }, - { - "command": "godotTools.scenePreview.refresh", - "when": "false" - }, { "command": "godotTools.scenePreview.goToDefinition", "when": "false" @@ -650,14 +646,6 @@ "command": "godotTools.scenePreview.openDocumentation", "when": "false" }, - { - "command": "godotTools.scenePreview.lock", - "when": "false" - }, - { - "command": "godotTools.scenePreview.unlock", - "when": "false" - }, { "command": "godotTools.scenePreview.copyNodePath", "when": "false" From 330a871d3a9fd6d3809c2c17af5cd2fe24d121ec Mon Sep 17 00:00:00 2001 From: David Kincaid Date: Thu, 13 Jun 2024 12:33:05 -0400 Subject: [PATCH 4/7] Format file --- src/scene_tools/preview.ts | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/scene_tools/preview.ts b/src/scene_tools/preview.ts index c207a24d4..ff32cc89f 100644 --- a/src/scene_tools/preview.ts +++ b/src/scene_tools/preview.ts @@ -32,7 +32,9 @@ import { SceneNode, Scene } from "./types"; const log = createLogger("scenes.preview"); -export class ScenePreviewProvider implements TreeDataProvider, TreeDragAndDropController, DocumentDropEditProvider { +export class ScenePreviewProvider + implements TreeDataProvider, TreeDragAndDropController, DocumentDropEditProvider +{ public dropMimeTypes = []; public dragMimeTypes = []; private tree: TreeView; @@ -52,7 +54,7 @@ export class ScenePreviewProvider implements TreeDataProvider, TreeDr constructor(private context: ExtensionContext) { this.tree = vscode.window.createTreeView("scenePreview", { treeDataProvider: this, - dragAndDropController: this + dragAndDropController: this, }); const selector = [ @@ -82,12 +84,21 @@ export class ScenePreviewProvider implements TreeDataProvider, TreeDr this.refresh(); } - public handleDrag(source: readonly SceneNode[], data: vscode.DataTransfer, token: vscode.CancellationToken): void | Thenable { + public handleDrag( + source: readonly SceneNode[], + data: vscode.DataTransfer, + token: vscode.CancellationToken, + ): void | Thenable { data.set("godot/path", new vscode.DataTransferItem(source[0].relativePath)); data.set("godot/class", new vscode.DataTransferItem(source[0].className)); } - public provideDocumentDropEdits(document: vscode.TextDocument, position: vscode.Position, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): vscode.ProviderResult { + public provideDocumentDropEdits( + document: vscode.TextDocument, + position: vscode.Position, + dataTransfer: vscode.DataTransfer, + token: vscode.CancellationToken, + ): vscode.ProviderResult { const path = dataTransfer.get("godot/path").value; const className = dataTransfer.get("godot/class").value; @@ -216,7 +227,6 @@ export class ScenePreviewProvider implements TreeDataProvider, TreeDr private tree_selection_changed(event: vscode.TreeViewSelectionChangeEvent) { // const item = event.selection[0]; // log(item.body); - // const editor = vscode.window.activeTextEditor; // const range = editor.document.getText() // editor.revealRange(range) @@ -254,7 +264,7 @@ class UniqueDecorationProvider implements vscode.FileDecorationProvider { return this.changeDecorationsEvent.event; } - constructor(private previewer: ScenePreviewProvider) { } + constructor(private previewer: ScenePreviewProvider) {} provideFileDecoration(uri: Uri, token: CancellationToken): FileDecoration | undefined { if (uri.scheme !== "godot") return undefined; @@ -274,7 +284,7 @@ class ScriptDecorationProvider implements vscode.FileDecorationProvider { return this.changeDecorationsEvent.event; } - constructor(private previewer: ScenePreviewProvider) { } + constructor(private previewer: ScenePreviewProvider) {} provideFileDecoration(uri: Uri, token: CancellationToken): FileDecoration | undefined { if (uri.scheme !== "godot") return undefined; From 0491a22eca7cc374bac78841cb021e796d15d3fd Mon Sep 17 00:00:00 2001 From: David Kincaid Date: Thu, 13 Jun 2024 12:34:23 -0400 Subject: [PATCH 5/7] Fix lint errors --- src/scene_tools/preview.ts | 46 ++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/scene_tools/preview.ts b/src/scene_tools/preview.ts index ff32cc89f..863c1c109 100644 --- a/src/scene_tools/preview.ts +++ b/src/scene_tools/preview.ts @@ -1,23 +1,23 @@ import * as vscode from "vscode"; import { - TreeDataProvider, - TreeDragAndDropController, - ExtensionContext, + type TreeDataProvider, + type TreeDragAndDropController, + type ExtensionContext, EventEmitter, - Event, - TreeView, - ProviderResult, - TreeItem, + type Event, + type TreeView, + type ProviderResult, + type TreeItem, TreeItemCollapsibleState, window, languages, - Uri, - CancellationToken, - FileDecoration, - DocumentDropEditProvider, + type Uri, + type CancellationToken, + type FileDecoration, + type DocumentDropEditProvider, workspace, } from "vscode"; -import * as fs from "fs"; +import * as fs from "node:fs"; import { get_configuration, find_file, @@ -28,7 +28,7 @@ import { make_docs_uri, } from "../utils"; import { SceneParser } from "./parser"; -import { SceneNode, Scene } from "./types"; +import type { SceneNode, Scene } from "./types"; const log = createLogger("scenes.preview"); @@ -117,7 +117,7 @@ export class ScenePreviewProvider return; } setTimeout(async () => { - if (uri.fsPath == this.currentScene) { + if (uri.fsPath === this.currentScene) { this.refresh(); } else { const document = await vscode.workspace.openTextDocument(uri); @@ -139,7 +139,7 @@ export class ScenePreviewProvider if (!fileName.endsWith(".tscn")) { const searchName = fileName.replace(".gd", ".tscn").replace(".cs", ".tscn"); - if (mode == "anyFolder") { + if (mode === "anyFolder") { const relatedScene = await find_file(searchName); if (!relatedScene) { return; @@ -147,14 +147,14 @@ export class ScenePreviewProvider fileName = relatedScene.fsPath; } - if (mode == "sameFolder") { + if (mode === "sameFolder") { if (fs.existsSync(searchName)) { fileName = searchName; } else { return; } } - if (mode == "off") { + if (mode === "off") { return; } } @@ -186,7 +186,7 @@ export class ScenePreviewProvider private copy_node_path(item: SceneNode) { if (item.unique) { - vscode.env.clipboard.writeText("%" + item.label); + vscode.env.clipboard.writeText(`%${item.label}`); return; } vscode.env.clipboard.writeText(item.relativePath); @@ -236,12 +236,10 @@ export class ScenePreviewProvider if (!element) { if (!this.scene?.root) { return Promise.resolve([]); - } else { - return Promise.resolve([this.scene?.root]); } - } else { - return Promise.resolve(element.children); + return Promise.resolve([this.scene?.root]); } + return Promise.resolve(element.children); } public getTreeItem(element: SceneNode): TreeItem | Thenable { @@ -270,7 +268,7 @@ class UniqueDecorationProvider implements vscode.FileDecorationProvider { if (uri.scheme !== "godot") return undefined; const node = this.previewer.scene?.nodes.get(uri.path); - if (node && node.unique) { + if (node?.unique) { return { badge: "%", }; @@ -290,7 +288,7 @@ class ScriptDecorationProvider implements vscode.FileDecorationProvider { if (uri.scheme !== "godot") return undefined; const node = this.previewer.scene?.nodes.get(uri.path); - if (node && node.hasScript) { + if (node?.hasScript) { return { badge: "S", }; From 33578b9682b1a3952bf639a96a0e564e6d9d28f6 Mon Sep 17 00:00:00 2001 From: David Kincaid Date: Thu, 13 Jun 2024 13:08:14 -0400 Subject: [PATCH 6/7] Fix last reference to "pinning" --- src/scene_tools/preview.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/scene_tools/preview.ts b/src/scene_tools/preview.ts index 863c1c109..5262844b7 100644 --- a/src/scene_tools/preview.ts +++ b/src/scene_tools/preview.ts @@ -38,7 +38,7 @@ export class ScenePreviewProvider public dropMimeTypes = []; public dragMimeTypes = []; private tree: TreeView; - private scenePreviewPinned = false; + private scenePreviewLocked = false; private currentScene = ""; public parser = new SceneParser(); public scene: Scene; @@ -127,7 +127,7 @@ export class ScenePreviewProvider } public async refresh() { - if (this.scenePreviewPinned) { + if (this.scenePreviewLocked) { return; } @@ -174,12 +174,12 @@ export class ScenePreviewProvider } private lock_preview() { - this.scenePreviewPinned = true; + this.scenePreviewLocked = true; set_context("scenePreview.locked", true); } private unlock_preview() { - this.scenePreviewPinned = false; + this.scenePreviewLocked = false; set_context("scenePreview.locked", false); this.refresh(); } From 227602ce971a4e7d9d1cf61430a0e21e2ceb7822 Mon Sep 17 00:00:00 2001 From: David Kincaid Date: Thu, 13 Jun 2024 13:08:38 -0400 Subject: [PATCH 7/7] Add openCurrentScene and openMainScript commands --- package.json | 28 ++++++++++++++++++++++++++++ src/scene_tools/preview.ts | 26 ++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5f1ed0c93..a8a320a1e 100644 --- a/package.json +++ b/package.json @@ -155,6 +155,24 @@ "dark": "resources/godot_icons/dark/Reload.svg" } }, + { + "category": "Godot Tools", + "command": "godotTools.scenePreview.openCurrentScene", + "title": "Open the Scene Preview's current scene", + "icon": { + "light": "resources/godot_icons/light/PackedScene.svg", + "dark": "resources/godot_icons/dark/PackedScene.svg" + } + }, + { + "category": "Godot Tools", + "command": "godotTools.scenePreview.openMainScript", + "title": "Open the main script of the Scene Preview's current scene", + "icon": { + "light": "resources/godot_icons/light/Script.svg", + "dark": "resources/godot_icons/dark/Script.svg" + } + }, { "category": "Godot Tools", "command": "godotTools.scenePreview.lock", @@ -704,6 +722,16 @@ "command": "godotTools.scenePreview.refresh", "when": "view == scenePreview", "group": "navigation@2" + }, + { + "command": "godotTools.scenePreview.openMainScript", + "when": "view == scenePreview", + "group": "navigation@3" + }, + { + "command": "godotTools.scenePreview.openCurrentScene", + "when": "view == scenePreview", + "group": "navigation@4" } ], "view/item/context": [ diff --git a/src/scene_tools/preview.ts b/src/scene_tools/preview.ts index 5262844b7..b9b1148ee 100644 --- a/src/scene_tools/preview.ts +++ b/src/scene_tools/preview.ts @@ -68,6 +68,8 @@ export class ScenePreviewProvider register_command("scenePreview.copyResourcePath", this.copy_resource_path.bind(this)), register_command("scenePreview.openScene", this.open_scene.bind(this)), register_command("scenePreview.openScript", this.open_script.bind(this)), + register_command("scenePreview.openCurrentScene", this.open_current_scene.bind(this)), + register_command("scenePreview.openCurrentScript", this.open_main_script.bind(this)), register_command("scenePreview.goToDefinition", this.go_to_definition.bind(this)), register_command("scenePreview.openDocumentation", this.open_documentation.bind(this)), register_command("scenePreview.refresh", this.refresh.bind(this)), @@ -212,6 +214,26 @@ export class ScenePreviewProvider } } + private async open_current_scene() { + if (this.currentScene) { + const document = await vscode.workspace.openTextDocument(this.currentScene); + vscode.window.showTextDocument(document); + } + } + + private async open_main_script() { + if (this.currentScene) { + const root = this.scene.root; + if (root?.hasScript) { + const path = this.scene.externalResources[root.scriptId].path; + const uri = await convert_resource_path_to_uri(path); + if (uri) { + vscode.window.showTextDocument(uri, { preview: true }); + } + } + } + } + private async go_to_definition(item: SceneNode) { const document = await vscode.workspace.openTextDocument(this.currentScene); const start = document.positionAt(item.position); @@ -237,9 +259,9 @@ export class ScenePreviewProvider if (!this.scene?.root) { return Promise.resolve([]); } - return Promise.resolve([this.scene?.root]); + return Promise.resolve([this.scene?.root]); } - return Promise.resolve(element.children); + return Promise.resolve(element.children); } public getTreeItem(element: SceneNode): TreeItem | Thenable {