File size: 1,609 Bytes
baa8e90
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import { app } from "../../../scripts/app.js";

let setting;
const id = "pysssss.SnapToGrid";
const ext = {
	name: id,
	init() {
		setting = app.ui.settings.addSetting({
			id,
			name: "🐍 Always snap to grid",
			defaultValue: false,
			type: "boolean",
			onChange(value) {
				app.canvas.align_to_grid = value;
			},
		});

		// We need to register our hooks after the core snap to grid extension runs
		// Do this from the graph configure function so we still get onNodeAdded calls
		const configure = LGraph.prototype.configure;
		LGraph.prototype.configure = function () {
			// Override drawNode to draw the drop position
			const drawNode = LGraphCanvas.prototype.drawNode;
			LGraphCanvas.prototype.drawNode = function () {
				if (setting?.value) {
					const shift = app.shiftDown;
					app.shiftDown = true; 
					const r = drawNode.apply(this, arguments);
					app.shiftDown = shift;
					return r;
				}
				return drawNode.apply(this, arguments);
			};

			// Override node added to add a resize handler to force grid alignment
			const onNodeAdded = app.graph.onNodeAdded;
			app.graph.onNodeAdded = function (node) {
				const r = onNodeAdded?.apply(this, arguments);
				const onResize = node.onResize;
				node.onResize = function () {
					if (setting?.value) {
						const shift = app.shiftDown;
						app.shiftDown = true;
						const r = onResize?.apply(this, arguments);
						app.shiftDown = shift;
						return r;
					}
					return onResize?.apply(this, arguments);
				};
				return r;
			};

			return configure.apply(this, arguments);
		};
	},
};

app.registerExtension(ext);