From 18e18173f5b032e30e64e070a97a1f43c0dfff8b Mon Sep 17 00:00:00 2001 From: BeniBenj Date: Wed, 22 May 2024 10:02:36 +0200 Subject: [PATCH] Remove tree view show hover --- .../api/browser/viewsExtensionPoint.ts | 61 +------------------ .../workbench/browser/actions/listCommands.ts | 25 ++++++-- .../workbench/browser/parts/views/treeView.ts | 5 -- .../views/browser/treeViewsService.ts | 12 ---- .../services/views/common/treeViewsService.ts | 34 ----------- 5 files changed, 22 insertions(+), 115 deletions(-) delete mode 100644 src/vs/workbench/services/views/browser/treeViewsService.ts delete mode 100644 src/vs/workbench/services/views/common/treeViewsService.ts diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index 73ca041e3db48..b28bd289ca615 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -11,14 +11,14 @@ import { localize } from 'vs/nls'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ExtensionIdentifier, ExtensionIdentifierSet, IExtensionDescription, IExtensionManifest } from 'vs/platform/extensions/common/extensions'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Registry } from 'vs/platform/registry/common/platform'; import { ThemeIcon } from 'vs/base/common/themables'; import { Extensions as ViewletExtensions, PaneCompositeRegistry } from 'vs/workbench/browser/panecomposite'; -import { CustomTreeView, RawCustomTreeViewContextKey, TreeViewPane } from 'vs/workbench/browser/parts/views/treeView'; +import { CustomTreeView, TreeViewPane } from 'vs/workbench/browser/parts/views/treeView'; import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { IWorkbenchContribution, WorkbenchPhase, registerWorkbenchContribution2 } from 'vs/workbench/common/contributions'; -import { Extensions as ViewContainerExtensions, ICustomViewDescriptor, IViewContainersRegistry, IViewDescriptor, IViewsRegistry, ResolvableTreeItem, ViewContainer, ViewContainerLocation } from 'vs/workbench/common/views'; +import { Extensions as ViewContainerExtensions, ICustomViewDescriptor, IViewContainersRegistry, IViewDescriptor, IViewsRegistry, ViewContainer, ViewContainerLocation } from 'vs/workbench/common/views'; import { VIEWLET_ID as DEBUG } from 'vs/workbench/contrib/debug/common/debug'; import { VIEWLET_ID as EXPLORER } from 'vs/workbench/contrib/files/common/files'; import { VIEWLET_ID as REMOTE } from 'vs/workbench/contrib/remote/browser/remoteExplorer'; @@ -26,14 +26,6 @@ import { VIEWLET_ID as SCM } from 'vs/workbench/contrib/scm/common/scm'; import { WebviewViewPane } from 'vs/workbench/contrib/webviewView/browser/webviewViewPane'; import { isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionMessageCollector, ExtensionsRegistry, IExtensionPoint, IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { IListService, WorkbenchListFocusContextKey } from 'vs/platform/list/browser/listService'; -import { IHoverService } from 'vs/platform/hover/browser/hover'; -import { CancellationTokenSource } from 'vs/base/common/cancellation'; -import { AsyncDataTree } from 'vs/base/browser/ui/tree/asyncDataTree'; -import { ITreeViewsService } from 'vs/workbench/services/views/browser/treeViewsService'; -import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget'; import { ILogService } from 'vs/platform/log/common/log'; import { IExtensionFeatureTableRenderer, IRenderedData, ITableData, IRowData, IExtensionFeaturesRegistry, Extensions as ExtensionFeaturesRegistryExtensions } from 'vs/workbench/services/extensionManagement/common/extensionFeatures'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -291,53 +283,6 @@ class ViewsExtensionHandler implements IWorkbenchContribution { this.viewsRegistry = Registry.as(ViewContainerExtensions.ViewsRegistry); this.handleAndRegisterCustomViewContainers(); this.handleAndRegisterCustomViews(); - - // Abstract tree has it's own implementation of triggering custom hover - // TreeView uses it's own implementation due to setting focus inside the (markdown) - let showTreeHoverCancellation = new CancellationTokenSource(); - KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: 'workbench.action.showTreeHover', - handler: async (accessor: ServicesAccessor, ...args: any[]) => { - showTreeHoverCancellation.cancel(); - showTreeHoverCancellation = new CancellationTokenSource(); - const listService = accessor.get(IListService); - const treeViewsService = accessor.get(ITreeViewsService); - const hoverService = accessor.get(IHoverService); - const lastFocusedList = listService.lastFocusedList; - if (!(lastFocusedList instanceof AsyncDataTree)) { - return; - } - const focus = lastFocusedList.getFocus(); - if (!focus || (focus.length === 0)) { - return; - } - const treeItem = focus[0]; - - if (treeItem instanceof ResolvableTreeItem) { - await treeItem.resolve(showTreeHoverCancellation.token); - } - if (!treeItem.tooltip) { - return; - } - const element = treeViewsService.getRenderedTreeElement(('handle' in treeItem) ? treeItem.handle : treeItem); - if (!element) { - return; - } - hoverService.showHover({ - content: treeItem.tooltip, - target: element, - position: { - hoverPosition: HoverPosition.BELOW, - }, - persistence: { - hideOnHover: false - } - }, true); - }, - weight: KeybindingWeight.WorkbenchContrib + 1, - primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.KeyI), - when: ContextKeyExpr.and(RawCustomTreeViewContextKey, WorkbenchListFocusContextKey) - }); } private handleAndRegisterCustomViewContainers() { diff --git a/src/vs/workbench/browser/actions/listCommands.ts b/src/vs/workbench/browser/actions/listCommands.ts index 01de60e808006..db6890b901710 100644 --- a/src/vs/workbench/browser/actions/listCommands.ts +++ b/src/vs/workbench/browser/actions/listCommands.ts @@ -723,16 +723,29 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ return; } - // Check if the focused element has a hover, otherwise find the first child with a hover - const elementWithHover = focusedElement.matches('[custom-hover="true"]') ? focusedElement : focusedElement.querySelector('[custom-hover="true"]'); - if (!elementWithHover) { - return; + const elementWithHover = getCustomHoverForElement(focusedElement as HTMLElement); + if (elementWithHover) { + accessor.get(IHoverService).triggerUpdatableHover(elementWithHover as HTMLElement); } - - accessor.get(IHoverService).triggerUpdatableHover(elementWithHover as HTMLElement); }, }); +function getCustomHoverForElement(element: HTMLElement): HTMLElement | undefined { + // Check if the element itself has a hover + if (element.matches('[custom-hover="true"]')) { + return element; + } + + // Only consider children that are not action items or have a tabindex + // as these element are focusable and the user is able to trigger them already + const noneFocusableElementWithHover = element.querySelector('[custom-hover="true"]:not([tabindex]):not(.action-item)'); + if (noneFocusableElementWithHover) { + return noneFocusableElementWithHover as HTMLElement; + } + + return undefined; +} + KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.toggleExpand', weight: KeybindingWeight.WorkbenchContrib, diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index 45cf1b15b1c88..becd185fd60ea 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -61,7 +61,6 @@ import { Extensions, ITreeItem, ITreeItemLabel, ITreeView, ITreeViewDataProvider import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IHoverService, WorkbenchHoverDelegate } from 'vs/platform/hover/browser/hover'; -import { ITreeViewsService } from 'vs/workbench/services/views/browser/treeViewsService'; import { CodeDataTransfers, LocalSelectionTransfer } from 'vs/platform/dnd/browser/dnd'; import { toExternalVSDataTransfer } from 'vs/editor/browser/dnd'; import { CheckboxStateHandler, TreeItemCheckbox } from 'vs/workbench/browser/parts/views/checkbox'; @@ -1168,7 +1167,6 @@ class TreeRenderer extends Disposable implements ITreeRenderer { } -export const ITreeViewsService = createDecorator('treeViewsService'); -registerSingleton(ITreeViewsService, TreeviewsService, InstantiationType.Delayed); diff --git a/src/vs/workbench/services/views/common/treeViewsService.ts b/src/vs/workbench/services/views/common/treeViewsService.ts deleted file mode 100644 index 4785e5fd36213..0000000000000 --- a/src/vs/workbench/services/views/common/treeViewsService.ts +++ /dev/null @@ -1,34 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -export interface ITreeViewsService { - readonly _serviceBrand: undefined; - - getRenderedTreeElement(node: string): V | undefined; - addRenderedTreeItemElement(node: string, element: V): void; - removeRenderedTreeItemElement(node: string): void; -} - -export class TreeviewsService implements ITreeViewsService { - _serviceBrand: undefined; - private _renderedElements: Map = new Map(); - - getRenderedTreeElement(node: string): V | undefined { - if (this._renderedElements.has(node)) { - return this._renderedElements.get(node); - } - return undefined; - } - - addRenderedTreeItemElement(node: string, element: V): void { - this._renderedElements.set(node, element); - } - - removeRenderedTreeItemElement(node: string): void { - if (this._renderedElements.has(node)) { - this._renderedElements.delete(node); - } - } -}