mirror of
https://github.com/atom/atom.git
synced 2026-01-24 22:38:20 -05:00
90 lines
2.6 KiB
JavaScript
90 lines
2.6 KiB
JavaScript
const SelectListView = require('atom-select-list')
|
|
const { repositoryForPath } = require('./helpers')
|
|
|
|
module.exports = 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 = 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()
|
|
}
|
|
}
|
|
}
|