diff --git a/packages/libro-lab/src/kernel-and-terminal-panel/kernel-and-terminal-panel-view.tsx b/packages/libro-lab/src/kernel-and-terminal-panel/kernel-and-terminal-panel-view.tsx index 49d17e65..fd820d60 100644 --- a/packages/libro-lab/src/kernel-and-terminal-panel/kernel-and-terminal-panel-view.tsx +++ b/packages/libro-lab/src/kernel-and-terminal-panel/kernel-and-terminal-panel-view.tsx @@ -1,12 +1,11 @@ import { LibroKernelManager, LibroSessionManager } from '@difizen/libro-kernel'; import { DocumentConnectionManager } from '@difizen/libro-lsp'; +import type { ILanguageServerManager } from '@difizen/libro-lsp'; import type { ILSPDocumentConnectionManager } from '@difizen/libro-lsp'; import { TerminalManager } from '@difizen/libro-terminal'; -import type { TOCView } from '@difizen/libro-toc'; import { BaseView, inject, - prop, singleton, useInject, view, @@ -32,20 +31,20 @@ const PanelRender: React.FC = () => { const instance = useInject(ViewInstance); const openedTabView = instance.getAllOpenedTabView(); - const libroKernelManager = useInject(LibroKernelManager); - const libroSessionManager = useInject(LibroSessionManager); + const { libroKernelManager, libroSessionManager, terminalManager, lspManager } = + instance; + const [kernelItems, setKernelItems] = useState< LibroPanelCollapseKernelItem[] | undefined >(); - const terminalManager = useInject(TerminalManager); const [terminalItems, setTerminalItems] = useState< LibroPanelCollapseItem[] | undefined >(); - const lspManager = useInject( - DocumentConnectionManager, - ).languageServerManager; + // const lspManager = useInject( + // DocumentConnectionManager, + // ).languageServerManager; const [lspItems, setLSPItems] = useState(); @@ -127,6 +126,13 @@ const PanelRender: React.FC = () => { type={LibroPanelCollapseItemType.PAGE} items={undefined} tabView={openedTabView} + shutdownAll={async () => { + openedTabView.children.forEach((item) => { + if (item.title.closable) { + item.dispose(); + } + }); + }} /> ; this.title.label = '运行的终端和内核'; + + this.libroKernelManager = libroKernelManager; + this.libroSessionManager = libroSessionManager; + this.terminalManager = terminalManager; + this.lspManager = lspDocumentConnectionManager.languageServerManager; } getAllOpenedTabView(): SaveableTabView { @@ -168,4 +189,10 @@ export class KernelAndTerminalPanelView extends BaseView { LibroLabLayoutSlots.content, ) as SaveableTabView; } + + refresh() { + this.libroSessionManager.refreshRunning(); + this.terminalManager.refreshRunning(); + this.lspManager.refreshRunning(); + } } diff --git a/packages/libro-lab/src/kernel-and-terminal-panel/module.ts b/packages/libro-lab/src/kernel-and-terminal-panel/module.ts index af37d7da..dcf91a9e 100644 --- a/packages/libro-lab/src/kernel-and-terminal-panel/module.ts +++ b/packages/libro-lab/src/kernel-and-terminal-panel/module.ts @@ -3,8 +3,10 @@ import { createViewPreference, ManaModule } from '@difizen/mana-app'; import { LibroLabLayoutSlots } from '../layout/protocol.js'; import { KernelAndTerminalPanelView } from './kernel-and-terminal-panel-view.js'; +import { PanelCommandContribution } from './panel-command.js'; export const LibroKernelAndTerminalPanelModule = ManaModule.create().register( + PanelCommandContribution, KernelAndTerminalPanelView, createViewPreference({ view: KernelAndTerminalPanelView, diff --git a/packages/libro-lab/src/kernel-and-terminal-panel/panel-command.tsx b/packages/libro-lab/src/kernel-and-terminal-panel/panel-command.tsx new file mode 100644 index 00000000..24651108 --- /dev/null +++ b/packages/libro-lab/src/kernel-and-terminal-panel/panel-command.tsx @@ -0,0 +1,57 @@ +import { ReloadOutlined } from '@ant-design/icons'; +import type { CommandRegistry, ToolbarRegistry } from '@difizen/mana-app'; +import { ViewManager } from '@difizen/mana-app'; +import { + CommandContribution, + inject, + MenuContribution, + singleton, + ToolbarContribution, +} from '@difizen/mana-app'; + +import { KernelAndTerminalPanelView } from './kernel-and-terminal-panel-view.js'; + +export const PanelCommand = { + REFRESH: { + id: 'panel.command.refresh', + label: '刷新', + }, +}; + +@singleton({ + contrib: [CommandContribution, MenuContribution, ToolbarContribution], +}) +export class PanelCommandContribution + implements CommandContribution, ToolbarContribution +{ + protected viewManager: ViewManager; + + @inject(KernelAndTerminalPanelView) + kernelAndTerminalPanelView: KernelAndTerminalPanelView; + + constructor(@inject(ViewManager) viewManager: ViewManager) { + this.viewManager = viewManager; + } + + registerCommands(command: CommandRegistry): void { + command.registerCommand(PanelCommand.REFRESH, { + execute: async (view) => { + if (view instanceof KernelAndTerminalPanelView) { + this.kernelAndTerminalPanelView.refresh(); + } + }, + isVisible: (view) => { + return view instanceof KernelAndTerminalPanelView; + }, + }); + } + + registerToolbarItems(toolbarRegistry: ToolbarRegistry): void { + toolbarRegistry.registerItem({ + id: PanelCommand.REFRESH.id, + command: PanelCommand.REFRESH.id, + icon: , + tooltip: '刷新', + }); + } +} diff --git a/packages/libro-lsp/src/manager.ts b/packages/libro-lsp/src/manager.ts index 7e9439c1..8dddbfb6 100644 --- a/packages/libro-lsp/src/manager.ts +++ b/packages/libro-lsp/src/manager.ts @@ -43,6 +43,10 @@ export class LanguageServerManager implements ILanguageServerManager { .catch(console.error); } + async refreshRunning() { + // TODO: refreshRunning + } + async shutdownAll() { // TODO: shutdownAll } diff --git a/packages/libro-lsp/src/tokens.ts b/packages/libro-lsp/src/tokens.ts index 9e032cc0..00cab631 100644 --- a/packages/libro-lsp/src/tokens.ts +++ b/packages/libro-lsp/src/tokens.ts @@ -86,6 +86,8 @@ export interface ILanguageServerManager extends Disposable { shutdown: (key: string) => Promise; + refreshRunning: () => Promise; + /** * @alpha *