Improve Import options

- Added Import options window
- Changed cache logic:
  - single cache file instead of separate cache files for each bundle
  - program folder as a default cache folder
  - added an option to specify a custom cache folder
This commit is contained in:
VaDiM
2026-02-22 00:40:19 +03:00
parent ab5b81d01e
commit 0ae33f995f
13 changed files with 866 additions and 160 deletions
+142
View File
@@ -0,0 +1,142 @@
using AssetStudio;
using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
namespace AssetStudioGUI
{
public partial class ImportOptionsForm : Form
{
private readonly AssetsManager _assetsManager;
private string _cachePath;
public ImportOptionsForm(AssetsManager assetsManager)
{
InitializeComponent();
_assetsManager = assetsManager;
if (assetsManager.Options.CustomUnityVersion != null)
{
customUnityVersionTextBox.Text = assetsManager.Options.CustomUnityVersion.FullVersion;
}
unityVerAutoRadioButton.Checked = true;
cachePathLabel.AutoSize = IsWine; //to disable AutoEllipsis in Wine
_cachePath = _assetsManager.Options.BundleOptions.CustomCachePath;
DisplayCachePath();
alwaysDecompressToDiskCheckBox.Checked = assetsManager.Options.BundleOptions.DecompressToDisk;
customBlockInfoCompressionComboBox.SelectedIndex = SetComboBoxIndex(assetsManager.Options.BundleOptions.CustomBlockInfoCompression);
customBlockCompressionComboBox.SelectedIndex = SetComboBoxIndex(assetsManager.Options.BundleOptions.CustomBlockCompression);
}
private void ApplyOptions()
{
if (string.IsNullOrEmpty(customUnityVersionTextBox.Text))
{
_assetsManager.Options.CustomUnityVersion = null;
}
else
{
try
{
_assetsManager.Options.CustomUnityVersion = new UnityVersion(customUnityVersionTextBox.Text);
}
catch (Exception ex)
{
Logger.Error(ex.Message);
}
}
_assetsManager.Options.BundleOptions.CustomCachePath = _cachePath;
Properties.Settings.Default.cachePath = _cachePath;
var blockCompression = GetCustomCompressionTypes(customBlockCompressionComboBox.SelectedIndex);
_assetsManager.Options.BundleOptions.CustomBlockCompression = blockCompression;
var blockInfoCompression = GetCustomCompressionTypes(customBlockInfoCompressionComboBox.SelectedIndex);
_assetsManager.Options.BundleOptions.CustomBlockInfoCompression = blockInfoCompression;
var decompressToDisk = alwaysDecompressToDiskCheckBox.Checked;
_assetsManager.Options.BundleOptions.DecompressToDisk = decompressToDisk;
Properties.Settings.Default.decompressToDisk = decompressToDisk;
Properties.Settings.Default.Save();
}
private static CompressionType GetCustomCompressionTypes(int index)
{
switch (index)
{
case 0: return CompressionType.Auto;
case 1: return CompressionType.Zstd;
case 2: return CompressionType.Oodle;
case 3: return CompressionType.Lz4HC;
case 4: return CompressionType.Lzma;
default: throw new NotSupportedException();
}
}
private static int SetComboBoxIndex(CompressionType compressionType)
{
switch (compressionType)
{
case CompressionType.Auto: return 0;
case CompressionType.Lzma: return 4;
case CompressionType.Lz4:
case CompressionType.Lz4HC: return 3;
case CompressionType.Zstd: return 1;
case CompressionType.Oodle: return 2;
default: throw new NotSupportedException();
}
}
private void DisplayCachePath()
{
cachePathLabel.Text = $"Cache directory: {_cachePath}";
toolTip1.SetToolTip(cachePathLabel, _cachePath);
var driveInfo = new DriveInfo(Directory.GetDirectoryRoot(_cachePath));
cacheFreeSpaceLabel.Text = $"Available space: {driveInfo.AvailableFreeSpace * 1.0f / 0x40000000:.00}GB";
}
private void cachePathSelectButton_Click(object sender, EventArgs e)
{
var cachePathFolderDialog = new OpenFolderDialog();
cachePathFolderDialog.Title = "Select the cache directory";
if (cachePathFolderDialog.ShowDialog(this) != DialogResult.OK)
return;
_cachePath = cachePathFolderDialog.Folder;
DisplayCachePath();
}
private void cachePathResetButton_Click(object sender, EventArgs e)
{
_cachePath = Path.Combine(Directory.GetCurrentDirectory(), "temp");
if (!Directory.Exists(_cachePath))
Directory.CreateDirectory(_cachePath);
DisplayCachePath();
}
private void saveToDiskButton_Click(object sender, EventArgs e)
{
ApplyOptions();
var saveFolderDialog = new OpenFolderDialog();
saveFolderDialog.Title = "Select the save folder";
if (saveFolderDialog.ShowDialog(this) == DialogResult.OK)
{
var savePath = saveFolderDialog.Folder;
_assetsManager.Options.SaveToFile(savePath);
}
}
private void closeButton_Click(object sender, EventArgs e)
{
Close();
}
private void applyButton_Click(object sender, EventArgs e)
{
ApplyOptions();
}
private static bool IsWine => Process.GetProcessesByName("winlogon").Length == 0;
}
}