-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathReverse Positions.sketchplugin
94 lines (67 loc) · 2.08 KB
/
Reverse Positions.sketchplugin
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// This plugin reverses the positions of selected layers.
#import 'inventory.js'
var _selection = null;
var leftPositions = [];
var topPositions = [];
var layersMeta = [];
// Run
if (selection.count() > 1) {
// remember the selection
_selection = selection;
// sort selected layers
sortLayers(selection);
} else if (selection.count() == 1 && selection[0].children().count() > 0){
// remember the selection
_selection = selection;
var group = _selection[0];
// sort selected group
sortLayers(group.layers().array());
} else {
[doc showMessage:"Cannot sort single layers."]
}
// Restore selection
inventory.layers.select(_selection);
function sortLayers (layers) {
// Loop through all selected layers
for (var i = 0; i < layers.count(); i++) {
var layer = layers[i];
layersMeta.push({
"name": layer.name(),
"layer": layer,
"top": layer.frame().top(),
"left": layer.frame().left()
});
// Remember the position of each layer
topPositions.push(parseInt(layer.frame().y()));
leftPositions.push(parseInt(layer.frame().x()));
}
// sort positions first
topPositions.sort(sortNumber);
leftPositions.sort(sortNumber);
// then reverse positions
topPositions.reverse();
leftPositions.reverse();
// Finally, layout the sorted layers
// Sort layers by top positions
layersMeta.sort(sortTop);
for (var i = 0; i < layersMeta.length; i++) {
layersMeta[i].layer.frame().setY(topPositions[i]);
}
// Sort layers by left positions
layersMeta.sort(sortLeft);
for (var i = 0; i < layersMeta.length; i++) {
layersMeta[i].layer.frame().setX(leftPositions[i]);
}
}
// Sorts numbers. By default, sort would handle numbers as strings and thus not sort them as intended.
function sortNumber(a, b) {
return a - b;
}
// Sorts layers by their top position
function sortTop(a, b) {
return a.top - b.top;
}
// Sorts layers by their top position
function sortLeft(a, b) {
return a.left - b.left;
}