Skip to content

Commit d24f5ef

Browse files
authored
Merge pull request #898 from rgantzos/main
New feature: `paint-align`
2 parents 539c302 + 3182a68 commit d24f5ef

File tree

6 files changed

+128
-0
lines changed

6 files changed

+128
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"align": "Align"
3+
}

features/features.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
[
2+
{
3+
"version": 2,
4+
"id": "paint-align",
5+
"versionAdded": "v4.0.0"
6+
},
27
{
38
"version": 2,
49
"id": "rotate-gradient",

features/paint-align/align.svg

Lines changed: 19 additions & 0 deletions
Loading

features/paint-align/data.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"title": "Align Objects in Paint Editor",
3+
"description": "Change the opacity of objects in the paint editor.",
4+
"credits": [
5+
{ "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" }
6+
],
7+
"type": ["Editor"],
8+
"tags": ["New"],
9+
"dynamic": true,
10+
"scripts": [{ "file": "script.js", "runOn": "/projects/*" }],
11+
"styles": [{ "file": "style.css", "runOn": "/projects/*" }],
12+
"resources": [{ "name": "paint-align", "path": "/align.svg" }]
13+
}

features/paint-align/script.js

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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+
}

features/paint-align/style.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.ste-align-items.disabled {
2+
cursor: auto;
3+
opacity: .5;
4+
}

0 commit comments

Comments
 (0)