Fixes diff editor gutter menu focus problems

This commit is contained in:
Henning Dieterichs 2024-03-21 15:25:23 +01:00 committed by Henning Dieterichs
parent e5515ac702
commit 2a14ad4b71
4 changed files with 48 additions and 12 deletions

View file

@ -1522,12 +1522,15 @@ export class CommandCenter {
}
async diffStageHunkOrSelection(changes: DiffEditorSelectionHunkToolbarContext): Promise<void> {
const textEditor = window.activeTextEditor;
if (!textEditor) {
return;
let modifiedUri = changes.modifiedUri;
if (!modifiedUri) {
const textEditor = window.activeTextEditor;
if (!textEditor) {
return;
}
const modifiedDocument = textEditor.document;
modifiedUri = modifiedDocument.uri;
}
const modifiedDocument = textEditor.document;
const modifiedUri = modifiedDocument.uri;
if (modifiedUri.scheme !== 'file') {
return;
}

View file

@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { TextDocument, Range, LineChange, Selection } from 'vscode';
import { TextDocument, Range, LineChange, Selection, Uri } from 'vscode';
export function applyLineChanges(original: TextDocument, modified: TextDocument, diffs: LineChange[]): string {
const result: string[] = [];
@ -149,4 +149,7 @@ export interface DiffEditorSelectionHunkToolbarContext {
* The original text with the selected modified changes applied.
*/
originalWithModifiedChanges: string;
modifiedUri: Uri;
originalUri: Uri;
}

View file

@ -19,6 +19,7 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
import './registrations.contribution';
import { DiffEditorSelectionHunkToolbarContext } from 'vs/editor/browser/widget/diffEditor/features/gutterFeature';
import { URI } from 'vs/base/common/uri';
export class ToggleCollapseUnchangedRegions extends Action2 {
constructor() {
@ -171,14 +172,13 @@ export class RevertHunkOrSelection extends EditorAction2 {
super({
id: 'diffEditor.revert',
title: localize2('revert', 'Revert'),
precondition: ContextKeyExpr.has('isInDiffEditor'),
f1: false,
category: diffEditorCategory,
});
}
runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, arg: DiffEditorSelectionHunkToolbarContext): unknown {
const diffEditor = findFocusedDiffEditor(accessor);
const diffEditor = findDiffEditor(accessor, arg.originalUri, arg.modifiedUri);
if (diffEditor instanceof DiffEditorWidget) {
diffEditor.revertRangeMappings(arg.mapping.innerChanges ?? []);
}
@ -234,6 +234,19 @@ export class AccessibleDiffViewerPrev extends Action2 {
}
}
export function findDiffEditor(accessor: ServicesAccessor, originalUri: URI, modifiedUri: URI): IDiffEditor | null {
const codeEditorService = accessor.get(ICodeEditorService);
const diffEditors = codeEditorService.listDiffEditors();
return diffEditors.find(diffEditor => {
const modified = diffEditor.getModifiedEditor();
const original = diffEditor.getOriginalEditor();
return modified && modified.getModel()?.uri.toString() === modifiedUri.toString()
&& original && original.getModel()?.uri.toString() === originalUri.toString();
}) || null;
}
export function findFocusedDiffEditor(accessor: ServicesAccessor): IDiffEditor | null {
const codeEditorService = accessor.get(ICodeEditorService);
const diffEditors = codeEditorService.listDiffEditors();

View file

@ -9,6 +9,7 @@ import { ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar';
import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget';
import { Disposable } from 'vs/base/common/lifecycle';
import { IObservable, autorun, autorunWithStore, derived, observableFromEvent, observableValue } from 'vs/base/common/observable';
import { URI } from 'vs/base/common/uri';
import { DiffEditorEditors } from 'vs/editor/browser/widget/diffEditor/components/diffEditorEditors';
import { DiffEditorViewModel } from 'vs/editor/browser/widget/diffEditor/diffEditorViewModel';
import { appendRemoveOnDispose, applyStyle } from 'vs/editor/browser/widget/diffEditor/utils';
@ -69,7 +70,15 @@ export class DiffEditorGutter extends Disposable {
const selection = this._selectedDiffs.read(reader);
if (selection.length > 0) {
const m = DetailedLineRangeMapping.fromRangeMappings(selection.flatMap(s => s.rangeMappings));
return [new DiffGutterItem(m, true, MenuId.DiffEditorSelectionToolbar, undefined)];
return [
new DiffGutterItem(
m,
true,
MenuId.DiffEditorSelectionToolbar,
undefined,
model.model.original.uri,
model.model.modified.uri,
)];
}
const currentDiff = this._currentDiff.read(reader);
@ -79,6 +88,8 @@ export class DiffEditorGutter extends Disposable {
m.lineRangeMapping === currentDiff?.lineRangeMapping,
MenuId.DiffEditorHunkToolbar,
undefined,
model.model.original.uri,
model.model.modified.uri,
));
},
createView: (item, target) => {
@ -149,6 +160,8 @@ class DiffGutterItem implements IGutterItemInfo {
public readonly showAlways: boolean,
public readonly menuId: MenuId,
public readonly rangeOverride: LineRange | undefined,
public readonly originalUri: URI,
public readonly modifiedUri: URI,
) {
}
get id(): string { return this.mapping.modified.toString(); }
@ -175,8 +188,6 @@ class DiffToolBar extends Disposable implements IGutterItemView {
) {
super();
//const r = new ObservableElementSizeObserver
const hoverDelegate = this._register(instantiationService.createInstance(
WorkbenchHoverDelegate,
'element',
@ -208,10 +219,13 @@ class DiffToolBar extends Disposable implements IGutterItemView {
overflowBehavior: { maxItems: this._isSmall.read(reader) ? 1 : 3 },
hiddenItemStrategy: HiddenItemStrategy.Ignore,
actionRunner: new ActionRunnerWithContext(() => {
const mapping = this._item.get().mapping;
const item = this._item.get();
const mapping = item.mapping;
return {
mapping,
originalWithModifiedChanges: gutter.computeStagedValue(mapping),
originalUri: item.originalUri,
modifiedUri: item.modifiedUri,
} satisfies DiffEditorSelectionHunkToolbarContext;
}),
menuOptions: {
@ -273,4 +287,7 @@ export interface DiffEditorSelectionHunkToolbarContext {
* The original text with the selected modified changes applied.
*/
originalWithModifiedChanges: string;
modifiedUri: URI;
originalUri: URI;
}