mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-09-11 11:15:24 +03:00
75 lines
2.6 KiB
JavaScript
75 lines
2.6 KiB
JavaScript
const {Disposable} = require('atom');
|
|
|
|
module.exports =
|
|
class CursorPositionView {
|
|
constructor() {
|
|
this.viewUpdatePending = false;
|
|
|
|
this.element = document.createElement('status-bar-cursor');
|
|
this.element.classList.add('cursor-position', 'inline-block');
|
|
this.goToLineLink = document.createElement('a');
|
|
this.goToLineLink.classList.add('inline-block');
|
|
this.element.appendChild(this.goToLineLink);
|
|
|
|
this.formatString = atom.config.get('status-bar.cursorPositionFormat') ?? '%L:%C';
|
|
|
|
this.activeItemSubscription = atom.workspace.onDidChangeActiveTextEditor(activeEditor => this.subscribeToActiveTextEditor());
|
|
|
|
this.subscribeToConfig();
|
|
this.subscribeToActiveTextEditor();
|
|
|
|
this.tooltip = atom.tooltips.add(this.element, {title: () => `Line ${this.row}, Column ${this.column}`});
|
|
|
|
this.handleClick();
|
|
}
|
|
|
|
destroy() {
|
|
this.activeItemSubscription.dispose();
|
|
this.cursorSubscription?.dispose();
|
|
this.tooltip.dispose();
|
|
this.configSubscription?.dispose();
|
|
this.clickSubscription.dispose();
|
|
this.updateSubscription?.dispose();
|
|
}
|
|
|
|
subscribeToActiveTextEditor() {
|
|
this.cursorSubscription?.dispose();
|
|
const selectionsMarkerLayer = atom.workspace.getActiveTextEditor()?.selectionsMarkerLayer;
|
|
this.cursorSubscription = selectionsMarkerLayer?.onDidUpdate(this.scheduleUpdate.bind(this));
|
|
this.scheduleUpdate();
|
|
}
|
|
|
|
subscribeToConfig() {
|
|
this.configSubscription?.dispose();
|
|
this.configSubscription = atom.config.observe('status-bar.cursorPositionFormat', value => {
|
|
this.formatString = value != null ? value : '%L:%C';
|
|
this.scheduleUpdate();
|
|
});
|
|
}
|
|
|
|
handleClick() {
|
|
const clickHandler = () => atom.commands.dispatch(atom.views.getView(atom.workspace.getActiveTextEditor()), 'go-to-line:toggle');
|
|
this.element.addEventListener('click', clickHandler);
|
|
this.clickSubscription = new Disposable(() => this.element.removeEventListener('click', clickHandler));
|
|
}
|
|
|
|
scheduleUpdate() {
|
|
if (this.viewUpdatePending) { return; }
|
|
|
|
this.viewUpdatePending = true;
|
|
this.updateSubscription = atom.views.updateDocument(() => {
|
|
const position = atom.workspace.getActiveTextEditor()?.getCursorBufferPosition();
|
|
this.viewUpdatePending = false;
|
|
if (position) {
|
|
this.row = position.row + 1;
|
|
this.column = position.column + 1;
|
|
this.goToLineLink.textContent = this.formatString.replace('%L', this.row).replace('%C', this.column);
|
|
this.element.classList.remove('hide');
|
|
} else {
|
|
this.goToLineLink.textContent = '';
|
|
this.element.classList.add('hide');
|
|
}
|
|
});
|
|
}
|
|
}
|