From ca2c1073246e7fcbdc76f4a665bfd0f76cb460e0 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 18 Oct 2017 10:06:02 +0200 Subject: [PATCH] deco - update decorations when gitignore-file changes --- extensions/git/src/decorationProvider.ts | 8 ++++--- src/vs/vscode.proposed.d.ts | 2 +- .../workbench/api/node/extHostDecorations.ts | 2 +- .../decorations/browser/decorationsService.ts | 22 ++++++++++++++----- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/extensions/git/src/decorationProvider.ts b/extensions/git/src/decorationProvider.ts index 5ae257473b3..19ef25fb811 100644 --- a/extensions/git/src/decorationProvider.ts +++ b/extensions/git/src/decorationProvider.ts @@ -5,10 +5,11 @@ 'use strict'; -import { window, Uri, Disposable, Event, EventEmitter, DecorationData, DecorationProvider, ThemeColor } from 'vscode'; +import { window, workspace, Uri, Disposable, Event, EventEmitter, DecorationData, DecorationProvider, ThemeColor } from 'vscode'; import { Repository, GitResourceGroup } from './repository'; import { Model } from './model'; import { debounce } from './decorators'; +import { filterEvent } from './util'; class GitIgnoreDecorationProvider implements DecorationProvider { @@ -20,8 +21,9 @@ class GitIgnoreDecorationProvider implements DecorationProvider { constructor(private repository: Repository) { this.disposables.push( - window.registerDecorationProvider(this, '.gitignore') - //todo@joh -> events when the ignore status actually changes, not when the file changes + window.registerDecorationProvider(this, '.gitignore'), + filterEvent(workspace.onDidSaveTextDocument, e => e.fileName.endsWith('.gitignore'))(_ => this._onDidChangeDecorations.fire()) + //todo@joh -> events when the ignore status actually changes, not only when the file changes ); } diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index d48b0f9020a..63ebd06f1b4 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -182,7 +182,7 @@ declare module 'vscode' { } export interface DecorationProvider { - onDidChangeDecorations: Event; + onDidChangeDecorations: Event; provideDecoration(uri: Uri, token: CancellationToken): ProviderResult; } diff --git a/src/vs/workbench/api/node/extHostDecorations.ts b/src/vs/workbench/api/node/extHostDecorations.ts index ad428987404..971896c96dd 100644 --- a/src/vs/workbench/api/node/extHostDecorations.ts +++ b/src/vs/workbench/api/node/extHostDecorations.ts @@ -28,7 +28,7 @@ export class ExtHostDecorations implements ExtHostDecorationsShape { this._proxy.$registerDecorationProvider(handle, label); const listener = provider.onDidChangeDecorations(e => { - this._proxy.$onDidChange(handle, Array.isArray(e) ? e : [e]); + this._proxy.$onDidChange(handle, !e ? null : Array.isArray(e) ? e : [e]); }); return new Disposable(() => { diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index a6320b0fe65..63992705c3d 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -221,12 +221,21 @@ class DecorationProviderWrapper { constructor( private readonly _provider: IDecorationsProvider, - private readonly _emitter: Emitter + private readonly _uriEmitter: Emitter, + private readonly _flushEmitter: Emitter ) { this._dispoable = this._provider.onDidChange(uris => { - for (const uri of uris) { - this.data.delete(uri.toString()); - this._fetchData(uri); + if (!uris) { + // flush event -> drop all data, can affect everything + this.data.clear(); + this._flushEmitter.fire({ affectsResource() { return true; } }); + + } else { + // selective changes -> drop for resource, fetch again, send event + for (const uri of uris) { + this.data.delete(uri.toString()); + this._fetchData(uri); + } } }); } @@ -293,7 +302,7 @@ class DecorationProviderWrapper { private _keepItem(uri: URI, data: IDecorationData): IDecorationData { let deco = data ? data : null; this.data.set(uri.toString(), deco); - this._emitter.fire(uri); + this._uriEmitter.fire(uri); return deco; } } @@ -345,7 +354,8 @@ export class FileDecorationsService implements IDecorationsService { const wrapper = new DecorationProviderWrapper( provider, - this._onDidChangeDecorationsDelayed + this._onDidChangeDecorationsDelayed, + this._onDidChangeDecorations ); const remove = this._data.push(wrapper);