mirror of
https://github.com/atom/atom.git
synced 2026-04-28 03:01:47 -04:00
110 lines
3.1 KiB
JavaScript
110 lines
3.1 KiB
JavaScript
const { Emitter } = require('event-kit');
|
|
|
|
// Extended: A container representing a panel on the edges of the editor window.
|
|
// You should not create a `Panel` directly, instead use {Workspace::addTopPanel}
|
|
// and friends to add panels.
|
|
//
|
|
// Examples: [status-bar](https://github.com/atom/status-bar)
|
|
// and [find-and-replace](https://github.com/atom/find-and-replace) both use
|
|
// panels.
|
|
module.exports = class Panel {
|
|
/*
|
|
Section: Construction and Destruction
|
|
*/
|
|
|
|
constructor({ item, autoFocus, visible, priority, className }, viewRegistry) {
|
|
this.destroyed = false;
|
|
this.item = item;
|
|
this.autoFocus = autoFocus == null ? false : autoFocus;
|
|
this.visible = visible == null ? true : visible;
|
|
this.priority = priority == null ? 100 : priority;
|
|
this.className = className;
|
|
this.viewRegistry = viewRegistry;
|
|
this.emitter = new Emitter();
|
|
}
|
|
|
|
// Public: Destroy and remove this panel from the UI.
|
|
destroy() {
|
|
if (this.destroyed) return;
|
|
this.destroyed = true;
|
|
this.hide();
|
|
if (this.element) this.element.remove();
|
|
this.emitter.emit('did-destroy', this);
|
|
return this.emitter.dispose();
|
|
}
|
|
|
|
getElement() {
|
|
if (!this.element) {
|
|
this.element = document.createElement('atom-panel');
|
|
if (!this.visible) this.element.style.display = 'none';
|
|
if (this.className)
|
|
this.element.classList.add(...this.className.split(' '));
|
|
this.element.appendChild(this.viewRegistry.getView(this.item));
|
|
}
|
|
return this.element;
|
|
}
|
|
|
|
/*
|
|
Section: Event Subscription
|
|
*/
|
|
|
|
// Public: Invoke the given callback when the pane hidden or shown.
|
|
//
|
|
// * `callback` {Function} to be called when the pane is destroyed.
|
|
// * `visible` {Boolean} true when the panel has been shown
|
|
//
|
|
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
|
|
onDidChangeVisible(callback) {
|
|
return this.emitter.on('did-change-visible', callback);
|
|
}
|
|
|
|
// Public: Invoke the given callback when the pane is destroyed.
|
|
//
|
|
// * `callback` {Function} to be called when the pane is destroyed.
|
|
// * `panel` {Panel} this panel
|
|
//
|
|
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
|
|
onDidDestroy(callback) {
|
|
return this.emitter.once('did-destroy', callback);
|
|
}
|
|
|
|
/*
|
|
Section: Panel Details
|
|
*/
|
|
|
|
// Public: Returns the panel's item.
|
|
getItem() {
|
|
return this.item;
|
|
}
|
|
|
|
// Public: Returns a {Number} indicating this panel's priority.
|
|
getPriority() {
|
|
return this.priority;
|
|
}
|
|
|
|
getClassName() {
|
|
return this.className;
|
|
}
|
|
|
|
// Public: Returns a {Boolean} true when the panel is visible.
|
|
isVisible() {
|
|
return this.visible;
|
|
}
|
|
|
|
// Public: Hide this panel
|
|
hide() {
|
|
let wasVisible = this.visible;
|
|
this.visible = false;
|
|
if (this.element) this.element.style.display = 'none';
|
|
if (wasVisible) this.emitter.emit('did-change-visible', this.visible);
|
|
}
|
|
|
|
// Public: Show this panel
|
|
show() {
|
|
let wasVisible = this.visible;
|
|
this.visible = true;
|
|
if (this.element) this.element.style.display = null;
|
|
if (!wasVisible) this.emitter.emit('did-change-visible', this.visible);
|
|
}
|
|
};
|