|
@@ -3,7 +3,20 @@ import { EventEmitter } from "events";
|
|
|
import { MessageIO } from "./MessageIO";
|
|
|
import { NotificationMessage } from "vscode-jsonrpc";
|
|
|
import { DocumentSymbol } from "vscode";
|
|
|
-const METHOD_ID = 'gdscript/show_native_symbol';
|
|
|
+
|
|
|
+const enum Methods {
|
|
|
+ SHOW_NATIVE_SYMBOL = 'gdscript/show_native_symbol',
|
|
|
+ INSPECT_NATIVE_SYMBOL = 'textDocument/nativeSymbol'
|
|
|
+}
|
|
|
+
|
|
|
+interface NativeSymbolInspectParams {
|
|
|
+ native_class: string;
|
|
|
+ symbol_name: string;
|
|
|
+}
|
|
|
+
|
|
|
+const enum WebViewMessageType {
|
|
|
+ INSPECT_NATIVE_SYMBOL = 'INSPECT_NATIVE_SYMBOL',
|
|
|
+};
|
|
|
|
|
|
class GodotNativeSymbol extends DocumentSymbol {
|
|
|
documentation: string;
|
|
@@ -11,15 +24,27 @@ class GodotNativeSymbol extends DocumentSymbol {
|
|
|
};
|
|
|
|
|
|
export default class NativeDocumentManager extends EventEmitter {
|
|
|
-
|
|
|
+
|
|
|
+ private io: MessageIO = null;
|
|
|
+
|
|
|
constructor(io: MessageIO) {
|
|
|
super();
|
|
|
+ this.io = io;
|
|
|
io.on("message", (message: NotificationMessage)=>{
|
|
|
- if (message.method == METHOD_ID) {
|
|
|
+ if (message.method == Methods.SHOW_NATIVE_SYMBOL) {
|
|
|
this.show_native_symbol(message.params);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
+
|
|
|
+ private inspect_native_symbol(params: NativeSymbolInspectParams) {
|
|
|
+ this.io.send_message(JSON.stringify({
|
|
|
+ id: -1,
|
|
|
+ jsonrpc: "2.0",
|
|
|
+ method: Methods.INSPECT_NATIVE_SYMBOL,
|
|
|
+ params
|
|
|
+ }));
|
|
|
+ }
|
|
|
|
|
|
|
|
|
private show_native_symbol(symbol: GodotNativeSymbol) {
|
|
@@ -29,16 +54,42 @@ export default class NativeDocumentManager extends EventEmitter {
|
|
|
symbol.name,
|
|
|
vscode.ViewColumn.Nine,
|
|
|
{
|
|
|
- enableScripts: false, // 启用JS,默认禁用
|
|
|
+ enableScripts: true, // 启用JS,默认禁用
|
|
|
retainContextWhenHidden: false, // webview被隐藏时保持状态,避免被重置
|
|
|
}
|
|
|
);
|
|
|
panel.title = symbol.name;
|
|
|
panel.webview.html = this.make_html_content(symbol);
|
|
|
+ panel.webview.onDidReceiveMessage(this.on_webview_message.bind(this));
|
|
|
+ }
|
|
|
+
|
|
|
+ private on_webview_message(msg: any) {
|
|
|
+ switch (msg.type) {
|
|
|
+ case WebViewMessageType.INSPECT_NATIVE_SYMBOL:
|
|
|
+ this.inspect_native_symbol(msg.data);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private make_html_content(symbol: GodotNativeSymbol): string {
|
|
|
- return `<html><body>${this.make_symbol_document(symbol)}</body></html>`;
|
|
|
+ return `
|
|
|
+ <html>
|
|
|
+ <body>${this.make_symbol_document(symbol)}</body>
|
|
|
+ <script>
|
|
|
+ var vscode = acquireVsCodeApi();
|
|
|
+ function inspect(native_class, symbol_name) {
|
|
|
+ vscode.postMessage({
|
|
|
+ type: '${WebViewMessageType.INSPECT_NATIVE_SYMBOL}',
|
|
|
+ data: {
|
|
|
+ native_class: native_class,
|
|
|
+ symbol_name: symbol_name
|
|
|
+ }
|
|
|
+ });
|
|
|
+ };
|
|
|
+ </script>
|
|
|
+ </html>`;
|
|
|
}
|
|
|
|
|
|
private make_symbol_document(symbol: GodotNativeSymbol): string {
|
|
@@ -52,8 +103,11 @@ export default class NativeDocumentManager extends EventEmitter {
|
|
|
line(`<h1>${symbol.detail}</h1>`);
|
|
|
line(`<h3>Description</h3>`)
|
|
|
line(`<p>${this.parse_markdown(symbol.documentation)}</p>`);
|
|
|
+ line(`<a onclick="inspect('Control', 'rect_position')">Control.rect_position</a>`);
|
|
|
} break;
|
|
|
default:
|
|
|
+ line(`<h1>${symbol.detail}</h1>`);
|
|
|
+ line(`<p>${this.parse_markdown(symbol.documentation)}</p>`);
|
|
|
break;
|
|
|
}
|
|
|
return doc;
|