Skip to content

Commit d34cd55

Browse files
authored
Merge pull request #903 from rgantzos/main
Add shift selection
2 parents e3e6eca + 0dff075 commit d34cd55

File tree

2 files changed

+58
-37
lines changed

2 files changed

+58
-37
lines changed

features/paint-align/data.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,9 @@
99
"dynamic": true,
1010
"scripts": [{ "file": "script.js", "runOn": "/projects/*" }],
1111
"styles": [{ "file": "style.css", "runOn": "/projects/*" }],
12-
"resources": [{ "name": "paint-align", "path": "/align.svg" }]
12+
"resources": [{ "name": "paint-align", "path": "/align.svg" }],
13+
"components": [{
14+
"type": "info",
15+
"content": "Holding the shift key while clicking the align items button will center all selected items on the item in the furthest-back layer."
16+
}]
1317
}

features/paint-align/script.js

Lines changed: 53 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,52 @@
11
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() {
2+
ScratchTools.waitForElements(
3+
"div[class^='mode-tools_mod-labeled-icon-height_']",
4+
function (row) {
5+
if (row.querySelector(".ste-align-items")) return;
6+
7+
let span = document.createElement("span");
8+
span.className =
9+
"button_button_u6SE2 labeled-icon-button_mod-edit-field_1bXYC ste-align-items";
10+
span.role = "button";
11+
12+
let img = document.createElement("img");
13+
img.src = feature.self.getResource("paint-align");
14+
img.className = "labeled-icon-button_edit-field-icon_3j-Pf";
15+
img.alt = feature.msg("align");
16+
img.title = feature.msg("align");
17+
img.draggable = false;
18+
span.appendChild(img);
19+
20+
let label = document.createElement("span");
21+
label.textContent = feature.msg("align");
22+
label.className = "labeled-icon-button_edit-field-title_1ZoEV";
23+
span.appendChild(label);
24+
25+
span.addEventListener("click", function (e) {
2326
if (span.className.includes("disabled")) return;
24-
centerObjects()
25-
})
27+
centerObjects(e.shiftKey);
28+
});
2629

27-
row.appendChild(span)
28-
})
30+
row.appendChild(span);
31+
}
32+
);
2933

30-
feature.redux.subscribe(function() {
34+
feature.redux.subscribe(function () {
3135
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("button_mod-disabled_1rf31")
36-
} else {
37-
span.classList.remove("button_mod-disabled_1rf31")
38-
}
36+
let span = document.querySelector(".ste-align-items");
37+
38+
if (
39+
feature.traps.paint().format === "BITMAP" ||
40+
feature.traps.paint().selectedItems?.length < 2
41+
) {
42+
span.classList.add("button_mod-disabled_1rf31");
43+
} else {
44+
span.classList.remove("button_mod-disabled_1rf31");
45+
}
3946
}
40-
})
47+
});
4148

42-
function centerObjects() {
49+
function centerObjects(stay) {
4350
let items = feature.traps.paint().selectedItems;
4451

4552
let allX = [];
@@ -51,7 +58,12 @@ export default async function ({ feature }) {
5158
allY.push(getMidPoint(items[i].segments).y);
5259
}
5360

54-
let trueMidpoint = { x: average(allX), y: average(allY) };
61+
let trueMidpoint = stay
62+
? {
63+
x: getMidPoint(items[0].segments).x,
64+
y: getMidPoint(items[0].segments).y,
65+
}
66+
: { x: average(allX), y: average(allY) };
5567

5668
for (var i in items) {
5769
let selfMidpoint = getMidPoint(items[i].segments);
@@ -62,6 +74,11 @@ export default async function ({ feature }) {
6274
items[i].segments[seg]._point._x += adjustX;
6375
items[i].segments[seg]._point._y += adjustY;
6476
}
77+
78+
for (var comp in (items[i].fillColor?._components || [])) {
79+
items[i].fillColor._components[comp].x += adjustX;
80+
items[i].fillColor._components[comp].y += adjustY;
81+
}
6582
}
6683

6784
feature.traps.getPaper().tool.onUpdateImage();

0 commit comments

Comments
 (0)