From dbe598f4a5fdf13a2a2e81c5e3e9d4691c1c5536 Mon Sep 17 00:00:00 2001 From: r Star Date: Sun, 19 Mar 2023 23:38:22 +0800 Subject: [PATCH] add openPropertyEditor --- .../Editor/BookmarkEverythingEditor.cs | 62 +++++++++++---- ...opertiesEditorWindowDoubleClickListener.cs | 75 +++++++++++++++++++ ...iesEditorWindowDoubleClickListener.cs.meta | 3 + 3 files changed, 124 insertions(+), 16 deletions(-) create mode 100644 BookmarkEverything/Assets/BookmarkEverything/Editor/OpenPropertiesEditorWindowDoubleClickListener.cs create mode 100644 BookmarkEverything/Assets/BookmarkEverything/Editor/OpenPropertiesEditorWindowDoubleClickListener.cs.meta diff --git a/BookmarkEverything/Assets/BookmarkEverything/Editor/BookmarkEverythingEditor.cs b/BookmarkEverything/Assets/BookmarkEverything/Editor/BookmarkEverythingEditor.cs index f8adad6..26c6029 100644 --- a/BookmarkEverything/Assets/BookmarkEverything/Editor/BookmarkEverythingEditor.cs +++ b/BookmarkEverything/Assets/BookmarkEverything/Editor/BookmarkEverythingEditor.cs @@ -7,8 +7,10 @@ using System.Linq; using System.Reflection; using System.Text; +using JD.AssetizerEditor; using UnityEditor; using UnityEditor.SceneManagement; +using UnityEditor.UIElements; using UnityEngine; using UnityEngine.SceneManagement; using Object = UnityEngine.Object; @@ -55,6 +57,7 @@ public class BookmarkEverythingEditor : EditorWindow private PingTypes _pingType; private bool _visualMode; + private bool _openAsProperties; private bool _autoClose; private bool _showFullPath; private bool _showFullPathForFolder; @@ -64,6 +67,7 @@ public class BookmarkEverythingEditor : EditorWindow private int _projectFinderTabIndex = 0; private bool _visualModeChanged; private bool _controlVisualMode; + private bool _controlOpenAsProperties; private bool _controlAutoClose; private bool _autoCloseChanged; private bool _controlShowFullPath; @@ -552,23 +556,39 @@ private void DrawInnerSettings() EditorGUILayout.BeginHorizontal(); - label = "Visual Mode(Experimental!) : "; - _controlVisualMode = _visualMode; - _visualMode = EditorGUILayout.Toggle(label , _visualMode); + label = "OpenAsProperties"; + _controlOpenAsProperties = _openAsProperties; + _openAsProperties = EditorGUILayout.Toggle(label , _openAsProperties); - if (_controlVisualMode != _visualMode) - { - _visualModeChanged = true; - } + // if (_controlOpenAsProperties != _openAsProperties) + // { + // _visualModeChanged = true; + // } - if (_visualModeChanged) + Debug.Log($"{_openAsProperties}"); + if (_controlOpenAsProperties != _openAsProperties) { - VisualMode(_visualMode); - _currentSettings.VisualMode = _visualMode; + _currentSettings.OpenAsProperties = _openAsProperties; _currentSettings.Save(); - _visualModeChanged = false; } + // label = "Visual Mode(Experimental!) : "; + // _controlVisualMode = _visualMode; + // _visualMode = EditorGUILayout.Toggle(label , _visualMode); + // + // if (_controlVisualMode != _visualMode) + // { + // _visualModeChanged = true; + // } + // + // if (_visualModeChanged) + // { + // VisualMode(_visualMode); + // _currentSettings.VisualMode = _visualMode; + // _currentSettings.Save(); + // _visualModeChanged = false; + // } + EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); @@ -663,12 +683,20 @@ private void DrawProjectFinderEntries(string category) if (Selection.activeObject) Selection.activeObject = null; if (Path.HasExtension(path)) { - var asset = AssetDatabase.LoadMainAssetAtPath(path); - var entryIsScene = asset is SceneAsset; - var prefabType = PrefabUtility.GetPrefabType(asset); - if (entryIsScene) SaveSceneDialog(path); - else if (prefabType == PrefabType.Prefab) AssetDatabase.OpenAsset(asset); + var asset = AssetDatabase.LoadMainAssetAtPath(path); Selection.activeObject = asset; + Debug.Log($"{_openAsProperties}"); + if (_openAsProperties) + { + OpenPropertiesEditorWindowDoubleClickListener.OpenInPropertyEditor(asset); + } + else + { + var entryIsScene = asset is SceneAsset; + var prefabType = PrefabUtility.GetPrefabType(asset); + if (entryIsScene) SaveSceneDialog(path); + else if (prefabType == PrefabType.Prefab) AssetDatabase.OpenAsset(asset); + } } else OpenDir(path); } @@ -1016,6 +1044,7 @@ private void LoadSettings() _autoClose = _currentSettings.AutoClose; _showFullPath = _currentSettings.ShowFullPath; _showFullPathForFolder = _currentSettings.ShowFullPathForFolders; + _openAsProperties = _currentSettings.OpenAsProperties; } private void OnEnable() @@ -1288,6 +1317,7 @@ public class SaveData public bool ShowFullPath; public bool ShowFullPathForFolders = true; public bool VisualMode; + public bool OpenAsProperties; public List EntryData = new List(); public PingTypes PingType; diff --git a/BookmarkEverything/Assets/BookmarkEverything/Editor/OpenPropertiesEditorWindowDoubleClickListener.cs b/BookmarkEverything/Assets/BookmarkEverything/Editor/OpenPropertiesEditorWindowDoubleClickListener.cs new file mode 100644 index 0000000..2ce9c20 --- /dev/null +++ b/BookmarkEverything/Assets/BookmarkEverything/Editor/OpenPropertiesEditorWindowDoubleClickListener.cs @@ -0,0 +1,75 @@ + +using System.Reflection; +using UnityEditor; +using UnityEditor.Callbacks; +using UnityEngine; + +namespace JD.AssetizerEditor +{ + /// + /// Listens (order 100) for everything except folders. + /// Opens the asset in a new window (like an unchangeable inspector). + /// Forum thread: https://forum.unity.com/threads/alt-p-is-a-godsent.834703/ + /// + public static class OpenPropertiesEditorWindowDoubleClickListener + { + private static MethodInfo openPropertyEditorInfo; + private static System.Type[] callTypes = new[] { typeof(Object), typeof(bool) }; + private static object[] callOpenBuffer = { null, true }; + + /// + /// Listens (order 100) for everything except folders. + /// + /// + /// + /// True if opening the asset is handled + [OnOpenAsset(100)] + private static bool HandleOpenAsset(int instanceID, int line) + { + Object obj = EditorUtility.InstanceIDToObject(instanceID); + if (obj == null) + { + return false; + } + + if (IsFolder(obj)) + { + return false; + } + + return OpenInPropertyEditor(obj); + } + + private static bool IsFolder(Object obj) + { + string assetPath = AssetDatabase.GetAssetPath(obj); + return !string.IsNullOrEmpty(assetPath) && AssetDatabase.IsValidFolder(assetPath); + } + + public static bool OpenInPropertyEditor(Object asset) + { + if (openPropertyEditorInfo == null) + { + System.Type propertyEditorType = typeof(Editor).Assembly.GetType("UnityEditor.PropertyEditor"); + + // Get specific method, since there is an overload starting with Unity 2021.2 + openPropertyEditorInfo = propertyEditorType.GetMethod( + "OpenPropertyEditor", + BindingFlags.Static | BindingFlags.NonPublic, + null, + callTypes, + null); + } + + + if (openPropertyEditorInfo != null) + { + callOpenBuffer[0] = asset; + openPropertyEditorInfo.Invoke(null, callOpenBuffer); + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/BookmarkEverything/Assets/BookmarkEverything/Editor/OpenPropertiesEditorWindowDoubleClickListener.cs.meta b/BookmarkEverything/Assets/BookmarkEverything/Editor/OpenPropertiesEditorWindowDoubleClickListener.cs.meta new file mode 100644 index 0000000..4b3304f --- /dev/null +++ b/BookmarkEverything/Assets/BookmarkEverything/Editor/OpenPropertiesEditorWindowDoubleClickListener.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 927d56f17947449fbf5a45566ce0ff49 +timeCreated: 1679235964 \ No newline at end of file