Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
import { RelativePosition } from "@bentley/ui-abstract";
import { ToolAssistanceInstruction } from "@bentley/imodeljs-frontend";
import { Timer, BodyText, Point, PointProps, Icon } from "@bentley/ui-core";
import { CursorInformation, CursorPopupManager, CursorUpdatedEventArgs } from "../../../ui-framework";
import "./CursorPrompt.scss";
/** @alpha */
export class CursorPrompt {
private _timeOut: number;
private _fadeOut: boolean;
private _timer: Timer;
private _relativePosition = RelativePosition.BottomRight;
private _offset: Point = new Point(20, 20);
private _popupId = "cursor-prompt";
constructor(timeOut: number, fadeOut: boolean) {
this._timeOut = timeOut;
this._fadeOut = fadeOut;
this._timer = new Timer(timeOut);
}
public display(toolIconSpec: string, instruction: ToolAssistanceInstruction, offset: PointProps = { x: 20, y: 20 }, relativePosition: RelativePosition = RelativePosition.BottomRight) {
if (!instruction.text) {
// istanbul ignore else
if (this._timer.isRunning)
this.close(false);
return;
}
iconSpec: "icon-placeholder", labelKey: "SampleApp:buttons.addCursorPopups", execute: async () => {
CursorPopupManager.open("testR1", Hello World!, CursorInformation.cursorPosition, new Point(40, 20), RelativePosition.Right, 10);
CursorPopupManager.open("testBR1", Hello World!, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.BottomRight, 10);
CursorPopupManager.open("testB1", Hello World!, CursorInformation.cursorPosition, new Point(20, 85), RelativePosition.Bottom, 10);
CursorPopupManager.open("testBL1", Hello World!, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.BottomLeft, 10);
CursorPopupManager.open("testL1", Hello World!, CursorInformation.cursorPosition, new Point(40, 20), RelativePosition.Left, 10);
CursorPopupManager.open("testTL1", Hello World!, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.TopLeft, 10);
CursorPopupManager.open("testT1", Hello World!, CursorInformation.cursorPosition, new Point(20, 100), RelativePosition.Top, 10);
},
});
iconSpec: "icon-placeholder", labelKey: "SampleApp:buttons.addCursorPopups", execute: async () => {
CursorPopupManager.open("testR1", Hello World!, CursorInformation.cursorPosition, new Point(40, 20), RelativePosition.Right, 10);
CursorPopupManager.open("testBR1", Hello World!, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.BottomRight, 10);
CursorPopupManager.open("testB1", Hello World!, CursorInformation.cursorPosition, new Point(20, 85), RelativePosition.Bottom, 10);
CursorPopupManager.open("testBL1", Hello World!, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.BottomLeft, 10);
CursorPopupManager.open("testL1", Hello World!, CursorInformation.cursorPosition, new Point(40, 20), RelativePosition.Left, 10);
CursorPopupManager.open("testTL1", Hello World!, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.TopLeft, 10);
CursorPopupManager.open("testT1", Hello World!, CursorInformation.cursorPosition, new Point(20, 100), RelativePosition.Top, 10);
},
});
iconSpec: "icon-placeholder", labelKey: "SampleApp:buttons.addCursorPopups", execute: async () => {
CursorPopupManager.open("testR1", Hello World!, CursorInformation.cursorPosition, new Point(40, 20), RelativePosition.Right, 10);
CursorPopupManager.open("testBR1", Hello World!, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.BottomRight, 10);
CursorPopupManager.open("testB1", Hello World!, CursorInformation.cursorPosition, new Point(20, 85), RelativePosition.Bottom, 10);
CursorPopupManager.open("testBL1", Hello World!, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.BottomLeft, 10);
CursorPopupManager.open("testL1", Hello World!, CursorInformation.cursorPosition, new Point(40, 20), RelativePosition.Left, 10);
CursorPopupManager.open("testTL1", Hello World!, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.TopLeft, 10);
CursorPopupManager.open("testT1", Hello World!, CursorInformation.cursorPosition, new Point(20, 100), RelativePosition.Top, 10);
},
});
iconSpec: "icon-placeholder", labelKey: "SampleApp:buttons.addCursorPopups", execute: async () => {
CursorPopupManager.open("testR1", Hello World!, CursorInformation.cursorPosition, new Point(40, 20), RelativePosition.Right, 10);
CursorPopupManager.open("testBR1", Hello World!, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.BottomRight, 10);
CursorPopupManager.open("testB1", Hello World!, CursorInformation.cursorPosition, new Point(20, 85), RelativePosition.Bottom, 10);
CursorPopupManager.open("testBL1", Hello World!, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.BottomLeft, 10);
CursorPopupManager.open("testL1", Hello World!, CursorInformation.cursorPosition, new Point(40, 20), RelativePosition.Left, 10);
CursorPopupManager.open("testTL1", Hello World!, CursorInformation.cursorPosition, new Point(20, 20), RelativePosition.TopLeft, 10);
CursorPopupManager.open("testT1", Hello World!, CursorInformation.cursorPosition, new Point(20, 100), RelativePosition.Top, 10);
},
});
private _handlePointerMove = (e: PointerEvent) => {
const current = new Point(e.clientX, e.clientY);
if (this.props.lastPosition) {
const dragged = Point.create(this.props.lastPosition).getOffsetTo(current);
this.props.onDrag && this.props.onDrag(dragged);
return;
}
if (this._initial && current.getDistanceTo(this._initial) >= 6) {
this._isDragged = true;
this.props.onDragStart && this.props.onDragStart(this._initial);
}
}
private _handlePointerDown = (e: PointerEvent) => {
if (e.target instanceof Element) {
e.target.releasePointerCapture(e.pointerId);
}
this.setState({ isPointerDown: true });
e.preventDefault();
this._isDragged = false;
this._initial = new Point(e.clientX, e.clientY);
}
export const offsetAndContainInContainer = (tooltipBounds: RectangleProps, containerSize: SizeProps, offset: PointProps = new Point(20, 20)): Point => {
let newBounds = Rectangle.create(tooltipBounds).offset(offset);
const containerBounds = Rectangle.createFromSize(containerSize);
if (containerBounds.contains(newBounds))
return newBounds.topLeft();
newBounds = newBounds.containIn(containerBounds);
return newBounds.topLeft();
};
private _handleMouseMove(e: React.MouseEvent): void {
const point = new Point(e.pageX, e.pageY);
CursorInformation.handleMouseMove(point);
}
this.setState((prevState) => {
if (!this._viewport)
return null;
if (!this._position)
return null;
const containerBounds = Rectangle.create(this._viewport.getBoundingClientRect());
const relativeBounds = Rectangle.createFromSize(this._size).offset(this._position);
const viewportOffset = new Point().getOffsetTo(containerBounds.topLeft());
const adjustedPosition = offsetAndContainInContainer(relativeBounds, containerBounds.getSize(), offset);
const position = adjustedPosition.offset(viewportOffset);
if (position.equals(prevState.position))
return null;
return {
position,
};
});
}