import {observable, computed} from "mobx"; import React = require("react"); import {DocumentView} from "./views/nodes/DocumentView"; import {SelectionManager} from "./util/SelectionManager"; import {observer} from "mobx-react"; import './DocumentDecorations.scss' @observer export class DocumentDecorations extends React.Component { static Instance: DocumentDecorations constructor(props: Readonly<{}>) { super(props) DocumentDecorations.Instance = this } @computed get x(): number { return SelectionManager.SelectedDocuments().reduce((left, element) => Math.min(element.TransformToScreenPoint(0, 0).ScreenX, left), Number.MAX_VALUE); } @computed get y(): number { return SelectionManager.SelectedDocuments().reduce((top, element) => Math.min(element.TransformToScreenPoint(0, 0).ScreenY, top), Number.MAX_VALUE); } @computed get height(): number { return (SelectionManager.SelectedDocuments().reduce((bottom, element) => Math.max(element.TransformToScreenPoint(0, element.height).ScreenY, bottom), Number.MIN_VALUE)) - this.y; } @computed get width(): number { return SelectionManager.SelectedDocuments().reduce((right, element) => Math.max(element.TransformToScreenPoint(element.width, 0).ScreenX, right), Number.MIN_VALUE) - this.x; } private _resizer = "" private _isPointerDown = false; @observable private _opacity = 1; @computed get opacity(): number { return this._opacity } set opacity(o: number) { this._opacity = Math.min(Math.max(0, o), 1) } onPointerDown = (e: React.PointerEvent): void => { e.stopPropagation(); if (e.button === 0) { this._isPointerDown = true; this._resizer = e.currentTarget.id; document.removeEventListener("pointermove", this.onPointerMove); document.addEventListener("pointermove", this.onPointerMove); document.removeEventListener("pointerup", this.onPointerUp); document.addEventListener("pointerup", this.onPointerUp); } } onPointerMove = (e: PointerEvent): void => { e.stopPropagation(); e.preventDefault(); if (!this._isPointerDown) { return; } let dX = 0, dY = 0, dW = 0, dH = 0; switch (this._resizer) { case "": break; case "documentDecorations-topLeftResizer": dX = -1 dY = -1 dW = -(e.movementX) dH = -(e.movementY) break; case "documentDecorations-topRightResizer": dW = e.movementX dY = -1 dH = -(e.movementY) break; case "documentDecorations-topResizer": dY = -1 dH = -(e.movementY) break; case "documentDecorations-bottomLeftResizer": dX = -1 dW = -(e.movementX) dH = e.movementY break; case "documentDecorations-bottomRightResizer": dW = e.movementX dH = e.movementY break; case "documentDecorations-bottomResizer": dH = e.movementY break; case "documentDecorations-leftResizer": dX = -1 dW = -(e.movementX) break; case "documentDecorations-rightResizer": dW = e.movementX break; } SelectionManager.SelectedDocuments().forEach(element => { const rect = element.screenRect; if (rect.width !== 0) { let scale = element.width / rect.width; let actualdW = Math.max(element.width + (dW * scale), 20); let actualdH = Math.max(element.height + (dH * scale), 20); element.x += dX * (actualdW - element.width); element.y += dY * (actualdH - element.height); element.width = actualdW; element.height = actualdH; } }) } onPointerUp = (e: PointerEvent): void => { e.stopPropagation(); if (e.button === 0) { e.preventDefault(); this._isPointerDown = false; document.removeEventListener("pointermove", this.onPointerMove); document.removeEventListener("pointerup", this.onPointerUp); } } render() { return (