UNPKG

@teaui/core

Version:

A high-level terminal UI library for Node

48 lines 2.08 kB
import { Style } from '../../Style.js'; import { Container } from '../../Container.js'; import { Point, Rect } from '../../geometry.js'; export class TrackMouse extends Container { #position; constructor(viewProps) { super(viewProps); this.#position = Point.zero; } naturalSize(available) { return super.naturalSize(available.shrink(1, 1)).grow(1, 1); } receiveMouse(event) { this.#position = event.position; } render(viewport) { viewport.registerMouse('mouse.move'); const maxX = viewport.contentSize.width; const maxY = viewport.contentSize.height; let borderStyle = new Style({ foreground: 'white', background: 'default' }); viewport.clipped(new Rect(new Point(1, 1), viewport.contentSize.shrink(1, 1)), inside => { super.render(inside); }); const highlight = new Style({ inverse: true }); viewport.usingPen(borderStyle, pen => { for (let x = 1; x < maxX; ++x) { const cx = x - 1; pen.replacePen(x === this.#position.x ? highlight : Style.NONE); const char = cx % 10 === 0 ? (['0', '⠁', '⠉', '⠋', '⠛', '⠟', '⠿', '⡿', '⣿'][cx / 10] ?? 'X') : `${cx % 10}`; viewport.write(char, new Point(x, 0)); } for (let y = 1; y < maxY; ++y) { const cy = y - 1; pen.replacePen(y === this.#position.y ? highlight : Style.NONE); const char = cy % 10 === 0 ? (['0', '⠁', '⠉', '⠋', '⠛', '⠟', '⠿', '⡿', '⣿'][cy / 10] ?? 'X') : `${cy % 10}`; viewport.write(char, new Point(0, y)); } pen.replacePen(Style.NONE); const pos = `${this.#position.x}, ${this.#position.y}`; viewport.write(pos, new Point(viewport.contentSize.width - pos.length, viewport.contentSize.height - 1)); }); } } //# sourceMappingURL=TrackMouse.js.map