mirror of
https://github.com/atom/atom.git
synced 2026-01-25 06:48:28 -05: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)
|
|
}
|
|
}
|