import * as Pixi from "pixi.js";
import { PixiPointFrom } from "../../lib/pixi/pixify";
import { Vector2 } from "../../lib/util/geometry/vector2";
import { engageLifecycle, LifecycleHandlerBase } from "./LifecycleHandler";
export type TooltipInfo = {
text: string;
position: Vector2 | undefined; // should be nonnull if visible === true
visible: boolean;
}
type Props = {
offset: Vector2,
} & TooltipInfo;
type State = {}
class TooltipComponent extends LifecycleHandlerBase<Props, State> {
public container: Pixi.Container;
public state: State;
private text: Pixi.Text;
private box?: Pixi.Graphics;
constructor(props: Props) {
super(props);
this.container = new Pixi.Container();
this.container.sortableChildren = true;
this.state = {};
this.text = new Pixi.Text(props.text, {
fontFamily: 'PixelMix',
padding: 4, // https://github.com/pixijs/pixi.js/issues/4500 -- otherwise on first load the text bounding box is calculated to be too small and the tops of the f's get cut off
fontSize: 26, // use 26 then scale down 50% results in sharper letters than 13
// align: 'center'
});
this.text.scale = PixiPointFrom(new Vector2(0.5, 0.5));
this.text.x = 10;
this.text.y = 10;
this.text.zIndex = 2;
this.container.addChild(this.text);
// this.box = new Pixi.Graphics();
// this.box.lineStyle(1, 0x222222, 1);
// this.box.beginFill(0xEEEEEE);
// this.box.drawRoundedRect(0, 0, this.text.width + 18, this.text.height + 18, 4);
// this.box.zIndex = 0;
// this.container.addChild(this.box);
}
protected shouldUpdate(prevProps: Props, prevState: State, props: Props, state: State): boolean {
for (let key of (Object.keys(prevProps) as (keyof Props)[])) {
if (prevProps[key] !== props[key]) {
return true;
}
}
return false;
}
protected renderSelf(props: Props) {
this.container.visible = props.visible;
this.container.position = PixiPointFrom(props.offset.add(props?.position || Vector2.Zero));
this.text.text = props.text;
if (this.box) {
this.container.removeChild(this.box);
}
this.box = new Pixi.Graphics();
this.box.lineStyle(1, 0x222222, 1);
this.box.beginFill(0xEEEEEE);
this.box.drawRoundedRect(0, 0, this.text.width + 18, this.text.height + 18, 4);
this.box.zIndex = 0;
this.container.addChild(this.box);
}
}
const wrapped = engageLifecycle(TooltipComponent);
// eslint-disable-next-line
type wrapped = TooltipComponent;
export { wrapped as TooltipComponent };
export type { Props as TooltipComponentProps };