| import type {
|
| LGraph,
|
| LGraphCanvas,
|
| LGraphNode,
|
| Point,
|
| CanvasMouseEvent,
|
| Subgraph,
|
| } from "@comfyorg/frontend";
|
|
|
| import {app} from "scripts/app.js";
|
| import {RgthreeBaseVirtualNode} from "./base_node.js";
|
| import {SERVICE as KEY_EVENT_SERVICE} from "./services/key_events_services.js";
|
| import {SERVICE as BOOKMARKS_SERVICE} from "./services/bookmarks_services.js";
|
| import {NodeTypesString} from "./constants.js";
|
| import {getClosestOrSelf, query} from "rgthree/common/utils_dom.js";
|
| import {wait} from "rgthree/common/shared_utils.js";
|
|
|
| |
| |
| |
|
|
| export class Bookmark extends RgthreeBaseVirtualNode {
|
| static override type = NodeTypesString.BOOKMARK;
|
| static override title = NodeTypesString.BOOKMARK;
|
| override comfyClass = NodeTypesString.BOOKMARK;
|
|
|
|
|
|
|
| static slot_start_y = -20;
|
|
|
|
|
|
|
| ___collapsed_width: number = 0;
|
|
|
| override isVirtualNode = true;
|
| override serialize_widgets = true;
|
|
|
|
|
| override get _collapsed_width() {
|
| return this.___collapsed_width;
|
| }
|
|
|
| override set _collapsed_width(width: number) {
|
| const canvas = app.canvas as LGraphCanvas;
|
| const ctx = canvas.canvas.getContext("2d")!;
|
| const oldFont = ctx.font;
|
| ctx.font = canvas.title_text_font;
|
| this.___collapsed_width = 40 + ctx.measureText(this.title).width;
|
| ctx.font = oldFont;
|
| }
|
|
|
| readonly keypressBound;
|
|
|
| constructor(title = Bookmark.title) {
|
| super(title);
|
| const nextShortcutChar = BOOKMARKS_SERVICE.getNextShortcut();
|
| this.addWidget(
|
| "text",
|
| "shortcut_key",
|
| nextShortcutChar,
|
| (value: string, ...args) => {
|
| value = value.trim()[0] || "1";
|
| },
|
| {
|
| y: 8,
|
| },
|
| );
|
| this.addWidget("number", "zoom", 1, (value: number) => {}, {
|
| y: 8 + LiteGraph.NODE_WIDGET_HEIGHT + 4,
|
| max: 2,
|
| min: 0.5,
|
| precision: 2,
|
| });
|
| this.keypressBound = this.onKeypress.bind(this);
|
| this.title = "🔖";
|
| this.onConstructed();
|
| }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| get shortcutKey(): string {
|
| return (this.widgets[0]?.value as string)?.toLocaleLowerCase() ?? "";
|
| }
|
|
|
| override onAdded(graph: LGraph): void {
|
| KEY_EVENT_SERVICE.addEventListener("keydown", this.keypressBound as EventListener);
|
| }
|
|
|
| override onRemoved(): void {
|
| KEY_EVENT_SERVICE.removeEventListener("keydown", this.keypressBound as EventListener);
|
| }
|
|
|
| onKeypress(event: CustomEvent<{originalEvent: KeyboardEvent}>) {
|
| const originalEvent = event.detail.originalEvent;
|
| const target = (originalEvent.target as HTMLElement)!;
|
| if (getClosestOrSelf(target, 'input,textarea,[contenteditable="true"]')) {
|
| return;
|
| }
|
|
|
|
|
| if (KEY_EVENT_SERVICE.areOnlyKeysDown(this.widgets[0]!.value as string, true)) {
|
| this.canvasToBookmark();
|
| originalEvent.preventDefault();
|
| originalEvent.stopPropagation();
|
| }
|
| }
|
|
|
| |
| |
| |
| |
|
|
| override onMouseDown(event: CanvasMouseEvent, pos: Point, graphCanvas: LGraphCanvas): boolean {
|
| const input = query<HTMLInputElement>(".graphdialog > input.value");
|
| if (input && input.value === this.widgets[0]?.value) {
|
| input.addEventListener("keydown", (e) => {
|
|
|
| KEY_EVENT_SERVICE.handleKeyDownOrUp(e);
|
| e.preventDefault();
|
| e.stopPropagation();
|
| input.value = Object.keys(KEY_EVENT_SERVICE.downKeys).join(" + ");
|
| });
|
| }
|
| return false;
|
| }
|
|
|
| async canvasToBookmark() {
|
| const canvas = app.canvas as LGraphCanvas;
|
| if (this.graph !== app.canvas.getCurrentGraph()) {
|
| canvas.openSubgraph(this.graph as Subgraph);
|
| await wait(16);
|
| }
|
|
|
|
|
| if (canvas?.ds?.offset) {
|
| canvas.ds.offset[0] = -this.pos[0] + 16;
|
| canvas.ds.offset[1] = -this.pos[1] + 40;
|
| }
|
| if (canvas?.ds?.scale != null) {
|
| canvas.ds.scale = Number(this.widgets[1]!.value || 1);
|
| }
|
| canvas.setDirty(true, true);
|
| }
|
| }
|
|
|
| app.registerExtension({
|
| name: "rgthree.Bookmark",
|
| registerCustomNodes() {
|
| Bookmark.setUp();
|
| },
|
| });
|
|
|