This commit is contained in:
2026-06-09 00:38:54 +07:00
parent b8b222632d
commit 466a9fac10
633 changed files with 109442 additions and 229 deletions

View File

@@ -575,11 +575,16 @@ namespace VTabs
void lockToFolder_twoColumns()
{
if (!isLocked) return;
if (!projectBrowserWrappingSupported) return;
if (window.GetMemberValue<int>("m_ViewMode") != 1) return;
if (folderGuid.IsNullOrEmpty()) return;
var iid = AssetDatabase.LoadAssetAtPath<Object>(AssetDatabase.GUIDToAssetPath(folderGuid)).GetInstanceID();
var folder = AssetDatabase.LoadAssetAtPath<Object>(AssetDatabase.GUIDToAssetPath(folderGuid));
if (!folder) return;
var iid = folder.GetInstanceID();
window.GetFieldValue("m_ListAreaState").SetFieldValue("m_SelectedInstanceIDs", new List<int> { iid });
@@ -592,6 +597,7 @@ namespace VTabs
void lockToFolder_oneColumn()
{
if (!isLocked) return;
if (!projectBrowserWrappingSupported) return;
if (window.GetMemberValue<int>("m_ViewMode") != 0) return;
if (folderGuid.IsNullOrEmpty()) return;
@@ -600,7 +606,11 @@ namespace VTabs
var folderPath = folderGuid.ToPath();
var folderIid = AssetDatabase.LoadAssetAtPath<Object>(folderPath).GetInstanceID();
var folder = AssetDatabase.LoadAssetAtPath<Object>(folderPath);
if (!folder) return;
var folderIid = folder.GetInstanceID();
data.SetMemberValue("m_rootInstanceID", folderIid);
@@ -905,19 +915,38 @@ namespace VTabs
static void UpdateGUIWrappingForBrowser(EditorWindow browser)
{
if (!browser.hasFocus) return;
if (!browser) return;
var hostView = browser.GetMemberValue("m_Parent", exceptionIfNotFound: false);
if (hostView == null) return;
var isWrapped = hostView.GetMemberValue<Delegate>("m_OnGUI", exceptionIfNotFound: false)?.Method.Name == nameof(WrappedBrowserOnGUI);
if (!projectBrowserWrappingSupported)
{
if (isWrapped)
RestoreDefaultBrowserGUI(browser);
if (browser.GetPropertyValue<bool>("isLocked", exceptionIfNotFound: false))
{
browser.SetPropertyValue("isLocked", false, exceptionIfNotFound: false);
UpdateBrowserTitle(browser);
}
return;
}
if (mi_VFavorites_CanBrowserBeWrapped != null && mi_VFavorites_CanBrowserBeWrapped.Invoke(null, new[] { browser }).Equals(false)) return;
var isLocked = browser.GetMemberValue<bool>("isLocked");
var isWrapped = browser.GetMemberValue("m_Parent").GetMemberValue<Delegate>("m_OnGUI").Method.Name == nameof(WrappedBrowserOnGUI);
if (!browser.hasFocus) return;
void wrap()
{
if (!isLocked) return;
if (isWrapped) return;
var hostView = browser.GetMemberValue("m_Parent");
var newDelegate = typeof(VTabs).GetMethod(nameof(WrappedBrowserOnGUI), maxBindingFlags).CreateDelegate(t_EditorWindowDelegate, browser);
hostView.SetMemberValue("m_OnGUI", newDelegate);
@@ -933,13 +962,7 @@ namespace VTabs
if (isLocked) return;
if (!isWrapped) return;
var hostView = browser.GetMemberValue("m_Parent");
var originalDelegate = hostView.InvokeMethod("CreateDelegate", "OnGUI");
hostView.SetMemberValue("m_OnGUI", originalDelegate);
browser.Repaint();
RestoreDefaultBrowserGUI(browser);
}
@@ -949,6 +972,27 @@ namespace VTabs
}
static void UpdateGUIWrappingForAllBrowsers() => allBrowsers.ForEach(r => UpdateGUIWrappingForBrowser(r));
static bool projectBrowserWrappingSupported => !Application.unityVersion.StartsWith("6000.3");
static void RestoreDefaultBrowserGUI(EditorWindow browser)
{
var hostView = browser.GetMemberValue("m_Parent", exceptionIfNotFound: false);
if (hostView == null) return;
try
{
var originalDelegate = hostView.InvokeMethod("CreateDelegate", "OnGUI");
hostView.SetMemberValue("m_OnGUI", originalDelegate);
browser.Repaint();
}
catch { }
}
static void WrappedBrowserOnGUI(EditorWindow browser)
{
var headerHeight = 26;

View File

@@ -308,9 +308,42 @@ namespace VTabs.Libs
public static T GetFieldValue<T>(this object o, string fieldName, bool exceptionIfNotFound = true) => (T)o.GetFieldValue(fieldName, exceptionIfNotFound);
public static T GetPropertyValue<T>(this object o, string propertyName, bool exceptionIfNotFound = true) => (T)o.GetPropertyValue(propertyName, exceptionIfNotFound);
public static T GetMemberValue<T>(this object o, string memberName, bool exceptionIfNotFound = true) => (T)o.GetMemberValue(memberName, exceptionIfNotFound);
public static T GetFieldValue<T>(this object o, string fieldName, bool exceptionIfNotFound = true)
{
var val = o.GetFieldValue(fieldName, exceptionIfNotFound);
if (val == null) return default;
if (typeof(T) == typeof(List<int>) && val is System.Collections.IEnumerable ienum && !(val is List<int>))
{
var list = new List<int>();
foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } }
return (T)(object)list;
}
return (T)val;
}
public static T GetPropertyValue<T>(this object o, string propertyName, bool exceptionIfNotFound = true)
{
var val = o.GetPropertyValue(propertyName, exceptionIfNotFound);
if (val == null) return default;
if (typeof(T) == typeof(List<int>) && val is System.Collections.IEnumerable ienum && !(val is List<int>))
{
var list = new List<int>();
foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } }
return (T)(object)list;
}
return (T)val;
}
public static T GetMemberValue<T>(this object o, string memberName, bool exceptionIfNotFound = true)
{
var val = o.GetMemberValue(memberName, exceptionIfNotFound);
if (val == null) return default;
if (typeof(T) == typeof(List<int>) && val is System.Collections.IEnumerable ienum && !(val is List<int>))
{
var list = new List<int>();
foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } }
return (T)(object)list;
}
return (T)val;
}
public static T InvokeMethod<T>(this object o, string methodName, params object[] parameters) => (T)o.InvokeMethod(methodName, parameters);