From 77426336733bc23612da0f6d03e7c1e5898a1744 Mon Sep 17 00:00:00 2001 From: FernandoAscencio Date: Wed, 19 Jul 2023 15:58:23 -0400 Subject: [PATCH] Retire `KeybindingContext` Part 1 Retiring the use of `context` in keybindings This is still in draft and review. `KeybindingContext` classes still exist in Theia, but no longer used. Needs some review to streamline --- .../src/browser/console-contribution.ts | 10 +++---- .../console/src/browser/console-widget.ts | 30 +++++++++++++++---- ...debug-frontend-application-contribution.ts | 22 +++++++------- .../editor/debug-breakpoint-widget.tsx | 13 ++++++++ .../src/browser/blame/blame-contribution.ts | 19 ++++++++++-- .../src/browser/notifications-contribution.ts | 2 +- .../src/browser/notifications-manager.ts | 3 ++ .../src/browser/navigator-contribution.ts | 7 ++--- .../browser/terminal-frontend-contribution.ts | 15 ++++++++-- 9 files changed, 89 insertions(+), 32 deletions(-) diff --git a/packages/console/src/browser/console-contribution.ts b/packages/console/src/browser/console-contribution.ts index bc68cec19ce40..685d9914e76e3 100644 --- a/packages/console/src/browser/console-contribution.ts +++ b/packages/console/src/browser/console-contribution.ts @@ -18,7 +18,7 @@ import { injectable, inject } from '@theia/core/shared/inversify'; import { Command, CommandContribution, CommandRegistry, MenuContribution, MenuModelRegistry, CommandHandler } from '@theia/core'; import { FrontendApplicationContribution, KeybindingContribution, KeybindingRegistry, CommonCommands } from '@theia/core/lib/browser'; import { ConsoleManager } from './console-manager'; -import { ConsoleKeybindingContexts } from './console-keybinding-contexts'; +// import { ConsoleKeybindingContexts } from './console-keybinding-contexts'; import { ConsoleWidget } from './console-widget'; import { ConsoleContentWidget } from './console-content-widget'; import { nls } from '@theia/core/lib/common/nls'; @@ -70,22 +70,22 @@ export class ConsoleContribution implements FrontendApplicationContribution, Com keybindings.registerKeybinding({ command: ConsoleCommands.SELECT_ALL.id, keybinding: 'ctrlcmd+a', - context: ConsoleKeybindingContexts.consoleContentFocus + when: 'consoleContentFocus' }); keybindings.registerKeybinding({ command: ConsoleCommands.EXECUTE.id, keybinding: 'enter', - context: ConsoleKeybindingContexts.consoleInputFocus + when: 'consoleInputFocus' }); keybindings.registerKeybinding({ command: ConsoleCommands.NAVIGATE_BACK.id, keybinding: 'up', - context: ConsoleKeybindingContexts.consoleNavigationBackEnabled + when: 'consoleInputFocus' }); keybindings.registerKeybinding({ command: ConsoleCommands.NAVIGATE_FORWARD.id, keybinding: 'down', - context: ConsoleKeybindingContexts.consoleNavigationForwardEnabled + when: 'consoleInputFocus' }); } diff --git a/packages/console/src/browser/console-widget.ts b/packages/console/src/browser/console-widget.ts index ed508a7f1ec71..d4016fb6e26ff 100644 --- a/packages/console/src/browser/console-widget.ts +++ b/packages/console/src/browser/console-widget.ts @@ -17,7 +17,7 @@ import { ElementExt } from '@theia/core/shared/@phosphor/domutils'; import { injectable, inject, postConstruct, interfaces, Container } from '@theia/core/shared/inversify'; import { TreeSourceNode } from '@theia/core/lib/browser/source-tree'; -import { ContextKey } from '@theia/core/lib/browser/context-key-service'; +import { ContextKeyService, ContextKey } from '@theia/core/lib/browser/context-key-service'; import { BaseWidget, PanelLayout, Widget, Message, MessageLoop, StatefulWidget, CompositeTreeNode } from '@theia/core/lib/browser'; import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; import URI from '@theia/core/lib/common/uri'; @@ -75,7 +75,11 @@ export class ConsoleWidget extends BaseWidget implements StatefulWidget { @inject(MonacoEditorProvider) protected readonly editorProvider: MonacoEditorProvider; + @inject(ContextKeyService) + protected readonly contextKeyService: ContextKeyService; + protected _input: MonacoEditor; + protected consoleContentFocus: ContextKey; constructor() { super(); @@ -130,6 +134,13 @@ export class ConsoleWidget extends BaseWidget implements StatefulWidget { if (inputFocusContextKey) { this.toDispose.push(input.onFocusChanged(() => inputFocusContextKey.set(this.hasInputFocus()))); } + // this.consoleContentFocus = this.contextKeyService.createKey('consoleContentFocus', true); + const inputContext = this.contextKeyService.createScoped(inputWidget.node); + inputContext.setContext('consoleInputFocus', true); + const contentContext = this.contextKeyService.createScoped(this.content.node); + contentContext.setContext('consoleContentFocus', true); + this.toDispose.push(inputContext); + this.toDispose.push(contentContext); } protected createInput(node: HTMLElement): Promise { @@ -198,7 +209,9 @@ export class ConsoleWidget extends BaseWidget implements StatefulWidget { return; } const editor = this.input.getControl(); - editor.setValue(value); + if (editor.getPosition()!.equals({ lineNumber: 1, column: 1 })) { + editor.setValue(value); + } editor.setPosition({ lineNumber: 1, column: 1 @@ -208,10 +221,15 @@ export class ConsoleWidget extends BaseWidget implements StatefulWidget { navigateForward(): void { const value = this.history.next || ''; const editor = this.input.getControl(); - editor.setValue(value); - const lineNumber = editor.getModel()!.getLineCount(); - const column = editor.getModel()!.getLineMaxColumn(lineNumber); - editor.setPosition({ lineNumber, column }); + const getFinalPos = () => { + const lineNumber = editor.getModel()!.getLineCount(); + const column = editor.getModel()!.getLineMaxColumn(lineNumber); + return {lineNumber, column}; + }; + if (editor.getPosition()!.equals(getFinalPos())) { + editor.setValue(value); + } + editor.setPosition(getFinalPos()); } protected revealLastOutput(): void { diff --git a/packages/debug/src/browser/debug-frontend-application-contribution.ts b/packages/debug/src/browser/debug-frontend-application-contribution.ts index 160355059d3e2..0210e408bb1b8 100644 --- a/packages/debug/src/browser/debug-frontend-application-contribution.ts +++ b/packages/debug/src/browser/debug-frontend-application-contribution.ts @@ -1020,60 +1020,60 @@ export class DebugFrontendApplicationContribution extends AbstractViewContributi keybindings.registerKeybinding({ command: DebugCommands.STOP.id, keybinding: 'shift+f5', - context: DebugKeybindingContexts.inDebugMode + when: DebugKeybindingContexts.inDebugMode }); keybindings.registerKeybinding({ command: DebugCommands.RESTART.id, keybinding: 'shift+ctrlcmd+f5', - context: DebugKeybindingContexts.inDebugMode + when: DebugKeybindingContexts.inDebugMode }); keybindings.registerKeybinding({ command: DebugCommands.STEP_OVER.id, keybinding: 'f10', - context: DebugKeybindingContexts.inDebugMode + when: DebugKeybindingContexts.inDebugMode }); keybindings.registerKeybinding({ command: DebugCommands.STEP_INTO.id, keybinding: 'f11', - context: DebugKeybindingContexts.inDebugMode + when: DebugKeybindingContexts.inDebugMode }); keybindings.registerKeybinding({ command: DebugCommands.STEP_OUT.id, keybinding: 'shift+f11', - context: DebugKeybindingContexts.inDebugMode + when: DebugKeybindingContexts.inDebugMode }); keybindings.registerKeybinding({ command: DebugCommands.CONTINUE.id, keybinding: 'f5', - context: DebugKeybindingContexts.inDebugMode + when: DebugKeybindingContexts.inDebugMode }); keybindings.registerKeybinding({ command: DebugCommands.PAUSE.id, keybinding: 'f6', - context: DebugKeybindingContexts.inDebugMode + when: DebugKeybindingContexts.inDebugMode }); keybindings.registerKeybinding({ command: DebugCommands.TOGGLE_BREAKPOINT.id, keybinding: 'f9', - context: EditorKeybindingContexts.editorTextFocus + when: EditorKeybindingContexts.editorTextFocus }); keybindings.registerKeybinding({ command: DebugCommands.INLINE_BREAKPOINT.id, keybinding: 'shift+f9', - context: EditorKeybindingContexts.editorTextFocus + when: EditorKeybindingContexts.editorTextFocus }); keybindings.registerKeybinding({ command: DebugBreakpointWidgetCommands.ACCEPT.id, keybinding: 'enter', - context: DebugKeybindingContexts.breakpointWidgetInputFocus + when: 'isBreakpointWidgetVisible && breakpointWidgetFocus' }); keybindings.registerKeybinding({ command: DebugBreakpointWidgetCommands.CLOSE.id, keybinding: 'esc', - context: DebugKeybindingContexts.breakpointWidgetInputStrictFocus + when: 'isBreakpointWidgetVisible' }); } diff --git a/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx b/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx index 94adf2b25869d..854cb801f30dd 100644 --- a/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx +++ b/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx @@ -36,6 +36,7 @@ import { ILanguageFeaturesService } from '@theia/monaco-editor-core/esm/vs/edito import { StandaloneServices } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices'; import { TextModel } from '@theia/monaco-editor-core/esm/vs/editor/common/model/textModel'; import { SelectComponent, SelectOption } from '@theia/core/lib/browser/widgets/select-component'; +import { ContextKeyService, ContextKey } from '@theia/core/lib/browser/context-key-service'; export type ShowDebugBreakpointOptions = DebugSourceBreakpoint | { position: monaco.Position, @@ -54,6 +55,9 @@ export class DebugBreakpointWidget implements Disposable { @inject(MonacoEditorProvider) protected readonly editorProvider: MonacoEditorProvider; + @inject(ContextKeyService) + protected readonly contextKeyService: ContextKeyService; + protected selectNode: HTMLDivElement; protected selectNodeRoot: Root; @@ -92,6 +96,8 @@ export class DebugBreakpointWidget implements Disposable { } } + protected breakpointWidgetVisible: ContextKey; + @postConstruct() protected init(): void { this.doInit(); @@ -155,6 +161,11 @@ export class DebugBreakpointWidget implements Disposable { this.zone.layout(heightInLines); this.updatePlaceholder(); })); + + this.breakpointWidgetVisible = this.contextKeyService.createKey('isBreakpointWidgetVisible', false); + const localContext = this.contextKeyService.createScoped(this.selectNode); + localContext.setContext('breakpointWidgetFocus', true); + this.toDispose.push(localContext); } dispose(): void { @@ -195,11 +206,13 @@ export class DebugBreakpointWidget implements Disposable { const heightInLines = editor.getModel()!.getLineCount() + 1; this.zone.show({ afterLineNumber, afterColumn, heightInLines, frameWidth: 1 }); editor.setPosition(editor.getModel()!.getPositionAt(editor.getModel()!.getValueLength())); + this.breakpointWidgetVisible.set(true); this._input.focus(); } hide(): void { this.zone.hide(); + this.breakpointWidgetVisible.set(false); this.editor.focus(); } diff --git a/packages/git/src/browser/blame/blame-contribution.ts b/packages/git/src/browser/blame/blame-contribution.ts index a3fb023eec088..e3a0e6566fc0d 100644 --- a/packages/git/src/browser/blame/blame-contribution.ts +++ b/packages/git/src/browser/blame/blame-contribution.ts @@ -14,7 +14,7 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** -import { inject, injectable } from '@theia/core/shared/inversify'; +import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; import { KeybindingContribution, KeybindingRegistry } from '@theia/core/lib/browser'; import { CommandContribution, CommandRegistry, Command, MenuContribution, MenuModelRegistry, DisposableCollection } from '@theia/core/lib/common'; import { BlameDecorator } from './blame-decorator'; @@ -22,6 +22,7 @@ import { EditorManager, EditorKeybindingContexts, EditorWidget, EditorTextFocusC import { BlameManager } from './blame-manager'; import URI from '@theia/core/lib/common/uri'; import { EDITOR_CONTEXT_MENU_SCM } from '@theia/scm-extra/lib/browser/scm-extra-contribution'; +import { ContextKey, ContextKeyService } from '@theia/core/lib/browser/context-key-service'; import debounce = require('@theia/core/shared/lodash.debounce'); @@ -48,6 +49,16 @@ export class BlameContribution implements CommandContribution, KeybindingContrib @inject(BlameManager) protected readonly blameManager: BlameManager; + @inject(ContextKeyService) + protected readonly contextKeyService: ContextKeyService; + + protected visibleBlameAnnotations: ContextKey; + + @postConstruct() + protected init(): void { + this.visibleBlameAnnotations = this.contextKeyService.createKey('showsBlameAnnotations', false); + } + registerCommands(commands: CommandRegistry): void { commands.registerCommand(BlameCommands.TOGGLE_GIT_ANNOTATIONS, { execute: () => { @@ -123,6 +134,7 @@ export class BlameContribution implements CommandContribution, KeybindingContrib } }, 50))); editorWidget.disposed.connect(() => this.clearBlame(uri)); + this.visibleBlameAnnotations.set(true); } } finally { if (toDispose.disposed) { @@ -136,6 +148,7 @@ export class BlameContribution implements CommandContribution, KeybindingContrib if (decorations) { this.appliedDecorations.delete(uri.toString()); decorations.dispose(); + this.visibleBlameAnnotations.reset(); } } @@ -148,12 +161,12 @@ export class BlameContribution implements CommandContribution, KeybindingContrib registerKeybindings(keybindings: KeybindingRegistry): void { keybindings.registerKeybinding({ command: BlameCommands.TOGGLE_GIT_ANNOTATIONS.id, - context: EditorKeybindingContexts.editorTextFocus, + when: EditorKeybindingContexts.editorTextFocus, keybinding: 'alt+b' }); keybindings.registerKeybinding({ command: BlameCommands.CLEAR_GIT_ANNOTATIONS.id, - context: BlameAnnotationsKeybindingContext.showsBlameAnnotations, + when: BlameAnnotationsKeybindingContext.showsBlameAnnotations, keybinding: 'esc' }); } diff --git a/packages/messages/src/browser/notifications-contribution.ts b/packages/messages/src/browser/notifications-contribution.ts index 520cb74f4ec46..228bfaee02401 100644 --- a/packages/messages/src/browser/notifications-contribution.ts +++ b/packages/messages/src/browser/notifications-contribution.ts @@ -98,7 +98,7 @@ export class NotificationsContribution implements FrontendApplicationContributio registerKeybindings(keybindings: KeybindingRegistry): void { keybindings.registerKeybinding({ command: NotificationsCommands.HIDE.id, - context: NotificationsKeybindingContext.notificationsVisible, + when: NotificationsKeybindingContext.notificationsVisible, keybinding: 'esc' }); } diff --git a/packages/messages/src/browser/notifications-manager.ts b/packages/messages/src/browser/notifications-manager.ts index de372b245e8b3..794797d3735f6 100644 --- a/packages/messages/src/browser/notifications-manager.ts +++ b/packages/messages/src/browser/notifications-manager.ts @@ -82,6 +82,7 @@ export class NotificationManager extends MessageClient { protected notificationToastsVisibleKey: ContextKey; protected notificationCenterVisibleKey: ContextKey; + protected notificationsVisible: ContextKey; @postConstruct() protected init(): void { @@ -91,11 +92,13 @@ export class NotificationManager extends MessageClient { protected async doInit(): Promise { this.notificationToastsVisibleKey = this.contextKeyService.createKey('notificationToastsVisible', false); this.notificationCenterVisibleKey = this.contextKeyService.createKey('notificationCenterVisible', false); + this.notificationsVisible = this.contextKeyService.createKey('notificationsVisible', false); } protected updateContextKeys(): void { this.notificationToastsVisibleKey.set(this.toastsVisible); this.notificationCenterVisibleKey.set(this.centerVisible); + this.notificationsVisible.set(this.toastsVisible || this.centerVisible); } get toastsVisible(): boolean { diff --git a/packages/navigator/src/browser/navigator-contribution.ts b/packages/navigator/src/browser/navigator-contribution.ts index 884a2a64a953b..2cf9ab6fa55a4 100644 --- a/packages/navigator/src/browser/navigator-contribution.ts +++ b/packages/navigator/src/browser/navigator-contribution.ts @@ -51,7 +51,6 @@ import { import { EXPLORER_VIEW_CONTAINER_ID, EXPLORER_VIEW_CONTAINER_TITLE_OPTIONS } from './navigator-widget-factory'; import { FILE_NAVIGATOR_ID, FileNavigatorWidget } from './navigator-widget'; import { FileNavigatorPreferences } from './navigator-preferences'; -import { NavigatorKeybindingContexts } from './navigator-keybinding-context'; import { FileNavigatorFilter } from './navigator-filter'; import { WorkspaceNode } from './navigator-tree'; import { NavigatorContextKeyService } from './navigator-context-key-service'; @@ -507,19 +506,19 @@ export class FileNavigatorContribution extends AbstractViewContribution('terminalFocus', false); - const updateFocusKey = () => terminalFocusKey.set(this.shell.activeWidget instanceof TerminalWidget); + const terminalSearchToggle = this.contextKeyService.createKey('hideSearch', false); + const updateSearchToggle = () => { + if (!(this.shell.activeWidget instanceof TerminalWidget)) { + return false; + } + const searchWidget = this.shell.activeWidget.getSearchBox(); + return searchWidget.isVisible; + }; + const updateFocusKey = () => { + terminalFocusKey.set(this.shell.activeWidget instanceof TerminalWidget); + terminalSearchToggle.set(updateSearchToggle()); + }; updateFocusKey(); this.shell.onDidChangeActiveWidget(updateFocusKey); @@ -844,7 +855,7 @@ export class TerminalFrontendContribution implements FrontendApplicationContribu keybindings.registerKeybinding({ command: TerminalCommands.TERMINAL_FIND_TEXT_CANCEL.id, keybinding: 'esc', - context: TerminalKeybindingContexts.terminalHideSearch + when: TerminalKeybindingContexts.terminalHideSearch }); keybindings.registerKeybinding({ command: TerminalCommands.SCROLL_LINE_UP.id,