-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathFlatten Folder.jsx
94 lines (76 loc) · 2.31 KB
/
Flatten Folder.jsx
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
/**
* Flattens all child items in selected folder(s), moving every item into the selected folder.
*
* If nothing is selected, flattens every item into the project root.
*
* @author Zack Lovatt <[email protected]>
* @version 0.1.0
*/
(function flattenFolder() {
var selection = app.project.selection;
// If nothing's selected, flatten the whole project
if (selection.length == 0) {
selection = [app.project.rootFolder];
}
try {
app.beginUndoGroup("Create Layer Backdrop");
_assertNoNestedSelections(selection);
for (var ii = 0, il = selection.length; ii < il; ii++) {
var selectedItem = selection[ii];
if (!(selectedItem instanceof FolderItem)) {
continue;
}
_flattenFolder(selectedItem, selectedItem);
}
} catch (e) {
alert(e, "Flatten Folder");
} finally {
app.endUndoGroup();
}
/**
* Checks whether any selected items are a parent of another selected item
*
* This is useful for ensuring valid selections, so we don't double-unnest something.
*
* @param {Item[]} items
*/
function _assertNoNestedSelections(items) {
var itemFlattenMap = {};
for (var ii = 0, il = items.length; ii < il; ii++) {
var item = items[ii];
if (!(item instanceof FolderItem)) {
continue;
}
var tempItem = item;
while (tempItem.parentFolder !== null) {
var itemID = tempItem.id;
if (itemFlattenMap.hasOwnProperty(itemID.toString()) && itemFlattenMap[itemID] == true) {
throw new Error("Can't flatten selection, as some items contain each other!");
}
itemFlattenMap[itemID] = false;
tempItem = tempItem.parentFolder;
}
itemFlattenMap[item.id] = true;
}
}
/**
* Recursively flatten all items in a given folder
*
* @param {FolderItem} folder Current folder to look at
* @param {FolderItem} rootFolder Root folder to move items to
*/
function _flattenFolder(folder, rootFolder) {
var folderItems = folder.items;
for (var ii = folderItems.length; ii > 0; ii--) {
var item = folderItems[ii];
if (item instanceof FolderItem) {
_flattenFolder(item, rootFolder);
if (item.numItems == 0) {
item.remove();
}
} else {
item.parentFolder = rootFolder;
}
}
}
})();