diff --git a/extension/CHANGELOG.md b/extension/CHANGELOG.md index c04fb31..4566373 100644 --- a/extension/CHANGELOG.md +++ b/extension/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.0.0 + +- New Logo +- Support for the new JS debug adapters +- Moved visualizations to [github.com/hediet/visualization](https://github.com/hediet/visualization). +- New Visualizations / Improved design + ## 1.1.0 - Fixes a bug that occurs when the debug visualizer is opened after the debug session has started. diff --git a/extension/docs/logo.drawio.png b/extension/docs/logo.drawio.png new file mode 100644 index 0000000..4be8538 Binary files /dev/null and b/extension/docs/logo.drawio.png differ diff --git a/extension/docs/logo.png b/extension/docs/logo.png deleted file mode 100644 index 2d9f7d9..0000000 Binary files a/extension/docs/logo.png and /dev/null differ diff --git a/extension/package.json b/extension/package.json index d33b4cf..f732050 100644 --- a/extension/package.json +++ b/extension/package.json @@ -2,9 +2,9 @@ "name": "debug-visualizer", "private": true, "displayName": "Debug Visualizer", - "description": "An extension that visualizes values while debugging.", + "description": "A visual watch window that lets you visualize your data structures while debugging.", "icon": "docs/logo.png", - "version": "1.1.0", + "version": "2.0.0", "license": "GPL-3.0", "engines": { "vscode": "^1.35.0" @@ -17,7 +17,8 @@ "visual", "javascript", "graph", - "ast" + "ast", + "visualization" ], "bugs": { "url": "https://github.com/hediet/vscode-debug-visualizer/issues" diff --git a/extension/src/WebViews.ts b/extension/src/WebViews.ts index e2790a1..25e4b1d 100644 --- a/extension/src/WebViews.ts +++ b/extension/src/WebViews.ts @@ -55,7 +55,7 @@ export class WebViews { webviewPanel: WebviewPanel, expression: string | undefined = undefined ) { - webviewPanel.webview.html = getHtml(this.server, expression); + webviewPanel.webview.html = getWebviewHtml(this.server, expression); const view = new WebView(webviewPanel); this.debugVisualizations.set(webviewPanel, view); webviewPanel.onDidDispose(() => { @@ -68,7 +68,7 @@ export class WebView { constructor(private readonly webviewPanel: WebviewPanel) {} } -export function getHtml( +export function getWebviewHtml( server: Server, expression: string | undefined = undefined ) { diff --git a/webview/src/components/App.tsx b/webview/src/components/App.tsx new file mode 100644 index 0000000..c455c22 --- /dev/null +++ b/webview/src/components/App.tsx @@ -0,0 +1,25 @@ +import * as React from "react"; +import { hotComponent } from "../hotComponent"; +import { GUI } from "./GUI"; +import { Model } from "../model/Model"; + +@hotComponent(module) +export class App extends React.Component { + private readonly model = new Model(); + + constructor(props: any) { + super(props); + + if (this.model.runningMode !== "webView") { + if (this.model.theme === "light") { + require("../vscode-light.scss"); + } else { + require("../vscode-dark.scss"); + } + } + } + + render() { + return ; + } +} diff --git a/webview/src/components/Visualizer.tsx b/webview/src/components/Visualizer.tsx index 400e2e7..484e484 100644 --- a/webview/src/components/Visualizer.tsx +++ b/webview/src/components/Visualizer.tsx @@ -9,7 +9,9 @@ import { VisualizationView, Theme } from "@hediet/visualization-core"; export class Visualizer extends React.Component<{ model: Model }> { render() { return ( -
{this.renderContent()}
+
+ {this.renderContent()} +
); } @@ -36,7 +38,11 @@ export class Visualizer extends React.Component<{ model: Model }> { } return ( ); diff --git a/webview/src/hotComponent.tsx b/webview/src/hotComponent.tsx new file mode 100644 index 0000000..520f54a --- /dev/null +++ b/webview/src/hotComponent.tsx @@ -0,0 +1,49 @@ +import Module = require("module"); +import { observer } from "mobx-react"; +import * as React from "react"; +import { observable, runInAction } from "mobx"; + +type ReactComponent

= + | React.ComponentClass

+ | React.FunctionComponent

; + +const allComponents = new Map(); + +export function hotComponent( + module: Module +): (Component: T) => T { + return (component: T): T => { + const key = JSON.stringify({ id: module.id, name: component.name }); + + let result = allComponents.get(key); + if (!result) { + result = observable({ component: component }); + allComponents.set(key, result); + } else { + setTimeout(() => { + runInAction(`Update Component ${component.name}`, () => { + result!.component = component; + }); + }, 0); + } + + const m = module as { + hot?: { + accept: (( + componentName: string, + callback: () => void + ) => void) & + ((callback: () => void) => void); + }; + }; + + if (m.hot) { + m.hot.accept(() => {}); + } + + return observer((props: any) => { + const C = result!.component; + return ; + }) as any; + }; +} diff --git a/webview/src/index.tsx b/webview/src/index.tsx index b567caf..f7a90c5 100644 --- a/webview/src/index.tsx +++ b/webview/src/index.tsx @@ -1,38 +1,9 @@ import * as React from "react"; import * as ReactDOM from "react-dom"; import "./style.scss"; -import { Model } from "./model/Model"; -import Components = require("./components/GUI"); -import * as mobx from "mobx"; +import { App } from "./components/App"; -const model = new Model(); - -if (model.runningMode !== "webView") { - if (model.theme === "light") { - require("./vscode-light.scss"); - } else { - require("./vscode-dark.scss"); - } -} - -function render(target: HTMLDivElement) { - const c = require("./components/GUI") as typeof Components; - ReactDOM.render(, target); -} - -const target = document.createElement("div"); -target.className = "target"; -document.body.appendChild(target); - -render(target); - -declare var module: { - hot?: { accept: (componentName: string, callback: () => void) => void }; -}; -declare var require: (name: string) => any; - -if (module.hot) { - module.hot.accept("./components/GUI", () => { - render(target); - }); -} +const elem = document.createElement("div"); +elem.className = "react-root"; +document.body.append(elem); +ReactDOM.render(, elem); diff --git a/webview/src/style.scss b/webview/src/style.scss index c05d2f6..8d44f97 100644 --- a/webview/src/style.scss +++ b/webview/src/style.scss @@ -5,7 +5,7 @@ html, body, -.target { +.react-root { height: 100%; } @@ -124,12 +124,6 @@ body { } } -.component-Visualizer { - width: 100%; - height: 100%; - overflow: auto; -} - .component-NoData { width: 100%; height: 100%;