diff --git a/src/core/command.ts b/src/core/command.ts index e2a301f..a47431a 100644 --- a/src/core/command.ts +++ b/src/core/command.ts @@ -2,20 +2,35 @@ import vscode from 'vscode'; import { EditorContext } from './editor-context'; import { log } from './log'; +import { GlobalState } from './global-state'; +import { StatusBar } from './status-bar'; export function registerCommand(vscodeContext: vscode.ExtensionContext) { vscodeContext.subscriptions.push( vscode.commands.registerCommand('ts-type-hidden.toogle', () => { - EditorContext.i.toggleHiddenMode(); + GlobalState.i.isHiddenMode = !GlobalState.i.isHiddenMode; + GlobalState.i.isHiddenMode + ? EditorContext.i.hideType(true) + : EditorContext.i.showType(); + StatusBar.i.changeStatus(GlobalState.i.isHiddenMode); + log.appendLine( + `[command.toogle] Toogle hidden mode, Current mode: ${ + !GlobalState.i.isHiddenMode ? 'On' : 'Off' + }` + ); }), vscode.commands.registerCommand('ts-type-hidden.open', () => { - log.appendLine(`[command.open] Open hidden mode`) + log.appendLine(`[command.open] Open hidden mode`); + GlobalState.i.isHiddenMode = true; EditorContext.i.hideType(true); + StatusBar.i.changeStatus(true); }), vscode.commands.registerCommand('ts-type-hidden.close', () => { - log.appendLine(`[command.close] Close hidden mode`) + log.appendLine(`[command.close] Close hidden mode`); + GlobalState.i.isHiddenMode = false; EditorContext.i.showType(); + StatusBar.i.changeStatus(false); }) ); } diff --git a/src/core/editor-context.ts b/src/core/editor-context.ts index 33bf59f..572d1b3 100644 --- a/src/core/editor-context.ts +++ b/src/core/editor-context.ts @@ -2,6 +2,7 @@ import vscode from 'vscode'; import { TypeAnalyzer, type AnalyzedType } from './helpers/type-analyzer'; import { debounce, isEqual } from 'lodash-es'; import { log } from './log'; +import { GlobalState } from './global-state'; type FoldingRange = Record<'start' | 'end', /* lineNumber */ number>; @@ -23,12 +24,11 @@ export class EditorContext { return EditorContext._instance; } - public static init(vscodeContext: vscode.ExtensionContext) { - EditorContext._instance = new EditorContext(vscodeContext); + public static init() { + EditorContext._instance = new EditorContext(); } private editors = new Map(); - private isHiddenMode = true; private readonly decorationType = { hidden: vscode.window.createTextEditorDecorationType({ textDecoration: 'opacity: 0; font-size: 0; display: none', @@ -38,26 +38,14 @@ export class EditorContext { }; private curFocusedTypes: AnalyzedType[] = []; - private constructor(private readonly vscodeContext: vscode.ExtensionContext) { + private constructor() { this.register(); this.initVisibleEditors(); - this.isHiddenMode = vscodeContext.globalState.get('isHiddenMode', true); - if (this.isHiddenMode) this.hideType(true); - } - - toggleHiddenMode() { - this.vscodeContext.globalState.update( - 'isHiddenMode', - (this.isHiddenMode = !this.isHiddenMode) - ); - this.isHiddenMode ? this.hideType(true) : this.showType(); - log.appendLine(`[command.toogle] ${this.isHiddenMode ? 'Hide' : 'Show'} type`); + if (GlobalState.i.isHiddenMode) this.hideType(true); } hideType(needToFold = false) { - this.vscodeContext.globalState.update('isHiddenMode', (this.isHiddenMode = true)); - const activeEditorWindow = vscode.window.activeTextEditor; if (activeEditorWindow && this.utils.isTargetDocument(activeEditorWindow.document)) { @@ -143,8 +131,6 @@ export class EditorContext { } async showType() { - this.vscodeContext.globalState.update('isHiddenMode', (this.isHiddenMode = false)); - const activeEditor = vscode.window.activeTextEditor; if (activeEditor && this.utils.isTargetDocument(activeEditor.document)) { @@ -185,7 +171,7 @@ export class EditorContext { }); } - if (this.isHiddenMode) this.hideType(isFirstOpen); + if (GlobalState.i.isHiddenMode) this.hideType(isFirstOpen); } }); @@ -201,7 +187,7 @@ export class EditorContext { curChangedEditorInfo.isTSX ).analyze(); - if (this.isHiddenMode) this.hideType(); + if (GlobalState.i.isHiddenMode) this.hideType(); } }, 1000) ); @@ -223,7 +209,7 @@ export class EditorContext { if (!isEqual(focusedTypes, this.curFocusedTypes)) { this.curFocusedTypes = focusedTypes; - if (this.isHiddenMode) this.hideType(); + if (GlobalState.i.isHiddenMode) this.hideType(); } } } diff --git a/src/core/global-state.ts b/src/core/global-state.ts new file mode 100644 index 0000000..c5ca543 --- /dev/null +++ b/src/core/global-state.ts @@ -0,0 +1,27 @@ +import vscode from 'vscode'; + +export class GlobalState { + private static _instance: GlobalState; + + /** instance */ + public static get i(): GlobalState { + if (!GlobalState._instance) { + throw new Error('GlobalState not initialized'); + } + + return GlobalState._instance; + } + + public static init(vscodeContext: vscode.ExtensionContext) { + GlobalState._instance = new GlobalState(vscodeContext); + } + + private constructor(private readonly vscodeContext: vscode.ExtensionContext) {} + + get isHiddenMode() { + return this.vscodeContext.globalState.get('isHiddenMode', true); + } + set isHiddenMode(value: boolean) { + this.vscodeContext.globalState.update('isHiddenMode', value); + } +} diff --git a/src/core/status-bar.ts b/src/core/status-bar.ts new file mode 100644 index 0000000..de95dad --- /dev/null +++ b/src/core/status-bar.ts @@ -0,0 +1,38 @@ +import vscode from 'vscode'; + +export class StatusBar { + private static _instance: StatusBar; + + /** instance */ + public static get i(): StatusBar { + if (!StatusBar._instance) { + throw new Error('StatusBar not initialized'); + } + + return StatusBar._instance; + } + + public static init(vscodeContext: vscode.ExtensionContext) { + StatusBar._instance = new StatusBar(vscodeContext); + } + + private statusBarItem: vscode.StatusBarItem; + + constructor(vscodeContext: vscode.ExtensionContext) { + const isHiddenMode = vscodeContext.globalState.get('isHiddenMode', true); + this.statusBarItem = vscode.window.createStatusBarItem(); + this.statusBarItem.command = 'ts-type-hidden.toogle'; + this.statusBarItem.show(); + this.changeStatus(isHiddenMode); + vscodeContext.subscriptions.push(this.statusBarItem); + } + + changeStatus(isHiddenMode: boolean) { + this.statusBarItem.text = isHiddenMode ? 'TH ✅' : 'TH ❌'; + + this.statusBarItem.tooltip = + '[TS Type Hidden] - Click to toggle hidden mode (Current mode: ' + + (isHiddenMode ? 'On' : 'Off') + + ')'; + } +} diff --git a/src/index.ts b/src/index.ts index ad247c4..b866d4f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,6 +5,8 @@ import { registerCommand } from './core/command'; import { Config } from './core/config'; import { EditorContext } from './core/editor-context'; import { log } from './core/log'; +import { StatusBar } from './core/status-bar'; +import { GlobalState } from './core/global-state'; export function activate(vscodeContext: vscode.ExtensionContext) { log.appendLine(`TS Type Hidden for VS Code v${version}\n`); @@ -14,6 +16,8 @@ export function activate(vscodeContext: vscode.ExtensionContext) { return; } - EditorContext.init(vscodeContext); + GlobalState.init(vscodeContext); + EditorContext.init(); + StatusBar.init(vscodeContext); registerCommand(vscodeContext); }