forked from public/foundryvtt-reve-de-dragon
		
	Passage den eventMode static permet de ne pas faire disparaître le tooltip.
		
			
				
	
	
		
			144 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { RdDTMRDialog } from "../rdd-tmr-dialog.js";
 | |
| import { tmrConstants, tmrTokenZIndex } from "../tmr-constants.js";
 | |
| import { TMRUtility } from "../tmr-utility.js";
 | |
| 
 | |
| export const tooltipStyle = new PIXI.TextStyle({
 | |
|   fontFamily: 'CaslonAntique',
 | |
|   fontSize: 18,
 | |
|   fill: '#FFFFFF',
 | |
|   stroke: '#000000',
 | |
|   strokeThickness: 3
 | |
| });
 | |
| 
 | |
| 
 | |
| export class PixiTMR {
 | |
| 
 | |
|   static textures = []
 | |
| 
 | |
|   constructor(tmrObject, pixiApp) {
 | |
|     this.tmrObject = tmrObject;
 | |
|     this.pixiApp = pixiApp ?? tmrObject.pixiApp;
 | |
|     this.pixiApp.stage.sortableChildren = true;
 | |
|     this.callbacksOnAnimate = [];
 | |
|   }
 | |
| 
 | |
|   async load(onLoad = (loader, resources) => { }) {
 | |
|     // WIP - Deprecated since v7 : let loader = new PIXI.Loader();
 | |
|     for (const [name, img] of Object.entries(PixiTMR.textures)) {
 | |
|       const texture = await PIXI.Assets.load(img);
 | |
|       let image = PIXI.Sprite.from(texture);
 | |
|     }
 | |
|     onLoad();
 | |
|     for (let onAnimate of this.callbacksOnAnimate) {
 | |
|       onAnimate();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   static getImgFromCode(code) {
 | |
|     return PixiTMR.textures[code]
 | |
|   }
 | |
| 
 | |
|   static register(name, img) {
 | |
|     PixiTMR.textures[name] = img;
 | |
|   }
 | |
| 
 | |
|   animate(animation = pixiApp => { }) {
 | |
|     this.callbacksOnAnimate.push(() => animation(this.pixiApp));
 | |
|   }
 | |
| 
 | |
|   sprite(code, options = {}) {
 | |
|     let img = PixiTMR.getImgFromCode(code)
 | |
|     const texture = PIXI.utils.TextureCache[img];
 | |
|     if (!texture) {
 | |
|       console.error("Texture manquante", code, PIXI.utils.TextureCache)
 | |
|       return;
 | |
|     }
 | |
|     let sprite = new PIXI.Sprite(texture);
 | |
|     sprite.width = options.taille ?? tmrConstants.half;
 | |
|     sprite.height = options.taille ?? tmrConstants.half;
 | |
|     sprite.anchor.set(0.5);
 | |
|     if (options.color) {
 | |
|       sprite.tint = options.color;
 | |
|     }
 | |
|     sprite.zIndex = options.zIndex ?? tmrTokenZIndex.casehumide + 1;
 | |
|     sprite.alpha = options.alpha ?? 0.75;
 | |
|     sprite.decallage = options.decallage ?? tmrConstants.center;
 | |
|     this.pixiApp.stage.addChild(sprite);
 | |
|     return sprite;
 | |
|   }
 | |
| 
 | |
|   circle(name, options = {}) {
 | |
|     let sprite = new PIXI.Graphics();
 | |
|     sprite.beginFill(options.color, options.opacity);
 | |
|     sprite.drawCircle(0, 0, (options.taille ?? 12) / 2);
 | |
|     sprite.endFill();
 | |
|     sprite.decallage = options.decallage ?? tmrConstants.topLeft;
 | |
|     this.pixiApp.stage.addChild(sprite);
 | |
|     return sprite;
 | |
|   }
 | |
| 
 | |
|   addTooltip(sprite, computeTooltip) {
 | |
|     sprite.tooltip = new PIXI.Text('', tooltipStyle);
 | |
|     sprite.tooltip.zIndex = tmrTokenZIndex.tooltip;
 | |
|     sprite.isOver = false;
 | |
|     sprite.eventMode = 'static';
 | |
|     sprite
 | |
|       .on('pointermove', event => this.onPointerMove(event, sprite, computeTooltip))
 | |
|       .on('pointerdown', event => this.onClickBackground(event))
 | |
|       .on('pointerover', event => this.onShowTooltip(event, sprite))
 | |
|       .on('pointerout', event => this.onHideTooltip(event, sprite));
 | |
|   }
 | |
| 
 | |
|   onClickBackground(event) {
 | |
|     if (!this.viewOnly) {
 | |
|       this.tmrObject.onClickTMR(event)
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   onPointerMove(event, sprite, computeTooltip) {
 | |
|     if (sprite.isOver && sprite.tooltip) {
 | |
|       var { x, y } = TMRUtility.computeEventPosition(event);
 | |
|       const oddq = TMRUtility.computeOddq(x, y);
 | |
| 
 | |
|       sprite.tooltip.x = x + (oddq.col > 8 ? - 3 * tmrConstants.full : tmrConstants.half)
 | |
|       sprite.tooltip.y = y + (oddq.row > 10 ? - tmrConstants.half : tmrConstants.half)
 | |
|       sprite.tooltip.text = computeTooltip(event, sprite);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   onShowTooltip(event, sprite) {
 | |
|     if (sprite.tooltip) {
 | |
|       if (!sprite.isOver) {
 | |
|         sprite.tooltip.x = sprite.x;
 | |
|         sprite.tooltip.y = sprite.y;
 | |
|         this.pixiApp.stage.addChild(sprite.tooltip);
 | |
|       }
 | |
|       sprite.isOver = true;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   onHideTooltip(event, sprite) {
 | |
|     if (sprite.tooltip) {
 | |
|       if (sprite.isOver) {
 | |
|         this.pixiApp.stage.removeChild(sprite.tooltip);
 | |
|       }
 | |
|       sprite.isOver = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   setPosition(sprite, oddq) {
 | |
|     let decallagePairImpair = (oddq.col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y;
 | |
|     let dx = (sprite.decallage == undefined) ? 0 : sprite.decallage.x;
 | |
|     let dy = (sprite.decallage == undefined) ? 0 : sprite.decallage.y;
 | |
|     sprite.x = tmrConstants.gridx + (oddq.col * tmrConstants.cellw) + dx;
 | |
|     sprite.y = tmrConstants.gridy + (oddq.row * tmrConstants.cellh) + dy + decallagePairImpair;
 | |
|   }
 | |
| 
 | |
|   getCaseRectangle(oddq) {
 | |
|     let decallagePairImpair = (oddq.col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y;
 | |
|     let x = tmrConstants.gridx + (oddq.col * tmrConstants.cellw) - (tmrConstants.cellw / 2);
 | |
|     let y = tmrConstants.gridy + (oddq.row * tmrConstants.cellh) - (tmrConstants.cellh / 2) + decallagePairImpair;
 | |
|     return { x: x, y: y, w: tmrConstants.cellw, h: tmrConstants.cellh };
 | |
|   }
 | |
| 
 | |
| } |