feat(gui): collapse single-child directory chains in resource tree (PR #2866)

This commit is contained in:
Ruffalo Lavoisier
2026-05-10 01:39:22 +09:00
committed by GitHub
parent bce6611aaf
commit 62fa2735dc
3 changed files with 48 additions and 1 deletions
@@ -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;
}