188 lines
4.7 KiB
JavaScript
188 lines
4.7 KiB
JavaScript
|
import { Points } from '../../utils.js'
|
||
|
|
||
|
/* globals PIXI */
|
||
|
|
||
|
export class FlagType {
|
||
|
static get bottomLeft() {
|
||
|
return { x: 1, y: -1 }
|
||
|
}
|
||
|
static get bottomRight() {
|
||
|
return { x: -1, y: -1 }
|
||
|
}
|
||
|
static get topLeft() {
|
||
|
return { x: -1, y: 1 }
|
||
|
}
|
||
|
static get topRight() {
|
||
|
return { x: 1, y: 1 }
|
||
|
}
|
||
|
|
||
|
static toString(flagType) {
|
||
|
let str = ''
|
||
|
if (flagType.x && flagType.y) {
|
||
|
if (flagType.y == 1) str += 'bottom'
|
||
|
else if (flagType.y == -1) str += 'top'
|
||
|
else str += '_INVALID_Y_'
|
||
|
|
||
|
if (flagType.x == 1) str += 'Right'
|
||
|
else if (flagType.x == -1) str += 'Left'
|
||
|
else str += '_INVALID_X_'
|
||
|
} else str = 'Invalid FlagType: ' + flagType.toString()
|
||
|
|
||
|
return str
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export class FlagPolygon extends PIXI.Polygon {
|
||
|
constructor({
|
||
|
type = FlagType.bottomLeft,
|
||
|
width = 100,
|
||
|
height = 30,
|
||
|
notchSize = 10,
|
||
|
notchWidth = null,
|
||
|
notchHeight = null,
|
||
|
originOffset = { x: 0, y: 0 }
|
||
|
} = {}) {
|
||
|
let points = []
|
||
|
|
||
|
let dimensions = { x: width, y: height }
|
||
|
dimensions = Points.multiply(dimensions, type)
|
||
|
|
||
|
notchWidth = notchWidth == null ? notchSize : notchWidth
|
||
|
notchHeight = notchHeight == null ? notchSize : notchHeight
|
||
|
|
||
|
notchSize = { x: notchWidth, y: notchHeight }
|
||
|
notchSize = Points.multiply(notchSize, type)
|
||
|
|
||
|
originOffset = Points.multiply(originOffset, type)
|
||
|
|
||
|
let point = new PIXI.Point(originOffset.x, originOffset.y)
|
||
|
points.push(point.clone())
|
||
|
|
||
|
point.y += notchSize.y
|
||
|
points.push(point.clone())
|
||
|
|
||
|
point.y += dimensions.y
|
||
|
points.push(point.clone())
|
||
|
|
||
|
point.x += dimensions.x
|
||
|
points.push(point.clone())
|
||
|
|
||
|
point.y -= dimensions.y
|
||
|
points.push(point.clone())
|
||
|
|
||
|
point.x -= dimensions.x - notchSize.x
|
||
|
points.push(point.clone())
|
||
|
|
||
|
// close polygon
|
||
|
points.push(points[0].clone())
|
||
|
|
||
|
super(points)
|
||
|
|
||
|
this.type = type
|
||
|
this.dimensions = dimensions
|
||
|
this.notchSize = notchSize
|
||
|
this.originOffset = originOffset
|
||
|
}
|
||
|
|
||
|
getPoint(i) {
|
||
|
if (i >= 0) {
|
||
|
let idx = i * 2
|
||
|
return [this.points[idx], this.points[idx + 1]]
|
||
|
} else {
|
||
|
let idx = (Math.floor(this.points.length / 2) + i) * 2
|
||
|
return [this.points[idx], this.points[idx + 1]]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
get notch() {
|
||
|
let points = [this.getPoint(0), this.getPoint(1), this.getPoint(-2), this.getPoint(0)]
|
||
|
let notchPolygon = []
|
||
|
|
||
|
points.forEach(point => {
|
||
|
notchPolygon = notchPolygon.concat(point)
|
||
|
})
|
||
|
|
||
|
return notchPolygon
|
||
|
}
|
||
|
get rect() {
|
||
|
let points = [this.getPoint(1), this.getPoint(2), this.getPoint(3), this.getPoint(4), this.getPoint(1)]
|
||
|
|
||
|
let rectPolygon = []
|
||
|
points.forEach(point => {
|
||
|
rectPolygon = rectPolygon.concat(point)
|
||
|
})
|
||
|
return rectPolygon
|
||
|
}
|
||
|
|
||
|
placeText(text, padding) {
|
||
|
text.position = Points.add(this.originOffset, { x: 0, y: this.notchSize.y })
|
||
|
padding = Points.multiply(padding, this.type)
|
||
|
text.position = Points.add(text.position, padding)
|
||
|
|
||
|
if (this.type.y == -1) text.position.y -= text.height
|
||
|
|
||
|
if (this.type.x == -1) text.position.x -= text.width
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export class Flag extends PIXI.Graphics {
|
||
|
constructor(
|
||
|
{
|
||
|
type = FlagType.bottomLeft,
|
||
|
width = 100,
|
||
|
height = 30,
|
||
|
notchSize = 10,
|
||
|
notchWidth = null,
|
||
|
notchHeight = null,
|
||
|
originOffset = { x: 0, y: 0 }
|
||
|
} = {},
|
||
|
nativeLines = false
|
||
|
) {
|
||
|
super(nativeLines)
|
||
|
|
||
|
this.flagPolygon = new FlagPolygon({
|
||
|
type,
|
||
|
width,
|
||
|
height,
|
||
|
notchSize,
|
||
|
notchWidth,
|
||
|
notchHeight,
|
||
|
originOffset
|
||
|
})
|
||
|
|
||
|
this.draw()
|
||
|
}
|
||
|
|
||
|
draw() {
|
||
|
this.drawPolygon(this.flagPolygon)
|
||
|
}
|
||
|
|
||
|
get typeName() {
|
||
|
return FlagType.toString(this.type)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export class Label extends PIXI.Graphics {
|
||
|
constructor(text, textStyle = new PIXI.TextStyle(), nativeLines = false) {
|
||
|
super(nativeLines)
|
||
|
this._text = new PIXI.Text(text, textStyle)
|
||
|
this.addChild(this._text)
|
||
|
}
|
||
|
|
||
|
get text() {
|
||
|
return this._text
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export class FlagLabel extends Label {
|
||
|
constructor(text, textStyle, flagStyle, nativeLines = false) {
|
||
|
super(text, textStyle, nativeLines)
|
||
|
this.flagPolygon = new FlagPolygon(flagStyle)
|
||
|
this.draw()
|
||
|
}
|
||
|
|
||
|
draw() {
|
||
|
this.drawPolygon(this.flagPolygon)
|
||
|
}
|
||
|
}
|