2025-03-31 14:55:24 +08:00
using System ;
using System.IO ;
using System.Reflection ;
using UnityEditor ;
using UnityEngine ;
namespace HybridCLR.Editor.Installer
{
public class InstallerWindow : EditorWindow
{
private InstallerController _controller ;
private bool _installFromDir ;
private string _installLibil2cppWithHybridclrSourceDir ;
private void OnEnable ()
{
_controller = new InstallerController ();
}
private void OnGUI ()
{
var rect = new Rect
{
x = EditorGUIUtility . currentViewWidth - 24 ,
y = 5 ,
width = 24 ,
height = 24
};
var content = EditorGUIUtility . IconContent ( "Settings" );
content . tooltip = "HybridCLR Settings" ;
if ( GUI . Button ( rect , content , GUI . skin . GetStyle ( "IconButton" )))
{
SettingsService . OpenProjectSettings ( "Project/HybridCLR Settings" );
}
bool hasInstall = _controller . HasInstalledHybridCLR ();
GUILayout . Space ( 10f );
EditorGUILayout . BeginVertical ( "box" );
EditorGUILayout . LabelField ( $"Installed: {hasInstall}" , EditorStyles . boldLabel );
GUILayout . Space ( 10f );
2025-06-12 18:00:06 +08:00
EditorGUILayout . LabelField ( $"Package Version: v{_controller.PackageVersion}" );
2025-03-31 14:55:24 +08:00
GUILayout . Space ( 5f );
2025-06-12 18:00:06 +08:00
EditorGUILayout . LabelField ( $"Installed Version: v{_controller.InstalledLibil2cppVersion ?? " Unknown "}" );
2025-03-31 14:55:24 +08:00
GUILayout . Space ( 5f );
GUILayout . Space ( 10f );
InstallerController . CompatibleType compatibleType = _controller . GetCompatibleType ();
if ( compatibleType != InstallerController . CompatibleType . Incompatible )
{
if ( compatibleType == InstallerController . CompatibleType . MaybeIncompatible )
{
EditorGUILayout . HelpBox ( $"Maybe incompatible with current version, recommend minimum compatible version:{_controller.GetCurrentUnityVersionMinCompatibleVersionStr()}" , MessageType . Warning );
}
EditorGUILayout . BeginHorizontal ();
_installFromDir = EditorGUILayout . Toggle ( "Copy libil2cpp from local" , _installFromDir , GUILayout . MinWidth ( 100 ));
EditorGUI . BeginDisabledGroup (! _installFromDir );
EditorGUILayout . TextField ( _installLibil2cppWithHybridclrSourceDir , GUILayout . Width ( 400 ));
if ( GUILayout . Button ( "Choose" , GUILayout . Width ( 100 )))
{
_installLibil2cppWithHybridclrSourceDir = EditorUtility . OpenFolderPanel ( "Select libil2cpp" , Application . dataPath , "libil2cpp" );
}
EditorGUI . EndDisabledGroup ();
EditorGUILayout . EndHorizontal ();
GUILayout . Space ( 20f );
EditorGUILayout . BeginHorizontal ();
if ( GUILayout . Button ( "Install" , GUILayout . Width ( 100 )))
{
InstallLocalHybridCLR ();
GUIUtility . ExitGUI ();
}
EditorGUILayout . EndHorizontal ();
}
else
{
EditorGUILayout . HelpBox ( $"Incompatible with current version, minimum compatible version:{_controller.GetCurrentUnityVersionMinCompatibleVersionStr()}" , MessageType . Error );
}
EditorGUILayout . EndVertical ();
}
private void InstallLocalHybridCLR ()
{
if ( _installFromDir )
{
if (! Directory . Exists ( _installLibil2cppWithHybridclrSourceDir ))
{
Debug . LogError ( $"Source libil2cpp:'{_installLibil2cppWithHybridclrSourceDir}' doesn't exist." );
return ;
}
if (! File . Exists ( $"{_installLibil2cppWithHybridclrSourceDir}/il2cpp-config.h" ) || ! File . Exists ( $"{_installLibil2cppWithHybridclrSourceDir}/hybridclr/RuntimeApi.cpp" ))
{
Debug . LogError ( $"Source libil2cpp:' {_installLibil2cppWithHybridclrSourceDir} ' is invalid" );
return ;
}
_controller . InstallFromLocal ( _installLibil2cppWithHybridclrSourceDir );
}
else
{
_controller . InstallDefaultHybridCLR ();
}
}
}
}