sandboxels/mods/copypaste.js

99 lines
2.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//agni2012.github.io/copypaste.js
//Typed in the allmigty dvorak layout
//Some helper functions coded by AI
// Extracts a rectangular matrix from (x, y) with width w and height h
function pluckMatrix(x, y, w, h) {
var result = [];
for (var j = 0; j < h; j++) {
var row = [];
for (var i = 0; i < w; i++) {
var px = pixelMap[x + i]?.[y + j];
if (px) {
row.push({ element: px.element, temp: px.temp, color: px.color });
} else {
row.push("#");
}
}
result.push(row);
}
return result;
}
var copyOnce = false;
var pasteOnce = false;
// Tool definitions
elements.copy = {
name: "copy to clipboard",
color: ["#f5c211"],
tool: function(pixel) {},
category: "tools",
excludeRandom: true,
};
elements.paste = {
name: "paste from clipboard",
color: ["#813d9c"],
tool: function(pixel) {},
category: "tools",
excludeRandom: true,
};
document.addEventListener("mousedown", (event) => {
if(!mouseIsDown) return; //sandboxels
if (event.button !== 0) return; // only leftclick
var x = mousePos.x, y = mousePos.y;
var size = mouseSize || 1;
// COPY
if (currentElement === "copy" && !copyOnce) {
copyOnce = true;
var matrix = pluckMatrix(x - (size-1)/2, y - (size-1)/2, size, size);
var payload = JSON.stringify({ matrix, x, y });
navigator.clipboard.writeText(payload)
.then(() => alert("Copied " + size + "×" + size))
.catch(e => console.error("Copy failed:", e));
}
// PASTE
if (currentElement === "paste" && !pasteOnce) {
pasteOnce = true;
navigator.clipboard.readText()
.then(text => {
var data = JSON.parse(text);
var matrix = data.matrix;
for (var j = 0; j < matrix.length; j++) {
for (var i = 0; i < matrix[j].length; i++) {
console.log("→ Drawing", cell?.element, "at", x+i, y+j);
var cell = matrix[j][i];
if (cell !== "#" && cell.element) {
var px = createPixel(cell.element, x + i - (size-1)/2, y + j - (size-1)/2);
if (px) {
if (typeof cell.temp === "number") px.temp = cell.temp;
if (typeof cell.color === "string") px.color = cell.color;
}
}
}
}
alert("Pasted at", x, y);
})
.catch(e => console.error("Paste failed:", e));
}
});
document.addEventListener("mouseup", (event) => {
if (event.button === 0) {
copyOnce = false;
pasteOnce = false;
}
});