| import { app } from "../../../scripts/app.js";
|
| import { $el } from "../../../scripts/ui.js";
|
|
|
| let guide_config;
|
| const id = "pysssss.SnapToGrid.Guide";
|
| const guide_config_default = {
|
| lines: {
|
| enabled: false,
|
| fillStyle: "rgba(255, 0, 0, 0.5)",
|
| },
|
| block: {
|
| enabled: false,
|
| fillStyle: "rgba(0, 0, 255, 0.5)",
|
| },
|
| }
|
|
|
| const ext = {
|
| name: id,
|
| init() {
|
| if (localStorage.getItem(id) === null) {
|
| localStorage.setItem(id, JSON.stringify(guide_config_default));
|
| }
|
| guide_config = JSON.parse(localStorage.getItem(id));
|
|
|
| app.ui.settings.addSetting({
|
| id,
|
| name: "🐍 Display drag-and-drop guides",
|
| type: (name, setter, value) => {
|
| return $el("tr", [
|
| $el("td", [
|
| $el("label", {
|
| for: id.replaceAll(".", "-"),
|
| textContent: name,
|
| }),
|
| ]),
|
| $el("td", [
|
| $el(
|
| "label",
|
| {
|
| textContent: "Lines: ",
|
| style: {
|
| display: "inline-block",
|
| },
|
| },
|
| [
|
| $el("input", {
|
| id: id.replaceAll(".", "-") + "-line-text",
|
| type: "text",
|
| value: guide_config.lines.fillStyle,
|
| onchange: (event) => {
|
| guide_config.lines.fillStyle = event.target.value;
|
| localStorage.setItem(id, JSON.stringify(guide_config));
|
| }
|
| }),
|
| $el("input", {
|
| id: id.replaceAll(".", "-") + "-line-checkbox",
|
| type: "checkbox",
|
| checked: guide_config.lines.enabled,
|
| onchange: (event) => {
|
| guide_config.lines.enabled = !!event.target.checked;
|
| localStorage.setItem(id, JSON.stringify(guide_config));
|
| },
|
| }),
|
| ]
|
| ),
|
| $el(
|
| "label",
|
| {
|
| textContent: "Block: ",
|
| style: {
|
| display: "inline-block",
|
| },
|
| },
|
| [
|
| $el("input", {
|
| id: id.replaceAll(".", "-") + "-block-text",
|
| type: "text",
|
| value: guide_config.block.fillStyle,
|
| onchange: (event) => {
|
| guide_config.block.fillStyle = event.target.value;
|
| localStorage.setItem(id, JSON.stringify(guide_config));
|
| }
|
| }),
|
| $el("input", {
|
| id: id.replaceAll(".", "-") + '-block-checkbox',
|
| type: "checkbox",
|
| checked: guide_config.block.enabled,
|
| onchange: (event) => {
|
| guide_config.block.enabled = !!event.target.checked;
|
| localStorage.setItem(id, JSON.stringify(guide_config));
|
| },
|
| }),
|
| ]
|
| ),
|
| ]),
|
| ]);
|
| }
|
| });
|
|
|
| const alwaysSnapToGrid = () =>
|
| app.ui.settings.getSettingValue("pysssss.SnapToGrid", false);
|
| const snapToGridEnabled = () =>
|
| app.shiftDown || alwaysSnapToGrid();
|
|
|
|
|
| const origDrawNode = LGraphCanvas.prototype.drawNode;
|
| LGraphCanvas.prototype.drawNode = function (node, ctx) {
|
| const enabled = guide_config.lines.enabled || guide_config.block.enabled;
|
| if (enabled && this.isDragging && node.id in this.selected_nodes && snapToGridEnabled()) {
|
|
|
| let x = LiteGraph.CANVAS_GRID_SIZE * Math.round(node.pos[0] / LiteGraph.CANVAS_GRID_SIZE);
|
| let y = LiteGraph.CANVAS_GRID_SIZE * Math.round(node.pos[1] / LiteGraph.CANVAS_GRID_SIZE);
|
|
|
|
|
|
|
| x -= node.pos[0];
|
| y -= node.pos[1];
|
| let w, h;
|
| if (node.flags.collapsed) {
|
| w = node._collapsed_width;
|
| h = LiteGraph.NODE_TITLE_HEIGHT;
|
| y -= LiteGraph.NODE_TITLE_HEIGHT;
|
| } else {
|
| w = node.size[0];
|
| h = node.size[1];
|
| let titleMode = node.constructor.title_mode;
|
| if (titleMode !== LiteGraph.TRANSPARENT_TITLE && titleMode !== LiteGraph.NO_TITLE) {
|
| h += LiteGraph.NODE_TITLE_HEIGHT;
|
| y -= LiteGraph.NODE_TITLE_HEIGHT;
|
| }
|
| }
|
|
|
|
|
| const f = ctx.fillStyle;
|
|
|
|
|
| if (guide_config.block.enabled) {
|
| ctx.fillStyle = guide_config.block.fillStyle;
|
| ctx.fillRect(x, y, w, h);
|
| }
|
|
|
|
|
| if (guide_config.lines.enabled) {
|
| const xd = 10000;
|
| const yd = 10000;
|
| const thickness = 3;
|
| ctx.fillStyle = guide_config.lines.fillStyle;
|
| ctx.fillRect(x - xd, y, 2*xd, thickness);
|
| ctx.fillRect(x, y - yd, thickness, 2*yd);
|
| ctx.fillRect(x - xd, y + h, 2*xd, thickness);
|
| ctx.fillRect(x + w, y - yd, thickness, 2*yd);
|
| }
|
|
|
|
|
| ctx.fillStyle = f;
|
| }
|
|
|
| return origDrawNode.apply(this, arguments);
|
| };
|
| },
|
| };
|
|
|
| app.registerExtension(ext);
|
|
|