update
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user