Update paste and drop proposals (#206496)

* Update paste and drop proposals

Reworks the document paste and drop API proposals. Main highlights:

- Align more with code action api
- Allow a single paste provider to return multiple edits
- Allow resolving applied edits lazily
- Switch from using ids to scoped kinds like used for code actions

* Adding paste context

* Add context

* Update test
This commit is contained in:
Matt Bierner
2024-03-07 16:04:36 -08:00
committed by GitHub
parent d6fb91c889
commit 091987d943
21 changed files with 585 additions and 278 deletions

View File

@@ -48,14 +48,15 @@ function getImageMimeType(uri: vscode.Uri): string | undefined {
class DropOrPasteEditProvider implements vscode.DocumentPasteEditProvider, vscode.DocumentDropEditProvider {
public readonly id = 'insertAttachment';
public static readonly kind = vscode.DocumentPasteEditKind.Empty.append('markdown', 'image', 'attachment');
async provideDocumentPasteEdits(
document: vscode.TextDocument,
_ranges: readonly vscode.Range[],
dataTransfer: vscode.DataTransfer,
_context: vscode.DocumentPasteEditContext,
token: vscode.CancellationToken,
): Promise<vscode.DocumentPasteEdit | undefined> {
): Promise<vscode.DocumentPasteEdit[] | undefined> {
const enabled = vscode.workspace.getConfiguration('ipynb', document).get('pasteImagesAsAttachments.enabled', true);
if (!enabled) {
return;
@@ -66,10 +67,10 @@ class DropOrPasteEditProvider implements vscode.DocumentPasteEditProvider, vscod
return;
}
const pasteEdit = new vscode.DocumentPasteEdit(insert.insertText, vscode.l10n.t('Insert Image as Attachment'));
const pasteEdit = new vscode.DocumentPasteEdit(insert.insertText, vscode.l10n.t('Insert Image as Attachment'), DropOrPasteEditProvider.kind);
pasteEdit.yieldTo = [{ mimeType: MimeType.plain }];
pasteEdit.additionalEdit = insert.additionalEdit;
return pasteEdit;
return [pasteEdit];
}
async provideDocumentDropEdits(
@@ -86,7 +87,7 @@ class DropOrPasteEditProvider implements vscode.DocumentPasteEditProvider, vscod
const dropEdit = new vscode.DocumentDropEdit(insert.insertText);
dropEdit.yieldTo = [{ mimeType: MimeType.plain }];
dropEdit.additionalEdit = insert.additionalEdit;
dropEdit.label = vscode.l10n.t('Insert Image as Attachment');
dropEdit.title = vscode.l10n.t('Insert Image as Attachment');
return dropEdit;
}
@@ -299,14 +300,14 @@ export function notebookImagePasteSetup(): vscode.Disposable {
const provider = new DropOrPasteEditProvider();
return vscode.Disposable.from(
vscode.languages.registerDocumentPasteEditProvider(JUPYTER_NOTEBOOK_MARKDOWN_SELECTOR, provider, {
id: provider.id,
providedPasteEditKinds: [DropOrPasteEditProvider.kind],
pasteMimeTypes: [
MimeType.png,
MimeType.uriList,
],
}),
vscode.languages.registerDocumentDropEditProvider(JUPYTER_NOTEBOOK_MARKDOWN_SELECTOR, provider, {
id: provider.id,
providedDropEditKinds: [DropOrPasteEditProvider.kind],
dropMimeTypes: [
...Object.values(imageExtToMime),
MimeType.uriList,