mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-09-19 06:58:26 +03:00
b079194478
The startup script now uses a `Set` to manage `GitDiffView`s held in memory and destroy them when `deactivate` is called. There are now four major subscription blocks. 1. The outer subscriptions held by `activate`. 2. The per-editor subscriptions held within `activate`. 3. The per-editor repository event subscriptions held within each `GitDIffView` instance. 4. The per-editor modification event subscriptions held within each `GitDiffView` are only active when the editor content is bound to a valid git repository. Teardowns of any editor or the module now result in `disposal` of the respective editor's subscriptions or all subscriptions authored within the module. I removed some of `GitDiffView`'s unnecessary methods such as the `start`, `cancleUpdate`, `addDecoration` and `removeDecorations`; The last two methods were combined into the body of `updateDiffs`. `scheduleUpdate` now calls `requestAnimationFrame` instead of `setImmediate` because it's native, standard, and yields to other more important browser processes. I know Atom Core implements setImmediate, but rAF seems to work just as fast if not faster. The memory management of the editor markers and diffs have been joined using a WeakMap. When the diffs are destroyed, so too are the editor markers. Finally, I added the `destroy` method to handle the teardown of subscriptions and other destroyable objects contained within the `GitDiffViews` before object release.
92 lines
2.6 KiB
JavaScript
92 lines
2.6 KiB
JavaScript
'use babel';
|
|
|
|
import SelectListView from 'atom-select-list';
|
|
import repositoryForPath from './helpers';
|
|
|
|
export default class DiffListView {
|
|
constructor() {
|
|
this.selectListView = new SelectListView({
|
|
emptyMessage: 'No diffs in file',
|
|
items: [],
|
|
filterKeyForItem: diff => diff.lineText,
|
|
elementForItem: diff => {
|
|
const li = document.createElement('li');
|
|
li.classList.add('two-lines');
|
|
|
|
const primaryLine = document.createElement('div');
|
|
primaryLine.classList.add('primary-line');
|
|
primaryLine.textContent = diff.lineText;
|
|
li.appendChild(primaryLine);
|
|
|
|
const secondaryLine = document.createElement('div');
|
|
secondaryLine.classList.add('secondary-line');
|
|
secondaryLine.textContent = `-${diff.oldStart},${diff.oldLines} +${
|
|
diff.newStart
|
|
},${diff.newLines}`;
|
|
li.appendChild(secondaryLine);
|
|
|
|
return li;
|
|
},
|
|
didConfirmSelection: diff => {
|
|
this.cancel();
|
|
const bufferRow = diff.newStart > 0 ? diff.newStart - 1 : diff.newStart;
|
|
this.editor.setCursorBufferPosition([bufferRow, 0], {
|
|
autoscroll: true
|
|
});
|
|
this.editor.moveToFirstCharacterOfLine();
|
|
},
|
|
didCancelSelection: () => {
|
|
this.cancel();
|
|
}
|
|
});
|
|
this.selectListView.element.classList.add('diff-list-view');
|
|
this.panel = atom.workspace.addModalPanel({
|
|
item: this.selectListView,
|
|
visible: false
|
|
});
|
|
}
|
|
|
|
attach() {
|
|
this.previouslyFocusedElement = document.activeElement;
|
|
this.selectListView.reset();
|
|
this.panel.show();
|
|
this.selectListView.focus();
|
|
}
|
|
|
|
cancel() {
|
|
this.panel.hide();
|
|
if (this.previouslyFocusedElement) {
|
|
this.previouslyFocusedElement.focus();
|
|
this.previouslyFocusedElement = null;
|
|
}
|
|
}
|
|
|
|
destroy() {
|
|
this.cancel();
|
|
this.panel.destroy();
|
|
return this.selectListView.destroy();
|
|
}
|
|
|
|
async toggle() {
|
|
const editor = atom.workspace.getActiveTextEditor();
|
|
if (this.panel.isVisible()) {
|
|
this.cancel();
|
|
} else if (editor) {
|
|
this.editor = editor;
|
|
const repository = await repositoryForPath(this.editor.getPath());
|
|
let diffs = repository
|
|
? repository.getLineDiffs(this.editor.getPath(), this.editor.getText())
|
|
: [];
|
|
if (!diffs) diffs = [];
|
|
for (let diff of diffs) {
|
|
const bufferRow = diff.newStart > 0 ? diff.newStart - 1 : diff.newStart;
|
|
const lineText = this.editor.lineTextForBufferRow(bufferRow);
|
|
diff.lineText = lineText ? lineText.trim() : '';
|
|
}
|
|
|
|
await this.selectListView.update({ items: diffs });
|
|
this.attach();
|
|
}
|
|
}
|
|
}
|