129 lines
4.1 KiB
JavaScript
129 lines
4.1 KiB
JavaScript
import Theme from './theme.js'
|
|
import { InteractivePopup } from './popup.js'
|
|
|
|
/**
|
|
* Class that represents a Message. A message pops up and disappears after a specific amount of time.
|
|
*
|
|
* @example
|
|
* // Create the PixiJS App
|
|
* const app = new PIXIApp({
|
|
* view: canvas,
|
|
* width: 900,
|
|
* height: 250
|
|
* }).setup().run()
|
|
*
|
|
* // Create a button
|
|
* let button = new Button({
|
|
* label: 'Click me',
|
|
* action: e => {
|
|
* const message = new Message({
|
|
* app: app,
|
|
* header: 'Header',
|
|
* content: 'Text.'
|
|
* })
|
|
* app.scene.addChild(message)
|
|
* }
|
|
* })
|
|
*
|
|
* // Add the button to the scene
|
|
* app.scene.addChild(button)
|
|
*
|
|
* @class
|
|
* @extends InteractivePopup
|
|
* @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/message.html|DocTest}
|
|
*/
|
|
export default class Message extends InteractivePopup {
|
|
/**
|
|
* Creates an instance of a Message.
|
|
*
|
|
* @constructor
|
|
* @param {object} [opts] - An options object to specify to style and behaviour of the message.
|
|
* @param {PIXIApp} [opts.app=window.app] - The PIXIApp where this message belongs to.
|
|
* @param {boolean} [opts.closeButton=false] - Should a close button be displayed in the upper right corner?
|
|
* @param {number} [opts.minWidth=280] - The minimum width of the message box. Automatically expands with the content.
|
|
* @param {number} [opts.minHeight=100] - The minimum height of the message box. Automatically expands with the content.
|
|
* @param {number} [opts.margin=Theme.margin] - The outer spacing of the message box.
|
|
* @param {string} [opts.align=right] - The horizontal position of the message box relative to the app. Possible
|
|
* values are left, center, right.
|
|
* @param {string} [opts.verticalAlign=top] - The vertical position of the message box relative to the app. Possible
|
|
* values are top, middle, bottom.
|
|
* @param {number} [opts.duration=5] - The duration in seconds when the message box should disappear.
|
|
* @param {boolean} [opts.autoClose=true] - Should the message box be closed automatically?
|
|
* @param {number} [opts.closeDuration=Theme.fast] - The duration in seconds of the closing of the message box.
|
|
*/
|
|
constructor(opts = {}) {
|
|
const theme = Theme.fromString(opts.theme)
|
|
|
|
opts = Object.assign(
|
|
{},
|
|
{
|
|
app: window.app,
|
|
closeButton: false,
|
|
minWidth: 280,
|
|
minHeight: 100,
|
|
margin: theme.margin,
|
|
align: 'right', // left, center, right
|
|
verticalAlign: 'top', // top, middle, bottom
|
|
duration: 5,
|
|
autoClose: true,
|
|
closeDuration: theme.fast
|
|
},
|
|
opts
|
|
)
|
|
|
|
super(opts)
|
|
}
|
|
|
|
/**
|
|
* Relayouts the position of the message box.
|
|
*
|
|
* @return {Message} Returns the message box for chaining.
|
|
*/
|
|
layout() {
|
|
super.layout()
|
|
|
|
// horizontal
|
|
switch (this.opts.align) {
|
|
case 'left':
|
|
this.x = this.opts.margin
|
|
break
|
|
case 'center':
|
|
this.x = this.opts.app.size.width / 2 - this.width / 2
|
|
break
|
|
case 'right':
|
|
this.x =
|
|
this.opts.app.size.width - this.opts.margin - this.width
|
|
break
|
|
}
|
|
|
|
// vertical
|
|
switch (this.opts.verticalAlign) {
|
|
case 'top':
|
|
this.y = this.opts.margin
|
|
break
|
|
case 'middle':
|
|
this.y = this.opts.app.size.height / 2 - this.height / 2
|
|
break
|
|
case 'bottom':
|
|
this.y =
|
|
this.opts.app.size.height - this.opts.margin - this.height
|
|
break
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Shows the message box.
|
|
*
|
|
* @private
|
|
*/
|
|
show() {
|
|
super.show()
|
|
|
|
if (this.opts.autoClose) {
|
|
window.setTimeout(() => {
|
|
this.hide()
|
|
}, this.opts.duration * 1000)
|
|
}
|
|
}
|
|
}
|