mirror of
https://github.com/atom/atom.git
synced 2026-01-24 22:38:20 -05:00
These events will only be fired a single time at most, so we should clean up the listeners after that. This should help minimize accidental memory leaks.
111 lines
3.0 KiB
JavaScript
111 lines
3.0 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, visible, priority, className}, viewRegistry) {
|
|
this.destroyed = false
|
|
this.item = item
|
|
this.visible = visible
|
|
this.priority = priority
|
|
this.className = className
|
|
this.viewRegistry = viewRegistry
|
|
this.emitter = new Emitter()
|
|
if (this.visible == null) this.visible = true
|
|
if (this.priority == null) this.priority = 100
|
|
}
|
|
|
|
// 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)
|
|
}
|
|
}
|