|
| 1 | +export default async function ({ feature }) { |
| 2 | + ScratchTools.waitForElements("div[class^='mode-tools_mod-labeled-icon-height_']", function(row) { |
| 3 | + if (row.querySelector(".ste-align-items")) return; |
| 4 | + |
| 5 | + let span = document.createElement("span") |
| 6 | + span.className = "button_button_u6SE2 labeled-icon-button_mod-edit-field_1bXYC ste-align-items" |
| 7 | + span.role = "button" |
| 8 | + |
| 9 | + let img = document.createElement("img") |
| 10 | + img.src = feature.self.getResource("paint-align") |
| 11 | + img.className = "labeled-icon-button_edit-field-icon_3j-Pf" |
| 12 | + img.alt = feature.msg("align") |
| 13 | + img.title = feature.msg("align") |
| 14 | + img.draggable = false |
| 15 | + span.appendChild(img) |
| 16 | + |
| 17 | + let label = document.createElement("span") |
| 18 | + label.textContent = feature.msg("align") |
| 19 | + label.className = "labeled-icon-button_edit-field-title_1ZoEV" |
| 20 | + span.appendChild(label) |
| 21 | + |
| 22 | + span.addEventListener("click", function() { |
| 23 | + if (span.className.includes("disabled")) return; |
| 24 | + centerObjects() |
| 25 | + }) |
| 26 | + |
| 27 | + row.appendChild(span) |
| 28 | + }) |
| 29 | + |
| 30 | + feature.redux.subscribe(function() { |
| 31 | + if (document.querySelector(".ste-align-items")) { |
| 32 | + let span = document.querySelector(".ste-align-items") |
| 33 | + |
| 34 | + if (feature.traps.paint().format === "BITMAP" || feature.traps.paint().selectedItems?.length < 2) { |
| 35 | + span.classList.add("disabled") |
| 36 | + } else { |
| 37 | + span.classList.remove("disabled") |
| 38 | + } |
| 39 | + } |
| 40 | + }) |
| 41 | + |
| 42 | + function centerObjects() { |
| 43 | + let items = feature.traps.paint().selectedItems; |
| 44 | + |
| 45 | + let allX = []; |
| 46 | + let allY = []; |
| 47 | + let average = (array) => array.reduce((a, b) => a + b) / array.length; |
| 48 | + |
| 49 | + for (var i in items) { |
| 50 | + allX.push(getMidPoint(items[i].segments).x); |
| 51 | + allY.push(getMidPoint(items[i].segments).y); |
| 52 | + } |
| 53 | + |
| 54 | + let trueMidpoint = { x: average(allX), y: average(allY) }; |
| 55 | + |
| 56 | + for (var i in items) { |
| 57 | + let selfMidpoint = getMidPoint(items[i].segments); |
| 58 | + let adjustX = trueMidpoint.x - selfMidpoint.x; |
| 59 | + let adjustY = trueMidpoint.y - selfMidpoint.y; |
| 60 | + |
| 61 | + for (var seg in items[i].segments) { |
| 62 | + items[i].segments[seg]._point._x += adjustX; |
| 63 | + items[i].segments[seg]._point._y += adjustY; |
| 64 | + } |
| 65 | + } |
| 66 | + |
| 67 | + feature.traps.getPaper().tool.onUpdateImage(); |
| 68 | + } |
| 69 | + |
| 70 | + function getMidPoint(segments) { |
| 71 | + let x = []; |
| 72 | + let y = []; |
| 73 | + |
| 74 | + for (var i in segments) { |
| 75 | + x.push(segments[i]._point._x); |
| 76 | + y.push(segments[i]._point._y); |
| 77 | + } |
| 78 | + |
| 79 | + let xAverage = (Math.min(...x) + Math.max(...x)) / 2; |
| 80 | + let yAverage = (Math.min(...y) + Math.max(...y)) / 2; |
| 81 | + |
| 82 | + return { x: xAverage, y: yAverage }; |
| 83 | + } |
| 84 | +} |
0 commit comments