mirror of
https://github.com/Microsoft/vscode
synced 2024-10-02 09:18:59 +00:00
Fixes diff editor gutter menu focus problems
This commit is contained in:
parent
e5515ac702
commit
2a14ad4b71
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue