You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

108 lines
3.2 KiB

'use strict';
import { ConfigurationChangeEvent, Disposable, languages } from 'vscode';
import { configuration } from '../configuration';
import { ContextKeys, setContext } from '../constants';
import { Container } from '../container';
import { Logger } from '../logger';
import {
DocumentBlameStateChangeEvent,
DocumentDirtyIdleTriggerEvent,
GitDocumentState,
} from '../trackers/gitDocumentTracker';
import { GitCodeLensProvider } from './codeLensProvider';
export class GitCodeLensController implements Disposable {
private _canToggle: boolean = false;
private _disposable: Disposable | undefined;
private _provider: GitCodeLensProvider | undefined;
private _providerDisposable: Disposable | undefined;
constructor(private readonly container: Container) {
this._disposable = Disposable.from(
container.onReady(this.onReady, this),
configuration.onDidChange(this.onConfigurationChanged, this),
);
}
dispose() {
this._providerDisposable?.dispose();
this._disposable?.dispose();
}
private onReady(): void {
this.onConfigurationChanged();
}
private onConfigurationChanged(e?: ConfigurationChangeEvent) {
if (
configuration.changed(e, 'codeLens') ||
configuration.changed(e, 'defaultDateFormat') ||
configuration.changed(e, 'defaultDateSource') ||
configuration.changed(e, 'defaultDateStyle')
) {
if (e != null) {
Logger.log('CodeLens config changed; resetting CodeLens provider');
}
const cfg = this.container.config.codeLens;
if (cfg.enabled && (cfg.recentChange.enabled || cfg.authors.enabled)) {
this.ensureProvider();
} else {
this._providerDisposable?.dispose();
this._provider = undefined;
}
this._canToggle = cfg.recentChange.enabled || cfg.authors.enabled;
void setContext(ContextKeys.DisabledToggleCodeLens, !this._canToggle);
}
}
private onBlameStateChanged(e: DocumentBlameStateChangeEvent<GitDocumentState>) {
// Only reset if we have saved, since the CodeLens won't naturally be re-rendered
if (this._provider === undefined || !e.blameable) return;
Logger.log('Blame state changed; resetting CodeLens provider');
this._provider.reset('saved');
}
private onDirtyIdleTriggered(e: DocumentDirtyIdleTriggerEvent<GitDocumentState>) {
if (this._provider === undefined || !e.document.isBlameable) return;
const maxLines = this.container.config.advanced.blame.sizeThresholdAfterEdit;
if (maxLines > 0 && e.document.lineCount > maxLines) return;
Logger.log('Dirty idle triggered; resetting CodeLens provider');
this._provider.reset('idle');
}
toggleCodeLens() {
if (!this._canToggle) return;
Logger.log('toggleCodeLens()');
if (this._provider !== undefined) {
this._providerDisposable?.dispose();
this._provider = undefined;
return;
}
this.ensureProvider();
}
private ensureProvider() {
if (this._provider !== undefined) {
this._provider.reset();
return;
}
this._providerDisposable?.dispose();
this._provider = new GitCodeLensProvider(this.container);
this._providerDisposable = Disposable.from(
languages.registerCodeLensProvider(GitCodeLensProvider.selector, this._provider),
this.container.tracker.onDidChangeBlameState(this.onBlameStateChanged, this),
this.container.tracker.onDidTriggerDirtyIdle(this.onDirtyIdleTriggered, this),
);
}
}