feat(gui): collapse single-child directory chains in resource tree (PR #2866)
This commit is contained in:
committed by
GitHub
parent
bce6611aaf
commit
62fa2735dc
@@ -2,6 +2,7 @@ package jadx.gui.treemodel;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
@@ -69,7 +70,7 @@ public class JResource extends JLoadableNode {
|
||||
}
|
||||
|
||||
private final transient String name;
|
||||
private final transient String shortName;
|
||||
private transient String shortName;
|
||||
private final transient JResType type;
|
||||
private final transient ResourceFile resFile;
|
||||
|
||||
@@ -159,6 +160,50 @@ public class JResource extends JLoadableNode {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Collapse single-child DIR chains into one node with a slash-joined display name (GitHub-style).
|
||||
*/
|
||||
public static void mergeMiddleDirs(JResource root) {
|
||||
mergeChildren(root.subNodes);
|
||||
}
|
||||
|
||||
public static void mergeMiddleDirs(List<JResource> roots) {
|
||||
mergeChildren(roots);
|
||||
}
|
||||
|
||||
private static void mergeChildren(List<JResource> children) {
|
||||
for (int i = 0; i < children.size(); i++) {
|
||||
JResource sub = children.get(i);
|
||||
JResource replaced = mergeChain(sub, new ArrayList<>());
|
||||
if (replaced != sub) {
|
||||
children.set(i, replaced);
|
||||
}
|
||||
mergeChildren(replaced.subNodes);
|
||||
}
|
||||
}
|
||||
|
||||
private static JResource mergeChain(JResource node, List<JResource> merged) {
|
||||
if (node.type == JResType.DIR) {
|
||||
List<JResource> subs = node.subNodes;
|
||||
if (subs.size() == 1 && subs.get(0).type == JResType.DIR) {
|
||||
merged.add(node);
|
||||
return mergeChain(subs.get(0), merged);
|
||||
}
|
||||
}
|
||||
if (!merged.isEmpty()) {
|
||||
merged.add(node);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < merged.size(); i++) {
|
||||
if (i > 0) {
|
||||
sb.append('/');
|
||||
}
|
||||
sb.append(merged.get(i).shortName);
|
||||
}
|
||||
node.shortName = sb.toString();
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasContent() {
|
||||
return resFile != null;
|
||||
|
||||
@@ -73,6 +73,7 @@ public class JRoot extends JNode {
|
||||
JResource leaf = new JResource(rf, rf.getDeobfName(), parts[count - 1], JResType.FILE);
|
||||
curRf.addSubNode(leaf);
|
||||
}
|
||||
JResource.mergeMiddleDirs(root);
|
||||
root.sortSubNodes();
|
||||
root.update();
|
||||
return root;
|
||||
|
||||
@@ -24,6 +24,7 @@ public class ResTableHelper {
|
||||
public static List<JResource> buildTree(JResource resTableRes, ResContainer resTable) {
|
||||
ResTableHelper resTableHelper = new ResTableHelper(resTableRes);
|
||||
resTableHelper.process(resTable);
|
||||
JResource.mergeMiddleDirs(resTableHelper.roots);
|
||||
return resTableHelper.roots;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user