Skip to content

Commit 2f8f57c

Browse files
committed
[GUI] Improve file and folder loading (drag&drop)
- Added support for drag&drop of multiple folders - Open/Export dialog can now also use a path taken from drag&drop items
1 parent b7d5d73 commit 2f8f57c

File tree

3 files changed

+48
-29
lines changed

3 files changed

+48
-29
lines changed

AssetStudio/AssetsManager.cs

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,53 @@ public void SetAssetFilter(List<ClassIDType> classIDTypeList)
5353
SetAssetFilter(classIDType);
5454
}
5555

56-
public void LoadFiles(params string[] files)
56+
public void LoadFilesAndFolders(params string[] path)
5757
{
58-
var path = Path.GetDirectoryName(Path.GetFullPath(files[0]));
59-
MergeSplitAssets(path);
60-
var toReadFile = ProcessingSplitFiles(files.ToList());
61-
Load(toReadFile);
58+
List<string> pathList = new List<string>();
59+
pathList.AddRange(path);
60+
LoadFilesAndFolders(out _, pathList);
61+
}
62+
63+
public void LoadFilesAndFolders(out string parentPath, params string[] path)
64+
{
65+
List<string> pathList = new List<string>();
66+
pathList.AddRange(path);
67+
LoadFilesAndFolders(out parentPath, pathList);
6268
}
6369

64-
public void LoadFolder(string path)
70+
public void LoadFilesAndFolders(out string parentPath, List<string> pathList)
6571
{
66-
MergeSplitAssets(path, true);
67-
var files = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).ToList();
68-
var toReadFile = ProcessingSplitFiles(files);
72+
List<string> fileList = new List<string>();
73+
bool filesInPath = false;
74+
parentPath = "";
75+
foreach (var path in pathList)
76+
{
77+
var fullPath = Path.GetFullPath(path);
78+
if (Directory.Exists(fullPath))
79+
{
80+
var parent = Directory.GetParent(fullPath).FullName;
81+
if (!filesInPath && (parentPath == "" || parentPath.Length > parent.Length))
82+
{
83+
parentPath = parent;
84+
}
85+
MergeSplitAssets(fullPath, true);
86+
fileList.AddRange(Directory.GetFiles(fullPath, "*.*", SearchOption.AllDirectories));
87+
}
88+
else
89+
{
90+
parentPath = Path.GetDirectoryName(fullPath);
91+
fileList.Add(fullPath);
92+
filesInPath = true;
93+
}
94+
}
95+
if (filesInPath)
96+
{
97+
MergeSplitAssets(parentPath);
98+
}
99+
var toReadFile = ProcessingSplitFiles(fileList);
100+
fileList.Clear();
101+
pathList.Clear();
102+
69103
Load(toReadFile);
70104
}
71105

AssetStudioCLI/Studio.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,7 @@ public bool LoadAssets()
3333
assetsManager.SpecifyUnityVersion = options.o_unityVersion.Value;
3434
assetsManager.SetAssetFilter(options.o_exportAssetTypes.Value);
3535

36-
if (Directory.Exists(options.inputPath))
37-
{
38-
assetsManager.LoadFolder(options.inputPath);
39-
}
40-
else
41-
{
42-
assetsManager.LoadFiles(options.inputPath);
43-
}
36+
assetsManager.LoadFilesAndFolders(options.inputPath);
4437
if (assetsManager.assetsFileList.Count == 0)
4538
{
4639
Logger.Warning("No Unity file can be loaded.");

AssetStudioGUI/AssetStudioGUIForm.cs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,8 @@ private async void AssetStudioGUIForm_DragDrop(object sender, DragEventArgs e)
143143
{
144144
ResetForm();
145145
assetsManager.SpecifyUnityVersion = specifyUnityVersion.Text;
146-
if (paths.Length == 1 && Directory.Exists(paths[0]))
147-
{
148-
await Task.Run(() => assetsManager.LoadFolder(paths[0]));
149-
}
150-
else
151-
{
152-
await Task.Run(() => assetsManager.LoadFiles(paths));
153-
}
146+
await Task.Run(() => assetsManager.LoadFilesAndFolders(out openDirectoryBackup, paths));
147+
saveDirectoryBackup = openDirectoryBackup;
154148
BuildAssetStructures();
155149
}
156150
}
@@ -161,9 +155,8 @@ private async void loadFile_Click(object sender, EventArgs e)
161155
if (openFileDialog1.ShowDialog(this) == DialogResult.OK)
162156
{
163157
ResetForm();
164-
openDirectoryBackup = Path.GetDirectoryName(openFileDialog1.FileNames[0]);
165158
assetsManager.SpecifyUnityVersion = specifyUnityVersion.Text;
166-
await Task.Run(() => assetsManager.LoadFiles(openFileDialog1.FileNames));
159+
await Task.Run(() => assetsManager.LoadFilesAndFolders(out openDirectoryBackup, openFileDialog1.FileNames));
167160
BuildAssetStructures();
168161
}
169162
}
@@ -175,9 +168,8 @@ private async void loadFolder_Click(object sender, EventArgs e)
175168
if (openFolderDialog.ShowDialog(this) == DialogResult.OK)
176169
{
177170
ResetForm();
178-
openDirectoryBackup = openFolderDialog.Folder;
179171
assetsManager.SpecifyUnityVersion = specifyUnityVersion.Text;
180-
await Task.Run(() => assetsManager.LoadFolder(openFolderDialog.Folder));
172+
await Task.Run(() => assetsManager.LoadFilesAndFolders(out openDirectoryBackup, openFolderDialog.Folder));
181173
BuildAssetStructures();
182174
}
183175
}

0 commit comments

Comments
 (0)