mirror of
https://github.com/sinai-dev/UnityExplorer.git
synced 2025-06-16 14:17:51 +08:00
Use UniverseLib PanelBase/PanelDragger
This commit is contained in:
parent
7e0f98ef91
commit
3d66493f9c
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityExplorer.CSConsole.Lexers;
|
using UnityExplorer.CSConsole.Lexers;
|
||||||
|
using UnityExplorer.UI.Panels;
|
||||||
using UnityExplorer.UI.Widgets.AutoComplete;
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
|
@ -268,9 +268,9 @@ namespace UnityExplorer.CacheObject
|
|||||||
|
|
||||||
if (cell.CopyButton != null)
|
if (cell.CopyButton != null)
|
||||||
{
|
{
|
||||||
bool hasEvaluated = State != ValueState.NotEvaluated && State != ValueState.Exception;
|
bool canCopy = State != ValueState.NotEvaluated && State != ValueState.Exception;
|
||||||
cell.CopyButton.Component.gameObject.SetActive(hasEvaluated);
|
cell.CopyButton.Component.gameObject.SetActive(canCopy);
|
||||||
cell.PasteButton.Component.gameObject.SetActive(hasEvaluated && this.CanWrite);
|
cell.PasteButton.Component.gameObject.SetActive(canCopy && this.CanWrite);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!evaluated)
|
if (!evaluated)
|
||||||
|
@ -4,6 +4,7 @@ using System.Collections.Specialized;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
|
using UnityExplorer.UI.Panels;
|
||||||
using UnityExplorer.UI.Widgets.AutoComplete;
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
|
@ -14,7 +14,7 @@ namespace UnityExplorer
|
|||||||
public static class ExplorerCore
|
public static class ExplorerCore
|
||||||
{
|
{
|
||||||
public const string NAME = "UnityExplorer";
|
public const string NAME = "UnityExplorer";
|
||||||
public const string VERSION = "4.7.1";
|
public const string VERSION = "4.7.2";
|
||||||
public const string AUTHOR = "Sinai";
|
public const string AUTHOR = "Sinai";
|
||||||
public const string GUID = "com.sinai.unityexplorer";
|
public const string GUID = "com.sinai.unityexplorer";
|
||||||
|
|
||||||
@ -57,8 +57,6 @@ namespace UnityExplorer
|
|||||||
// Default delay is 1 second which is usually enough.
|
// Default delay is 1 second which is usually enough.
|
||||||
static void LateInit()
|
static void LateInit()
|
||||||
{
|
{
|
||||||
Log($"Setting up late core features...");
|
|
||||||
|
|
||||||
SceneHandler.Init();
|
SceneHandler.Init();
|
||||||
|
|
||||||
Log($"Creating UI...");
|
Log($"Creating UI...");
|
||||||
@ -66,6 +64,8 @@ namespace UnityExplorer
|
|||||||
UIManager.InitUI();
|
UIManager.InitUI();
|
||||||
|
|
||||||
Log($"{NAME} {VERSION} ({Universe.Context}) initialized.");
|
Log($"{NAME} {VERSION} ({Universe.Context}) initialized.");
|
||||||
|
|
||||||
|
// InspectorManager.Inspect(typeof(Tests.TestClass));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void Update()
|
internal static void Update()
|
||||||
|
@ -6,6 +6,7 @@ using UnityExplorer.UI;
|
|||||||
using UnityExplorer.UI.Panels;
|
using UnityExplorer.UI.Panels;
|
||||||
using UniverseLib.Input;
|
using UniverseLib.Input;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Panels;
|
||||||
using UniverseLib.Utility;
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.Inspectors
|
namespace UnityExplorer.Inspectors
|
||||||
@ -16,7 +17,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
UI
|
UI
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MouseInspector : UIPanel
|
public class MouseInspector : UEPanel
|
||||||
{
|
{
|
||||||
public static MouseInspector Instance { get; private set; }
|
public static MouseInspector Instance { get; private set; }
|
||||||
|
|
||||||
@ -43,6 +44,9 @@ namespace UnityExplorer.Inspectors
|
|||||||
public override UIManager.Panels PanelType => UIManager.Panels.MouseInspector;
|
public override UIManager.Panels PanelType => UIManager.Panels.MouseInspector;
|
||||||
public override int MinWidth => -1;
|
public override int MinWidth => -1;
|
||||||
public override int MinHeight => -1;
|
public override int MinHeight => -1;
|
||||||
|
public override Vector2 DefaultAnchorMin => Vector2.zero;
|
||||||
|
public override Vector2 DefaultAnchorMax => Vector2.zero;
|
||||||
|
|
||||||
public override bool CanDragAndResize => false;
|
public override bool CanDragAndResize => false;
|
||||||
public override bool NavButtonWanted => false;
|
public override bool NavButtonWanted => false;
|
||||||
public override bool ShouldSaveActiveState => false;
|
public override bool ShouldSaveActiveState => false;
|
||||||
@ -52,7 +56,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
internal Text objPathLabel;
|
internal Text objPathLabel;
|
||||||
internal Text mousePosLabel;
|
internal Text mousePosLabel;
|
||||||
|
|
||||||
public MouseInspector()
|
public MouseInspector(UIBase owner) : base(owner)
|
||||||
{
|
{
|
||||||
Instance = this;
|
Instance = this;
|
||||||
worldInspector = new WorldInspector();
|
worldInspector = new WorldInspector();
|
||||||
@ -77,11 +81,12 @@ namespace UnityExplorer.Inspectors
|
|||||||
|
|
||||||
CurrentInspector.OnBeginMouseInspect();
|
CurrentInspector.OnBeginMouseInspect();
|
||||||
|
|
||||||
PanelDragger.ForceEnd();
|
PanelManager.ForceEndResize();
|
||||||
UIManager.NavBarRect.gameObject.SetActive(false);
|
UIManager.NavBarRect.gameObject.SetActive(false);
|
||||||
UIManager.PanelHolder.SetActive(false);
|
UIManager.UiBase.Panels.PanelHolder.SetActive(false);
|
||||||
|
UIManager.UiBase.SetOnTop();
|
||||||
|
|
||||||
UIRoot.SetActive(true);
|
SetActive(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void ClearHitData()
|
internal void ClearHitData()
|
||||||
@ -99,7 +104,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
Inspecting = false;
|
Inspecting = false;
|
||||||
|
|
||||||
UIManager.NavBarRect.gameObject.SetActive(true);
|
UIManager.NavBarRect.gameObject.SetActive(true);
|
||||||
UIManager.PanelHolder.SetActive(true);
|
UIManager.UiBase.Panels.PanelHolder.SetActive(true);
|
||||||
|
|
||||||
Dropdown drop = InspectorPanel.Instance.MouseInspectDropdown;
|
Dropdown drop = InspectorPanel.Instance.MouseInspectDropdown;
|
||||||
if (drop.transform.Find("Dropdown List") is Transform list)
|
if (drop.transform.Find("Dropdown List") is Transform list)
|
||||||
@ -180,21 +185,23 @@ namespace UnityExplorer.Inspectors
|
|||||||
|
|
||||||
// UI Construction
|
// UI Construction
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
public override void SetDefaultSizeAndPosition()
|
||||||
{
|
{
|
||||||
|
base.SetDefaultSizeAndPosition();
|
||||||
|
|
||||||
Rect.anchorMin = Vector2.zero;
|
Rect.anchorMin = Vector2.zero;
|
||||||
Rect.anchorMax = Vector2.zero;
|
Rect.anchorMax = Vector2.zero;
|
||||||
Rect.pivot = new Vector2(0.5f, 1);
|
Rect.pivot = new Vector2(0.5f, 1);
|
||||||
Rect.sizeDelta = new Vector2(700, 150);
|
Rect.sizeDelta = new Vector2(700, 150);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ConstructPanelContent()
|
protected override void ConstructPanelContent()
|
||||||
{
|
{
|
||||||
// hide title bar
|
// hide title bar
|
||||||
this.TitleBar.SetActive(false);
|
this.TitleBar.SetActive(false);
|
||||||
this.UIRoot.transform.SetParent(UIManager.UIRoot.transform, false);
|
this.UIRoot.transform.SetParent(UIManager.UIRoot.transform, false);
|
||||||
|
|
||||||
GameObject inspectContent = UIFactory.CreateVerticalGroup(this.uiContent, "InspectContent", true, true, true, true, 3, new Vector4(2, 2, 2, 2));
|
GameObject inspectContent = UIFactory.CreateVerticalGroup(this.ContentRoot, "InspectContent", true, true, true, true, 3, new Vector4(2, 2, 2, 2));
|
||||||
UIFactory.SetLayoutElement(inspectContent, flexibleWidth: 9999, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(inspectContent, flexibleWidth: 9999, flexibleHeight: 9999);
|
||||||
|
|
||||||
// Title text
|
// Title text
|
||||||
|
@ -237,7 +237,7 @@ namespace UnityExplorer.Tests
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
Il2CppSystem.Type cppType = Il2CppType.Of<CameraClearFlags>();
|
Il2CppSystem.Type cppType = Il2CppType.Of<CameraClearFlags>();
|
||||||
if (cppType != null)
|
if (cppType is not null)
|
||||||
{
|
{
|
||||||
Il2CppSystem.Object boxedEnum = Il2CppSystem.Enum.Parse(cppType, "Color");
|
Il2CppSystem.Object boxedEnum = Il2CppSystem.Enum.Parse(cppType, "Color");
|
||||||
IL2CPP_listOfBoxedObjects.Add(boxedEnum);
|
IL2CPP_listOfBoxedObjects.Add(boxedEnum);
|
||||||
|
@ -68,7 +68,7 @@ namespace UnityExplorer.UI
|
|||||||
yield return null;
|
yield return null;
|
||||||
yield return null;
|
yield return null;
|
||||||
|
|
||||||
foreach (Panels.UIPanel panel in UIManager.UIPanels.Values)
|
foreach (Panels.UEPanel panel in UIManager.UIPanels.Values)
|
||||||
{
|
{
|
||||||
panel.EnsureValidSize();
|
panel.EnsureValidSize();
|
||||||
panel.EnsureValidPosition();
|
panel.EnsureValidPosition();
|
||||||
|
19
src/UI/ExplorerUIBase.cs
Normal file
19
src/UI/ExplorerUIBase.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Panels;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI
|
||||||
|
{
|
||||||
|
internal class ExplorerUIBase : UIBase
|
||||||
|
{
|
||||||
|
public ExplorerUIBase(string id, Action updateMethod) : base(id, updateMethod) { }
|
||||||
|
|
||||||
|
protected override PanelManager CreatePanelManager()
|
||||||
|
{
|
||||||
|
return new UEPanelManager(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,7 @@ using System.Linq;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.UI.Panels;
|
using UnityExplorer.UI.Panels;
|
||||||
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.Input;
|
using UniverseLib.Input;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
@ -12,20 +13,25 @@ using UniverseLib.UI.Widgets.ButtonList;
|
|||||||
using UniverseLib.UI.Widgets.ScrollView;
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
using UniverseLib.Utility;
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Widgets.AutoComplete
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
// Shared modal panel for "AutoComplete" suggestions.
|
// Shared modal panel for "AutoComplete" suggestions.
|
||||||
// A data source implements ISuggestionProvider and uses TakeOwnership and ReleaseOwnership
|
// A data source implements ISuggestionProvider and uses TakeOwnership and ReleaseOwnership
|
||||||
// for control, and SetSuggestions to set the actual suggestion data.
|
// for control, and SetSuggestions to set the actual suggestion data.
|
||||||
|
|
||||||
public class AutoCompleteModal : UIPanel
|
public class AutoCompleteModal : UEPanel
|
||||||
{
|
{
|
||||||
public static AutoCompleteModal Instance => UIManager.GetPanel<AutoCompleteModal>(UIManager.Panels.AutoCompleter);
|
public static AutoCompleteModal Instance => UIManager.GetPanel<AutoCompleteModal>(UIManager.Panels.AutoCompleter);
|
||||||
|
|
||||||
public override string Name => "AutoCompleter";
|
public override string Name => "AutoCompleter";
|
||||||
public override UIManager.Panels PanelType => UIManager.Panels.AutoCompleter;
|
public override UIManager.Panels PanelType => UIManager.Panels.AutoCompleter;
|
||||||
public override int MinWidth => -1;
|
|
||||||
public override int MinHeight => -1;
|
public override int MinWidth => 100;
|
||||||
|
public override int MinHeight => 25;
|
||||||
|
public override Vector2 DefaultAnchorMin => new(MIN_X, 0.4f);
|
||||||
|
public override Vector2 DefaultAnchorMax => new(0.68f, MAX_Y);
|
||||||
|
const float MIN_X = 0.42f;
|
||||||
|
const float MAX_Y = 0.6f;
|
||||||
|
|
||||||
public override bool CanDragAndResize => true;
|
public override bool CanDragAndResize => true;
|
||||||
public override bool ShouldSaveActiveState => false;
|
public override bool ShouldSaveActiveState => false;
|
||||||
@ -44,10 +50,10 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
|
|
||||||
public static bool Suggesting(ISuggestionProvider handler) => CurrentHandler == handler && Instance.UIRoot.activeSelf;
|
public static bool Suggesting(ISuggestionProvider handler) => CurrentHandler == handler && Instance.UIRoot.activeSelf;
|
||||||
|
|
||||||
public AutoCompleteModal()
|
public AutoCompleteModal(UIBase owner) : base(owner)
|
||||||
{
|
{
|
||||||
OnPanelsReordered += UIPanel_OnPanelsReordered;
|
UIManager.UiBase.Panels.OnPanelsReordered += UIPanel_OnPanelsReordered;
|
||||||
OnClickedOutsidePanels += AutoCompleter_OnClickedOutsidePanels;
|
UIManager.UiBase.Panels.OnClickedOutsidePanels += AutoCompleter_OnClickedOutsidePanels;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TakeOwnership(ISuggestionProvider provider)
|
public static void TakeOwnership(ISuggestionProvider provider)
|
||||||
@ -263,7 +269,7 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
if (!this.UIRoot || !this.UIRoot.activeInHierarchy)
|
if (!this.UIRoot || !this.UIRoot.activeInHierarchy)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (this.UIRoot.transform.GetSiblingIndex() != UIManager.PanelHolder.transform.childCount - 1)
|
if (this.UIRoot.transform.GetSiblingIndex() != UIManager.UiBase.Panels.PanelHolder.transform.childCount - 1)
|
||||||
{
|
{
|
||||||
if (CurrentHandler != null)
|
if (CurrentHandler != null)
|
||||||
ReleaseOwnership(CurrentHandler);
|
ReleaseOwnership(CurrentHandler);
|
||||||
@ -272,46 +278,36 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// UI Construction
|
public override void OnFinishResize()
|
||||||
|
|
||||||
const float MIN_X = 0.42f;
|
|
||||||
const float MAX_Y = 0.6f;
|
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
|
||||||
{
|
{
|
||||||
Rect.pivot = new Vector2(0f, 1f);
|
float xDiff = Rect.anchorMin.x - MIN_X;
|
||||||
Rect.anchorMin = new Vector2(MIN_X, 0.4f);
|
float yDiff = Rect.anchorMax.y - MAX_Y;
|
||||||
Rect.anchorMax = new Vector2(0.68f, MAX_Y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnFinishResize(RectTransform panel)
|
|
||||||
{
|
|
||||||
float xDiff = panel.anchorMin.x - MIN_X;
|
|
||||||
float yDiff = panel.anchorMax.y - MAX_Y;
|
|
||||||
|
|
||||||
if (xDiff != 0 || yDiff != 0)
|
if (xDiff != 0 || yDiff != 0)
|
||||||
{
|
{
|
||||||
panel.anchorMin = new(MIN_X, panel.anchorMin.y - yDiff);
|
Rect.anchorMin = new(MIN_X, Rect.anchorMin.y - yDiff);
|
||||||
panel.anchorMax = new(panel.anchorMax.x - xDiff, MAX_Y);
|
Rect.anchorMax = new(Rect.anchorMax.x - xDiff, MAX_Y);
|
||||||
}
|
}
|
||||||
|
|
||||||
base.OnFinishResize(panel);
|
base.OnFinishResize();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ConstructPanelContent()
|
// UI Construction
|
||||||
|
|
||||||
|
protected override void ConstructPanelContent()
|
||||||
{
|
{
|
||||||
// hide the titlebar
|
// hide the titlebar
|
||||||
this.TitleBar.gameObject.SetActive(false);
|
this.TitleBar.gameObject.SetActive(false);
|
||||||
|
|
||||||
buttonListDataHandler = new ButtonListHandler<Suggestion, ButtonCell>(scrollPool, GetEntries, SetCell, ShouldDisplay, OnCellClicked);
|
buttonListDataHandler = new ButtonListHandler<Suggestion, ButtonCell>(scrollPool, GetEntries, SetCell, ShouldDisplay, OnCellClicked);
|
||||||
|
|
||||||
scrollPool = UIFactory.CreateScrollPool<ButtonCell>(this.uiContent, "AutoCompleter", out GameObject scrollObj,
|
scrollPool = UIFactory.CreateScrollPool<ButtonCell>(this.ContentRoot, "AutoCompleter", out GameObject scrollObj,
|
||||||
out GameObject scrollContent);
|
out GameObject scrollContent);
|
||||||
scrollPool.Initialize(buttonListDataHandler);
|
scrollPool.Initialize(buttonListDataHandler);
|
||||||
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(scrollContent, true, false, true, false);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(scrollContent, true, false, true, false);
|
||||||
|
|
||||||
navigationTipRow = UIFactory.CreateHorizontalGroup(this.uiContent, "BottomRow", true, true, true, true, 0, new Vector4(2, 2, 2, 2));
|
navigationTipRow = UIFactory.CreateHorizontalGroup(this.ContentRoot, "BottomRow", true, true, true, true, 0, new Vector4(2, 2, 2, 2));
|
||||||
UIFactory.SetLayoutElement(navigationTipRow, minHeight: 20, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(navigationTipRow, minHeight: 20, flexibleWidth: 9999);
|
||||||
UIFactory.CreateLabel(navigationTipRow, "HelpText", "Up/Down to select, Enter to use, Esc to close",
|
UIFactory.CreateLabel(navigationTipRow, "HelpText", "Up/Down to select, Enter to use, Esc to close",
|
||||||
TextAnchor.MiddleLeft, Color.grey, false, 13);
|
TextAnchor.MiddleLeft, Color.grey, false, 13);
|
||||||
|
@ -10,12 +10,15 @@ using UniverseLib.UI.Widgets;
|
|||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
public class CSConsolePanel : UIPanel
|
public class CSConsolePanel : UEPanel
|
||||||
{
|
{
|
||||||
public override string Name => "C# Console";
|
public override string Name => "C# Console";
|
||||||
public override UIManager.Panels PanelType => UIManager.Panels.CSConsole;
|
public override UIManager.Panels PanelType => UIManager.Panels.CSConsole;
|
||||||
|
|
||||||
public override int MinWidth => 750;
|
public override int MinWidth => 750;
|
||||||
public override int MinHeight => 300;
|
public override int MinHeight => 300;
|
||||||
|
public override Vector2 DefaultAnchorMin => new(0.4f, 0.175f);
|
||||||
|
public override Vector2 DefaultAnchorMax => new(0.85f, 0.925f);
|
||||||
|
|
||||||
public InputFieldScroller InputScroller { get; private set; }
|
public InputFieldScroller InputScroller { get; private set; }
|
||||||
public InputFieldRef Input => InputScroller.InputField;
|
public InputFieldRef Input => InputScroller.InputField;
|
||||||
@ -35,6 +38,10 @@ namespace UnityExplorer.UI.Panels
|
|||||||
public Action<bool> OnAutoIndentToggled;
|
public Action<bool> OnAutoIndentToggled;
|
||||||
public Action OnPanelResized;
|
public Action OnPanelResized;
|
||||||
|
|
||||||
|
public CSConsolePanel(UIBase owner) : base(owner)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
private void InvokeOnValueChanged(string value)
|
private void InvokeOnValueChanged(string value)
|
||||||
{
|
{
|
||||||
if (value.Length == UniversalUI.MAX_INPUTFIELD_CHARS)
|
if (value.Length == UniversalUI.MAX_INPUTFIELD_CHARS)
|
||||||
@ -52,24 +59,16 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
// UI Construction
|
// UI Construction
|
||||||
|
|
||||||
public override void OnFinishResize(RectTransform panel)
|
public override void OnFinishResize()
|
||||||
{
|
{
|
||||||
OnPanelResized?.Invoke();
|
OnPanelResized?.Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
protected override void ConstructPanelContent()
|
||||||
{
|
|
||||||
Rect.localPosition = Vector2.zero;
|
|
||||||
Rect.pivot = new Vector2(0f, 1f);
|
|
||||||
Rect.anchorMin = new Vector2(0.4f, 0.175f);
|
|
||||||
Rect.anchorMax = new Vector2(0.85f, 0.925f);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void ConstructPanelContent()
|
|
||||||
{
|
{
|
||||||
// Tools Row
|
// Tools Row
|
||||||
|
|
||||||
GameObject toolsRow = UIFactory.CreateHorizontalGroup(this.uiContent, "ToggleRow", false, false, true, true, 5, new Vector4(8, 8, 10, 5),
|
GameObject toolsRow = UIFactory.CreateHorizontalGroup(this.ContentRoot, "ToggleRow", false, false, true, true, 5, new Vector4(8, 8, 10, 5),
|
||||||
default, TextAnchor.MiddleLeft);
|
default, TextAnchor.MiddleLeft);
|
||||||
UIFactory.SetLayoutElement(toolsRow, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(toolsRow, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
||||||
|
|
||||||
@ -118,7 +117,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
// Console Input
|
// Console Input
|
||||||
|
|
||||||
GameObject inputArea = UIFactory.CreateUIObject("InputGroup", uiContent);
|
GameObject inputArea = UIFactory.CreateUIObject("InputGroup", ContentRoot);
|
||||||
UIFactory.SetLayoutElement(inputArea, flexibleWidth: 9999, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(inputArea, flexibleWidth: 9999, flexibleHeight: 9999);
|
||||||
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(inputArea, false, true, true, true);
|
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(inputArea, false, true, true, true);
|
||||||
inputArea.AddComponent<Image>().color = Color.white;
|
inputArea.AddComponent<Image>().color = Color.white;
|
||||||
|
@ -7,14 +7,18 @@ using UniverseLib.Utility;
|
|||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
public class ClipboardPanel : UIPanel
|
public class ClipboardPanel : UEPanel
|
||||||
{
|
{
|
||||||
public static object Current { get; private set; }
|
public static object Current { get; private set; }
|
||||||
|
|
||||||
public override UIManager.Panels PanelType => UIManager.Panels.Clipboard;
|
|
||||||
public override string Name => "Clipboard";
|
public override string Name => "Clipboard";
|
||||||
|
public override UIManager.Panels PanelType => UIManager.Panels.Clipboard;
|
||||||
|
|
||||||
public override int MinWidth => 500;
|
public override int MinWidth => 500;
|
||||||
public override int MinHeight => 95;
|
public override int MinHeight => 95;
|
||||||
|
public override Vector2 DefaultAnchorMin => new(0.1f, 0.05f);
|
||||||
|
public override Vector2 DefaultAnchorMax => new(0.4f, 0.15f);
|
||||||
|
|
||||||
public override bool CanDragAndResize => true;
|
public override bool CanDragAndResize => true;
|
||||||
public override bool NavButtonWanted => true;
|
public override bool NavButtonWanted => true;
|
||||||
public override bool ShouldSaveActiveState => true;
|
public override bool ShouldSaveActiveState => true;
|
||||||
@ -22,6 +26,10 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
private static Text CurrentPasteLabel;
|
private static Text CurrentPasteLabel;
|
||||||
|
|
||||||
|
public ClipboardPanel(UIBase owner) : base(owner)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public static void Copy(object obj)
|
public static void Copy(object obj)
|
||||||
{
|
{
|
||||||
Current = obj;
|
Current = obj;
|
||||||
@ -66,21 +74,21 @@ namespace UnityExplorer.UI.Panels
|
|||||||
InspectorManager.Inspect(Current);
|
InspectorManager.Inspect(Current);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
public override void SetDefaultSizeAndPosition()
|
||||||
{
|
{
|
||||||
|
base.SetDefaultSizeAndPosition();
|
||||||
|
|
||||||
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, MinWidth);
|
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, MinWidth);
|
||||||
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, MinHeight);
|
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, MinHeight);
|
||||||
this.Rect.anchorMin = new Vector2(0.1f, 0.05f);
|
|
||||||
this.Rect.anchorMax = new Vector2(0.4f, 0.15f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ConstructPanelContent()
|
protected override void ConstructPanelContent()
|
||||||
{
|
{
|
||||||
this.UIRoot.GetComponent<Image>().color = new(0.1f, 0.1f, 0.1f);
|
this.UIRoot.GetComponent<Image>().color = new(0.1f, 0.1f, 0.1f);
|
||||||
|
|
||||||
// Actual panel content
|
// Actual panel content
|
||||||
|
|
||||||
GameObject firstRow = UIFactory.CreateHorizontalGroup(uiContent, "FirstRow", false, false, true, true, 5, new(2, 2, 2, 2), new(1, 1, 1, 0));
|
GameObject firstRow = UIFactory.CreateHorizontalGroup(ContentRoot, "FirstRow", false, false, true, true, 5, new(2, 2, 2, 2), new(1, 1, 1, 0));
|
||||||
UIFactory.SetLayoutElement(firstRow, minHeight: 25, flexibleWidth: 999);
|
UIFactory.SetLayoutElement(firstRow, minHeight: 25, flexibleWidth: 999);
|
||||||
|
|
||||||
// Title for "Current Paste:"
|
// Title for "Current Paste:"
|
||||||
@ -93,7 +101,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
clearButton.OnClick += () => Copy(null);
|
clearButton.OnClick += () => Copy(null);
|
||||||
|
|
||||||
// Current Paste info row
|
// Current Paste info row
|
||||||
GameObject currentPasteHolder = UIFactory.CreateHorizontalGroup(uiContent, "SecondRow", false, false, true, true, 0,
|
GameObject currentPasteHolder = UIFactory.CreateHorizontalGroup(ContentRoot, "SecondRow", false, false, true, true, 0,
|
||||||
new(2, 2, 2, 2), childAlignment: TextAnchor.UpperCenter);
|
new(2, 2, 2, 2), childAlignment: TextAnchor.UpperCenter);
|
||||||
|
|
||||||
// Actual current paste info label
|
// Actual current paste info label
|
||||||
|
@ -9,7 +9,7 @@ using UniverseLib.UI.Widgets.ScrollView;
|
|||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
public class HookManagerPanel : UIPanel
|
public class HookManagerPanel : UEPanel
|
||||||
{
|
{
|
||||||
public enum Pages
|
public enum Pages
|
||||||
{
|
{
|
||||||
@ -21,9 +21,12 @@ namespace UnityExplorer.UI.Panels
|
|||||||
public override UIManager.Panels PanelType => UIManager.Panels.HookManager;
|
public override UIManager.Panels PanelType => UIManager.Panels.HookManager;
|
||||||
|
|
||||||
public override string Name => "Hooks";
|
public override string Name => "Hooks";
|
||||||
|
public override bool ShowByDefault => false;
|
||||||
|
|
||||||
public override int MinWidth => 500;
|
public override int MinWidth => 500;
|
||||||
public override int MinHeight => 600;
|
public override int MinHeight => 600;
|
||||||
public override bool ShowByDefault => false;
|
public override Vector2 DefaultAnchorMin => new(0.5f, 0.5f);
|
||||||
|
public override Vector2 DefaultAnchorMax => new(0.5f, 0.5f);
|
||||||
|
|
||||||
public Pages CurrentPage { get; private set; } = Pages.CurrentHooks;
|
public Pages CurrentPage { get; private set; } = Pages.CurrentHooks;
|
||||||
|
|
||||||
@ -37,11 +40,16 @@ namespace UnityExplorer.UI.Panels
|
|||||||
private InputFieldRef AddHooksMethodFilterInput;
|
private InputFieldRef AddHooksMethodFilterInput;
|
||||||
|
|
||||||
private GameObject editorPanel;
|
private GameObject editorPanel;
|
||||||
|
|
||||||
public InputFieldScroller EditorInputScroller { get; private set; }
|
public InputFieldScroller EditorInputScroller { get; private set; }
|
||||||
public InputFieldRef EditorInput => EditorInputScroller.InputField;
|
public InputFieldRef EditorInput => EditorInputScroller.InputField;
|
||||||
public Text EditorInputText { get; private set; }
|
public Text EditorInputText { get; private set; }
|
||||||
public Text EditorHighlightText { get; private set; }
|
public Text EditorHighlightText { get; private set; }
|
||||||
|
|
||||||
|
public HookManagerPanel(UIBase owner) : base(owner)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
private void OnClassInputAddClicked()
|
private void OnClassInputAddClicked()
|
||||||
{
|
{
|
||||||
HookManager.Instance.OnClassSelectedForHooks(this.classSelectorInputField.Text);
|
HookManager.Instance.OnClassSelectedForHooks(this.classSelectorInputField.Text);
|
||||||
@ -73,11 +81,19 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
public void ResetMethodFilter() => AddHooksMethodFilterInput.Text = string.Empty;
|
public void ResetMethodFilter() => AddHooksMethodFilterInput.Text = string.Empty;
|
||||||
|
|
||||||
public override void ConstructPanelContent()
|
public override void SetDefaultSizeAndPosition()
|
||||||
|
{
|
||||||
|
base.SetDefaultSizeAndPosition();
|
||||||
|
|
||||||
|
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, MinWidth);
|
||||||
|
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, MinHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void ConstructPanelContent()
|
||||||
{
|
{
|
||||||
// ~~~~~~~~~ Active hooks scroll pool
|
// ~~~~~~~~~ Active hooks scroll pool
|
||||||
|
|
||||||
currentHooksPanel = UIFactory.CreateUIObject("CurrentHooksPanel", this.uiContent);
|
currentHooksPanel = UIFactory.CreateUIObject("CurrentHooksPanel", this.ContentRoot);
|
||||||
UIFactory.SetLayoutElement(currentHooksPanel, flexibleHeight: 9999, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(currentHooksPanel, flexibleHeight: 9999, flexibleWidth: 9999);
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(currentHooksPanel, true, true, true, true);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(currentHooksPanel, true, true, true, true);
|
||||||
|
|
||||||
@ -103,7 +119,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
// ~~~~~~~~~ Add hooks panel
|
// ~~~~~~~~~ Add hooks panel
|
||||||
|
|
||||||
addHooksPanel = UIFactory.CreateUIObject("AddHooksPanel", this.uiContent);
|
addHooksPanel = UIFactory.CreateUIObject("AddHooksPanel", this.ContentRoot);
|
||||||
UIFactory.SetLayoutElement(addHooksPanel, flexibleHeight: 9999, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(addHooksPanel, flexibleHeight: 9999, flexibleWidth: 9999);
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(addHooksPanel, true, true, true, true);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(addHooksPanel, true, true, true, true);
|
||||||
|
|
||||||
@ -130,7 +146,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
// ~~~~~~~~~ Hook source editor panel
|
// ~~~~~~~~~ Hook source editor panel
|
||||||
|
|
||||||
editorPanel = UIFactory.CreateUIObject("HookSourceEditor", this.uiContent);
|
editorPanel = UIFactory.CreateUIObject("HookSourceEditor", this.ContentRoot);
|
||||||
UIFactory.SetLayoutElement(editorPanel, flexibleHeight: 9999, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(editorPanel, flexibleHeight: 9999, flexibleWidth: 9999);
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(editorPanel, true, true, true, true);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(editorPanel, true, true, true, true);
|
||||||
|
|
||||||
@ -185,13 +201,5 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
editorPanel.SetActive(false);
|
editorPanel.SetActive(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
|
||||||
{
|
|
||||||
this.Rect.anchorMin = new Vector2(0.5f, 0.5f);
|
|
||||||
this.Rect.anchorMax = new Vector2(0.5f, 0.5f);
|
|
||||||
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, MinWidth);
|
|
||||||
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, MinHeight);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,17 +5,18 @@ using UniverseLib.UI;
|
|||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
public class InspectorPanel : UIPanel
|
public class InspectorPanel : UEPanel
|
||||||
{
|
{
|
||||||
public static InspectorPanel Instance { get; private set; }
|
public static InspectorPanel Instance { get; private set; }
|
||||||
|
|
||||||
public InspectorPanel() { Instance = this; }
|
|
||||||
|
|
||||||
public override string Name => "Inspector";
|
public override string Name => "Inspector";
|
||||||
public override UIManager.Panels PanelType => UIManager.Panels.Inspector;
|
public override UIManager.Panels PanelType => UIManager.Panels.Inspector;
|
||||||
public override bool ShouldSaveActiveState => false;
|
public override bool ShouldSaveActiveState => false;
|
||||||
|
|
||||||
public override int MinWidth => 810;
|
public override int MinWidth => 810;
|
||||||
public override int MinHeight => 350;
|
public override int MinHeight => 350;
|
||||||
|
public override Vector2 DefaultAnchorMin => new(0.35f, 0.175f);
|
||||||
|
public override Vector2 DefaultAnchorMax => new(0.8f, 0.925f);
|
||||||
|
|
||||||
public GameObject NavbarHolder;
|
public GameObject NavbarHolder;
|
||||||
public Dropdown MouseInspectDropdown;
|
public Dropdown MouseInspectDropdown;
|
||||||
@ -25,28 +26,25 @@ namespace UnityExplorer.UI.Panels
|
|||||||
public static float CurrentPanelWidth => Instance.Rect.rect.width;
|
public static float CurrentPanelWidth => Instance.Rect.rect.width;
|
||||||
public static float CurrentPanelHeight => Instance.Rect.rect.height;
|
public static float CurrentPanelHeight => Instance.Rect.rect.height;
|
||||||
|
|
||||||
|
public InspectorPanel(UIBase owner) : base(owner)
|
||||||
|
{
|
||||||
|
Instance = this;
|
||||||
|
}
|
||||||
|
|
||||||
public override void Update()
|
public override void Update()
|
||||||
{
|
{
|
||||||
InspectorManager.Update();
|
InspectorManager.Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnFinishResize(RectTransform panel)
|
public override void OnFinishResize()
|
||||||
{
|
{
|
||||||
base.OnFinishResize(panel);
|
base.OnFinishResize();
|
||||||
|
|
||||||
InspectorManager.PanelWidth = this.Rect.rect.width;
|
InspectorManager.PanelWidth = this.Rect.rect.width;
|
||||||
InspectorManager.OnPanelResized(panel.rect.width);
|
InspectorManager.OnPanelResized(Rect.rect.width);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
protected override void ConstructPanelContent()
|
||||||
{
|
|
||||||
Rect.localPosition = Vector2.zero;
|
|
||||||
Rect.pivot = new Vector2(0f, 1f);
|
|
||||||
Rect.anchorMin = new Vector2(0.35f, 0.175f);
|
|
||||||
Rect.anchorMax = new Vector2(0.8f, 0.925f);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void ConstructPanelContent()
|
|
||||||
{
|
{
|
||||||
GameObject closeHolder = this.TitleBar.transform.Find("CloseHolder").gameObject;
|
GameObject closeHolder = this.TitleBar.transform.Find("CloseHolder").gameObject;
|
||||||
|
|
||||||
@ -70,19 +68,19 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
// this.UIRoot.GetComponent<Mask>().enabled = false;
|
// this.UIRoot.GetComponent<Mask>().enabled = false;
|
||||||
|
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(this.uiContent, true, true, true, true, 4, padLeft: 5, padRight: 5);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(this.ContentRoot, true, true, true, true, 4, padLeft: 5, padRight: 5);
|
||||||
|
|
||||||
this.NavbarHolder = UIFactory.CreateGridGroup(this.uiContent, "Navbar", new Vector2(200, 22), new Vector2(4, 4),
|
this.NavbarHolder = UIFactory.CreateGridGroup(this.ContentRoot, "Navbar", new Vector2(200, 22), new Vector2(4, 4),
|
||||||
new Color(0.05f, 0.05f, 0.05f));
|
new Color(0.05f, 0.05f, 0.05f));
|
||||||
//UIFactory.SetLayoutElement(NavbarHolder, flexibleWidth: 9999, minHeight: 0, preferredHeight: 0, flexibleHeight: 9999);
|
//UIFactory.SetLayoutElement(NavbarHolder, flexibleWidth: 9999, minHeight: 0, preferredHeight: 0, flexibleHeight: 9999);
|
||||||
NavbarHolder.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
NavbarHolder.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
|
||||||
this.ContentHolder = UIFactory.CreateVerticalGroup(this.uiContent, "ContentHolder", true, true, true, true, 0, default,
|
this.ContentHolder = UIFactory.CreateVerticalGroup(this.ContentRoot, "ContentHolder", true, true, true, true, 0, default,
|
||||||
new Color(0.1f, 0.1f, 0.1f));
|
new Color(0.1f, 0.1f, 0.1f));
|
||||||
UIFactory.SetLayoutElement(ContentHolder, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(ContentHolder, flexibleHeight: 9999);
|
||||||
ContentRect = ContentHolder.GetComponent<RectTransform>();
|
ContentRect = ContentHolder.GetComponent<RectTransform>();
|
||||||
|
|
||||||
UIManager.SetPanelActive(PanelType, false);
|
this.SetActive(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -16,7 +16,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
{
|
{
|
||||||
// TODO move the logic out of this class into a LogUtil class (also move ExplorerCore.Log into that)
|
// TODO move the logic out of this class into a LogUtil class (also move ExplorerCore.Log into that)
|
||||||
|
|
||||||
public class LogPanel : UIPanel, ICellPoolDataSource<ConsoleLogCell>
|
public class LogPanel : UEPanel, ICellPoolDataSource<ConsoleLogCell>
|
||||||
{
|
{
|
||||||
public struct LogInfo
|
public struct LogInfo
|
||||||
{
|
{
|
||||||
@ -34,6 +34,9 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
public override int MinWidth => 350;
|
public override int MinWidth => 350;
|
||||||
public override int MinHeight => 75;
|
public override int MinHeight => 75;
|
||||||
|
public override Vector2 DefaultAnchorMin => new(0.5f, 0.03f);
|
||||||
|
public override Vector2 DefaultAnchorMax => new(0.9f, 0.2f);
|
||||||
|
|
||||||
public override bool ShouldSaveActiveState => true;
|
public override bool ShouldSaveActiveState => true;
|
||||||
public override bool ShowByDefault => true;
|
public override bool ShowByDefault => true;
|
||||||
|
|
||||||
@ -41,7 +44,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
private static ScrollPool<ConsoleLogCell> logScrollPool;
|
private static ScrollPool<ConsoleLogCell> logScrollPool;
|
||||||
|
|
||||||
public LogPanel()
|
public LogPanel(UIBase owner) : base(owner)
|
||||||
{
|
{
|
||||||
SetupIO();
|
SetupIO();
|
||||||
}
|
}
|
||||||
@ -144,27 +147,19 @@ namespace UnityExplorer.UI.Panels
|
|||||||
RuntimeHelper.SetColorBlock(cell.Input.Component, color);
|
RuntimeHelper.SetColorBlock(cell.Input.Component, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
|
||||||
{
|
|
||||||
Rect.localPosition = Vector2.zero;
|
|
||||||
Rect.pivot = new Vector2(0f, 1f);
|
|
||||||
Rect.anchorMin = new Vector2(0.5f, 0.03f);
|
|
||||||
Rect.anchorMax = new Vector2(0.9f, 0.2f);
|
|
||||||
}
|
|
||||||
|
|
||||||
// UI Construction
|
// UI Construction
|
||||||
|
|
||||||
public override void ConstructPanelContent()
|
protected override void ConstructPanelContent()
|
||||||
{
|
{
|
||||||
// Log scroll pool
|
// Log scroll pool
|
||||||
|
|
||||||
logScrollPool = UIFactory.CreateScrollPool<ConsoleLogCell>(this.uiContent, "Logs", out GameObject scrollObj,
|
logScrollPool = UIFactory.CreateScrollPool<ConsoleLogCell>(this.ContentRoot, "Logs", out GameObject scrollObj,
|
||||||
out GameObject scrollContent, new Color(0.03f, 0.03f, 0.03f));
|
out GameObject scrollContent, new Color(0.03f, 0.03f, 0.03f));
|
||||||
UIFactory.SetLayoutElement(scrollObj, flexibleWidth: 9999, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(scrollObj, flexibleWidth: 9999, flexibleHeight: 9999);
|
||||||
|
|
||||||
// Buttons and toggles
|
// Buttons and toggles
|
||||||
|
|
||||||
GameObject optionsRow = UIFactory.CreateUIObject("OptionsRow", this.uiContent);
|
GameObject optionsRow = UIFactory.CreateUIObject("OptionsRow", this.ContentRoot);
|
||||||
UIFactory.SetLayoutElement(optionsRow, minHeight: 25, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(optionsRow, minHeight: 25, flexibleWidth: 9999);
|
||||||
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(optionsRow, false, false, true, true, 5, 2, 2, 2, 2);
|
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(optionsRow, false, false, true, true, 5, 2, 2, 2, 2);
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ using UniverseLib.Utility;
|
|||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
public class MouseInspectorResultsPanel : UIPanel
|
public class MouseInspectorResultsPanel : UEPanel
|
||||||
{
|
{
|
||||||
public override UIManager.Panels PanelType => UIManager.Panels.UIInspectorResults;
|
public override UIManager.Panels PanelType => UIManager.Panels.UIInspectorResults;
|
||||||
|
|
||||||
@ -16,6 +16,9 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
public override int MinWidth => 500;
|
public override int MinWidth => 500;
|
||||||
public override int MinHeight => 500;
|
public override int MinHeight => 500;
|
||||||
|
public override Vector2 DefaultAnchorMin => new(0.5f, 0.5f);
|
||||||
|
public override Vector2 DefaultAnchorMax => new(0.5f, 0.5f);
|
||||||
|
|
||||||
public override bool CanDragAndResize => true;
|
public override bool CanDragAndResize => true;
|
||||||
public override bool NavButtonWanted => false;
|
public override bool NavButtonWanted => false;
|
||||||
public override bool ShouldSaveActiveState => false;
|
public override bool ShouldSaveActiveState => false;
|
||||||
@ -24,6 +27,10 @@ namespace UnityExplorer.UI.Panels
|
|||||||
private ButtonListHandler<GameObject, ButtonCell> dataHandler;
|
private ButtonListHandler<GameObject, ButtonCell> dataHandler;
|
||||||
private ScrollPool<ButtonCell> buttonScrollPool;
|
private ScrollPool<ButtonCell> buttonScrollPool;
|
||||||
|
|
||||||
|
public MouseInspectorResultsPanel(UIBase owner) : base(owner)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public void ShowResults()
|
public void ShowResults()
|
||||||
{
|
{
|
||||||
dataHandler.RefreshData();
|
dataHandler.RefreshData();
|
||||||
@ -51,23 +58,23 @@ namespace UnityExplorer.UI.Panels
|
|||||||
cell.Button.ButtonText.text = $"<color=cyan>{obj.name}</color> ({obj.transform.GetTransformPath(true)})";
|
cell.Button.ButtonText.text = $"<color=cyan>{obj.name}</color> ({obj.transform.GetTransformPath(true)})";
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ConstructPanelContent()
|
public override void SetDefaultSizeAndPosition()
|
||||||
|
{
|
||||||
|
base.SetDefaultSizeAndPosition();
|
||||||
|
|
||||||
|
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 500f);
|
||||||
|
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 500f);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void ConstructPanelContent()
|
||||||
{
|
{
|
||||||
dataHandler = new ButtonListHandler<GameObject, ButtonCell>(buttonScrollPool, GetEntries, SetCell, ShouldDisplayCell, OnCellClicked);
|
dataHandler = new ButtonListHandler<GameObject, ButtonCell>(buttonScrollPool, GetEntries, SetCell, ShouldDisplayCell, OnCellClicked);
|
||||||
|
|
||||||
buttonScrollPool = UIFactory.CreateScrollPool<ButtonCell>(this.uiContent, "ResultsList", out GameObject scrollObj,
|
buttonScrollPool = UIFactory.CreateScrollPool<ButtonCell>(this.ContentRoot, "ResultsList", out GameObject scrollObj,
|
||||||
out GameObject scrollContent);
|
out GameObject scrollContent);
|
||||||
|
|
||||||
buttonScrollPool.Initialize(dataHandler);
|
buttonScrollPool.Initialize(dataHandler);
|
||||||
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
|
||||||
{
|
|
||||||
this.Rect.anchorMin = new Vector2(0.5f, 0.5f);
|
|
||||||
this.Rect.anchorMax = new Vector2(0.5f, 0.5f);
|
|
||||||
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 500f);
|
|
||||||
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 500f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,12 +9,15 @@ using UniverseLib.UI.Models;
|
|||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
public class ObjectExplorerPanel : UIPanel
|
public class ObjectExplorerPanel : UEPanel
|
||||||
{
|
{
|
||||||
public override string Name => "Object Explorer";
|
public override string Name => "Object Explorer";
|
||||||
public override UIManager.Panels PanelType => UIManager.Panels.ObjectExplorer;
|
public override UIManager.Panels PanelType => UIManager.Panels.ObjectExplorer;
|
||||||
|
|
||||||
public override int MinWidth => 350;
|
public override int MinWidth => 350;
|
||||||
public override int MinHeight => 200;
|
public override int MinHeight => 200;
|
||||||
|
public override Vector2 DefaultAnchorMin => new(0.125f, 0.175f);
|
||||||
|
public override Vector2 DefaultAnchorMax => new(0.325f, 0.925f);
|
||||||
|
|
||||||
public SceneExplorer SceneExplorer;
|
public SceneExplorer SceneExplorer;
|
||||||
public ObjectSearch ObjectSearch;
|
public ObjectSearch ObjectSearch;
|
||||||
@ -26,6 +29,10 @@ namespace UnityExplorer.UI.Panels
|
|||||||
private readonly List<UIModel> tabPages = new();
|
private readonly List<UIModel> tabPages = new();
|
||||||
private readonly List<ButtonRef> tabButtons = new();
|
private readonly List<ButtonRef> tabButtons = new();
|
||||||
|
|
||||||
|
public ObjectExplorerPanel(UIBase owner) : base(owner)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public void SetTab(int tabIndex)
|
public void SetTab(int tabIndex)
|
||||||
{
|
{
|
||||||
if (SelectedTab != -1)
|
if (SelectedTab != -1)
|
||||||
@ -80,28 +87,20 @@ namespace UnityExplorer.UI.Panels
|
|||||||
SetTab(SelectedTab);
|
SetTab(SelectedTab);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
protected override void ConstructPanelContent()
|
||||||
{
|
|
||||||
Rect.localPosition = Vector2.zero;
|
|
||||||
Rect.pivot = new Vector2(0f, 1f);
|
|
||||||
Rect.anchorMin = new Vector2(0.125f, 0.175f);
|
|
||||||
Rect.anchorMax = new Vector2(0.325f, 0.925f);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void ConstructPanelContent()
|
|
||||||
{
|
{
|
||||||
// Tab bar
|
// Tab bar
|
||||||
GameObject tabGroup = UIFactory.CreateHorizontalGroup(uiContent, "TabBar", true, true, true, true, 2, new Vector4(2, 2, 2, 2));
|
GameObject tabGroup = UIFactory.CreateHorizontalGroup(ContentRoot, "TabBar", true, true, true, true, 2, new Vector4(2, 2, 2, 2));
|
||||||
UIFactory.SetLayoutElement(tabGroup, minHeight: 25, flexibleHeight: 0);
|
UIFactory.SetLayoutElement(tabGroup, minHeight: 25, flexibleHeight: 0);
|
||||||
|
|
||||||
// Scene Explorer
|
// Scene Explorer
|
||||||
SceneExplorer = new SceneExplorer(this);
|
SceneExplorer = new SceneExplorer(this);
|
||||||
SceneExplorer.ConstructUI(uiContent);
|
SceneExplorer.ConstructUI(ContentRoot);
|
||||||
tabPages.Add(SceneExplorer);
|
tabPages.Add(SceneExplorer);
|
||||||
|
|
||||||
// Object search
|
// Object search
|
||||||
ObjectSearch = new ObjectSearch(this);
|
ObjectSearch = new ObjectSearch(this);
|
||||||
ObjectSearch.ConstructUI(uiContent);
|
ObjectSearch.ConstructUI(ContentRoot);
|
||||||
tabPages.Add(ObjectSearch);
|
tabPages.Add(ObjectSearch);
|
||||||
|
|
||||||
// set up tabs
|
// set up tabs
|
||||||
@ -109,7 +108,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
AddTabButton(tabGroup, "Object Search");
|
AddTabButton(tabGroup, "Object Search");
|
||||||
|
|
||||||
// default active state: Active
|
// default active state: Active
|
||||||
UIManager.SetPanelActive(PanelType, true);
|
this.SetActive(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddTabButton(GameObject tabGroup, string label)
|
private void AddTabButton(GameObject tabGroup, string label)
|
||||||
|
@ -9,13 +9,15 @@ using UniverseLib.UI.Widgets.ScrollView;
|
|||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
public class OptionsPanel : UIPanel, ICacheObjectController, ICellPoolDataSource<ConfigEntryCell>
|
public class OptionsPanel : UEPanel, ICacheObjectController, ICellPoolDataSource<ConfigEntryCell>
|
||||||
{
|
{
|
||||||
public override string Name => "Options";
|
public override string Name => "Options";
|
||||||
public override UIManager.Panels PanelType => UIManager.Panels.Options;
|
public override UIManager.Panels PanelType => UIManager.Panels.Options;
|
||||||
|
|
||||||
public override int MinWidth => 600;
|
public override int MinWidth => 600;
|
||||||
public override int MinHeight => 200;
|
public override int MinHeight => 200;
|
||||||
|
public override Vector2 DefaultAnchorMin => new(0.5f, 0.1f);
|
||||||
|
public override Vector2 DefaultAnchorMax => new(0.5f, 0.85f);
|
||||||
|
|
||||||
public override bool ShouldSaveActiveState => false;
|
public override bool ShouldSaveActiveState => false;
|
||||||
public override bool ShowByDefault => false;
|
public override bool ShowByDefault => false;
|
||||||
@ -32,7 +34,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
// ICellPoolDataSource
|
// ICellPoolDataSource
|
||||||
public int ItemCount => configEntries.Count;
|
public int ItemCount => configEntries.Count;
|
||||||
|
|
||||||
public OptionsPanel()
|
public OptionsPanel(UIBase owner) : base(owner)
|
||||||
{
|
{
|
||||||
foreach (KeyValuePair<string, IConfigElement> entry in ConfigManager.ConfigElements)
|
foreach (KeyValuePair<string, IConfigElement> entry in ConfigManager.ConfigElements)
|
||||||
{
|
{
|
||||||
@ -42,6 +44,9 @@ namespace UnityExplorer.UI.Panels
|
|||||||
};
|
};
|
||||||
configEntries.Add(cache);
|
configEntries.Add(cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (CacheConfigEntry config in configEntries)
|
||||||
|
config.UpdateValueFromSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnCellBorrowed(ConfigEntryCell cell)
|
public void OnCellBorrowed(ConfigEntryCell cell)
|
||||||
@ -55,32 +60,30 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
// UI Construction
|
// UI Construction
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
public override void SetDefaultSizeAndPosition()
|
||||||
{
|
{
|
||||||
Rect.localPosition = Vector2.zero;
|
base.SetDefaultSizeAndPosition();
|
||||||
Rect.pivot = new Vector2(0f, 1f);
|
|
||||||
Rect.anchorMin = new Vector2(0.5f, 0.1f);
|
|
||||||
Rect.anchorMax = new Vector2(0.5f, 0.85f);
|
|
||||||
Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 600f);
|
Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 600f);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ConstructPanelContent()
|
protected override void ConstructPanelContent()
|
||||||
{
|
{
|
||||||
// Save button
|
// Save button
|
||||||
|
|
||||||
UniverseLib.UI.Models.ButtonRef saveBtn = UIFactory.CreateButton(this.uiContent, "Save", "Save Options", new Color(0.2f, 0.3f, 0.2f));
|
UniverseLib.UI.Models.ButtonRef saveBtn = UIFactory.CreateButton(this.ContentRoot, "Save", "Save Options", new Color(0.2f, 0.3f, 0.2f));
|
||||||
UIFactory.SetLayoutElement(saveBtn.Component.gameObject, flexibleWidth: 9999, minHeight: 30, flexibleHeight: 0);
|
UIFactory.SetLayoutElement(saveBtn.Component.gameObject, flexibleWidth: 9999, minHeight: 30, flexibleHeight: 0);
|
||||||
saveBtn.OnClick += ConfigManager.Handler.SaveConfig;
|
saveBtn.OnClick += ConfigManager.Handler.SaveConfig;
|
||||||
|
|
||||||
// Config entries
|
// Config entries
|
||||||
|
|
||||||
ScrollPool<ConfigEntryCell> scrollPool = UIFactory.CreateScrollPool<ConfigEntryCell>(this.uiContent, "ConfigEntries", out GameObject scrollObj,
|
ScrollPool<ConfigEntryCell> scrollPool = UIFactory.CreateScrollPool<ConfigEntryCell>(
|
||||||
|
this.ContentRoot,
|
||||||
|
"ConfigEntries",
|
||||||
|
out GameObject scrollObj,
|
||||||
out GameObject scrollContent);
|
out GameObject scrollContent);
|
||||||
|
|
||||||
scrollPool.Initialize(this);
|
scrollPool.Initialize(this);
|
||||||
|
|
||||||
foreach (CacheConfigEntry config in configEntries)
|
|
||||||
config.UpdateValueFromSource();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,487 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEngine.UI;
|
|
||||||
using UnityExplorer.UI.Widgets.AutoComplete;
|
|
||||||
using UniverseLib.Input;
|
|
||||||
using UniverseLib.UI;
|
|
||||||
using UniverseLib.Utility;
|
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
|
||||||
{
|
|
||||||
public class PanelDragger
|
|
||||||
{
|
|
||||||
private enum MouseState
|
|
||||||
{
|
|
||||||
Down,
|
|
||||||
Held,
|
|
||||||
NotPressed
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Static
|
|
||||||
|
|
||||||
public static bool Resizing { get; private set; }
|
|
||||||
public static bool ResizePrompting => resizeCursorObj && resizeCursorObj.activeSelf;
|
|
||||||
|
|
||||||
public static GameObject resizeCursorObj;
|
|
||||||
internal static bool wasAnyDragging;
|
|
||||||
|
|
||||||
internal static List<PanelDragger> Instances = new();
|
|
||||||
|
|
||||||
private static bool handledInstanceThisFrame;
|
|
||||||
|
|
||||||
static PanelDragger()
|
|
||||||
{
|
|
||||||
UIPanel.OnPanelsReordered += OnPanelsReordered;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void ForceEnd()
|
|
||||||
{
|
|
||||||
resizeCursorObj.SetActive(false);
|
|
||||||
wasAnyDragging = false;
|
|
||||||
Resizing = false;
|
|
||||||
|
|
||||||
foreach (PanelDragger instance in Instances)
|
|
||||||
{
|
|
||||||
instance.WasDragging = false;
|
|
||||||
instance.WasResizing = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void OnPanelsReordered()
|
|
||||||
{
|
|
||||||
Instances.Sort((a, b) => b.Panel.GetSiblingIndex().CompareTo(a.Panel.GetSiblingIndex()));
|
|
||||||
|
|
||||||
// move AutoCompleter to bottom
|
|
||||||
if (AutoCompleteModal.Instance != null)
|
|
||||||
{
|
|
||||||
int idx = Instances.IndexOf(AutoCompleteModal.Instance.Dragger);
|
|
||||||
Instances.RemoveAt(idx);
|
|
||||||
Instances.Insert(0, AutoCompleteModal.Instance.Dragger);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UpdateInstances()
|
|
||||||
{
|
|
||||||
if (!DisplayManager.MouseInTargetDisplay)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!resizeCursorObj)
|
|
||||||
CreateCursorUI();
|
|
||||||
|
|
||||||
MouseState state;
|
|
||||||
if (InputManager.GetMouseButtonDown(0))
|
|
||||||
state = MouseState.Down;
|
|
||||||
else if (InputManager.GetMouseButton(0))
|
|
||||||
state = MouseState.Held;
|
|
||||||
else
|
|
||||||
state = MouseState.NotPressed;
|
|
||||||
|
|
||||||
Vector3 mousePos = DisplayManager.MousePosition;
|
|
||||||
|
|
||||||
handledInstanceThisFrame = false;
|
|
||||||
foreach (PanelDragger instance in Instances)
|
|
||||||
{
|
|
||||||
if (!instance.Panel.gameObject.activeSelf)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
instance.Update(state, mousePos);
|
|
||||||
if (handledInstanceThisFrame)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wasAnyDragging && state == MouseState.NotPressed)
|
|
||||||
{
|
|
||||||
foreach (PanelDragger instance in Instances)
|
|
||||||
instance.WasDragging = false;
|
|
||||||
wasAnyDragging = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
// Instance
|
|
||||||
|
|
||||||
public UIPanel UIPanel { get; private set; }
|
|
||||||
public bool AllowDragAndResize => UIPanel.CanDragAndResize;
|
|
||||||
|
|
||||||
public RectTransform Panel { get; set; }
|
|
||||||
public event Action<RectTransform> OnFinishResize;
|
|
||||||
public event Action<RectTransform> OnFinishDrag;
|
|
||||||
|
|
||||||
// Dragging
|
|
||||||
public RectTransform DragableArea { get; set; }
|
|
||||||
public bool WasDragging { get; set; }
|
|
||||||
private Vector2 lastDragPosition;
|
|
||||||
|
|
||||||
// Resizing
|
|
||||||
private const int RESIZE_THICKNESS = 10;
|
|
||||||
|
|
||||||
private bool WasResizing { get; set; }
|
|
||||||
private ResizeTypes currentResizeType = ResizeTypes.NONE;
|
|
||||||
private Vector2 lastResizePos;
|
|
||||||
|
|
||||||
private bool WasHoveringResize => resizeCursorObj.activeInHierarchy;
|
|
||||||
|
|
||||||
private ResizeTypes lastResizeHoverType;
|
|
||||||
|
|
||||||
private Rect totalResizeRect;
|
|
||||||
|
|
||||||
public PanelDragger(RectTransform dragArea, RectTransform panelToDrag, UIPanel panel)
|
|
||||||
{
|
|
||||||
this.UIPanel = panel;
|
|
||||||
Instances.Add(this);
|
|
||||||
DragableArea = dragArea;
|
|
||||||
Panel = panelToDrag;
|
|
||||||
|
|
||||||
UpdateResizeCache();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Destroy()
|
|
||||||
{
|
|
||||||
if (resizeCursorObj)
|
|
||||||
GameObject.Destroy(resizeCursorObj);
|
|
||||||
|
|
||||||
if (Instances.Contains(this))
|
|
||||||
Instances.Remove(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Update(MouseState state, Vector3 rawMousePos)
|
|
||||||
{
|
|
||||||
ResizeTypes type;
|
|
||||||
Vector3 resizePos = Panel.InverseTransformPoint(rawMousePos);
|
|
||||||
bool inResizePos = !UIManager.NavBarRect.rect.Contains(UIManager.NavBarRect.InverseTransformPoint(rawMousePos))
|
|
||||||
&& MouseInResizeArea(resizePos);
|
|
||||||
|
|
||||||
Vector3 dragPos = DragableArea.InverseTransformPoint(rawMousePos);
|
|
||||||
bool inDragPos = DragableArea.rect.Contains(dragPos);
|
|
||||||
|
|
||||||
if (WasHoveringResize && resizeCursorObj)
|
|
||||||
UpdateHoverImagePos();
|
|
||||||
|
|
||||||
switch (state)
|
|
||||||
{
|
|
||||||
case MouseState.Down:
|
|
||||||
if (inDragPos || inResizePos)
|
|
||||||
UIManager.SetPanelActive(Panel, true);
|
|
||||||
|
|
||||||
if (inDragPos)
|
|
||||||
{
|
|
||||||
if (AllowDragAndResize)
|
|
||||||
OnBeginDrag();
|
|
||||||
handledInstanceThisFrame = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (inResizePos)
|
|
||||||
{
|
|
||||||
type = GetResizeType(resizePos);
|
|
||||||
if (type != ResizeTypes.NONE)
|
|
||||||
OnBeginResize(type);
|
|
||||||
|
|
||||||
handledInstanceThisFrame = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MouseState.Held:
|
|
||||||
if (WasDragging)
|
|
||||||
{
|
|
||||||
OnDrag();
|
|
||||||
handledInstanceThisFrame = true;
|
|
||||||
}
|
|
||||||
else if (WasResizing)
|
|
||||||
{
|
|
||||||
OnResize();
|
|
||||||
handledInstanceThisFrame = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MouseState.NotPressed:
|
|
||||||
if (AllowDragAndResize && inDragPos)
|
|
||||||
{
|
|
||||||
if (WasDragging)
|
|
||||||
OnEndDrag();
|
|
||||||
|
|
||||||
if (WasHoveringResize)
|
|
||||||
OnHoverResizeEnd();
|
|
||||||
|
|
||||||
handledInstanceThisFrame = true;
|
|
||||||
}
|
|
||||||
else if (inResizePos || WasResizing)
|
|
||||||
{
|
|
||||||
if (WasResizing)
|
|
||||||
OnEndResize();
|
|
||||||
|
|
||||||
type = GetResizeType(resizePos);
|
|
||||||
if (type != ResizeTypes.NONE)
|
|
||||||
OnHoverResize(type);
|
|
||||||
else if (WasHoveringResize)
|
|
||||||
OnHoverResizeEnd();
|
|
||||||
|
|
||||||
handledInstanceThisFrame = true;
|
|
||||||
}
|
|
||||||
else if (WasHoveringResize)
|
|
||||||
OnHoverResizeEnd();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#region DRAGGING
|
|
||||||
|
|
||||||
public void OnBeginDrag()
|
|
||||||
{
|
|
||||||
wasAnyDragging = true;
|
|
||||||
WasDragging = true;
|
|
||||||
lastDragPosition = DisplayManager.MousePosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnDrag()
|
|
||||||
{
|
|
||||||
Vector3 mousePos = DisplayManager.MousePosition;
|
|
||||||
|
|
||||||
Vector2 diff = (Vector2)mousePos - lastDragPosition;
|
|
||||||
lastDragPosition = mousePos;
|
|
||||||
|
|
||||||
Panel.localPosition = Panel.localPosition + (Vector3)diff;
|
|
||||||
|
|
||||||
UIPanel.EnsureValidPosition(Panel);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnEndDrag()
|
|
||||||
{
|
|
||||||
WasDragging = false;
|
|
||||||
|
|
||||||
OnFinishDrag?.Invoke(Panel);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region RESIZE
|
|
||||||
|
|
||||||
private readonly Dictionary<ResizeTypes, Rect> m_resizeMask = new()
|
|
||||||
{
|
|
||||||
{ ResizeTypes.Top, default },
|
|
||||||
{ ResizeTypes.Left, default },
|
|
||||||
{ ResizeTypes.Right, default },
|
|
||||||
{ ResizeTypes.Bottom, default },
|
|
||||||
};
|
|
||||||
|
|
||||||
[Flags]
|
|
||||||
public enum ResizeTypes : ulong
|
|
||||||
{
|
|
||||||
NONE = 0,
|
|
||||||
Top = 1,
|
|
||||||
Left = 2,
|
|
||||||
Right = 4,
|
|
||||||
Bottom = 8,
|
|
||||||
TopLeft = Top | Left,
|
|
||||||
TopRight = Top | Right,
|
|
||||||
BottomLeft = Bottom | Left,
|
|
||||||
BottomRight = Bottom | Right,
|
|
||||||
}
|
|
||||||
|
|
||||||
// private const int HALF_THICKESS = RESIZE_THICKNESS / 2;
|
|
||||||
private const int DBL_THICKESS = RESIZE_THICKNESS * 2;
|
|
||||||
|
|
||||||
private void UpdateResizeCache()
|
|
||||||
{
|
|
||||||
totalResizeRect = new Rect(Panel.rect.x - RESIZE_THICKNESS + 1,
|
|
||||||
Panel.rect.y - RESIZE_THICKNESS + 1,
|
|
||||||
Panel.rect.width + DBL_THICKESS - 2,
|
|
||||||
Panel.rect.height + DBL_THICKESS - 2);
|
|
||||||
|
|
||||||
// calculate the four cross sections to use as flags
|
|
||||||
if (AllowDragAndResize)
|
|
||||||
{
|
|
||||||
m_resizeMask[ResizeTypes.Bottom] = new Rect(
|
|
||||||
totalResizeRect.x,
|
|
||||||
totalResizeRect.y,
|
|
||||||
totalResizeRect.width,
|
|
||||||
RESIZE_THICKNESS);
|
|
||||||
|
|
||||||
m_resizeMask[ResizeTypes.Left] = new Rect(
|
|
||||||
totalResizeRect.x,
|
|
||||||
totalResizeRect.y,
|
|
||||||
RESIZE_THICKNESS,
|
|
||||||
totalResizeRect.height);
|
|
||||||
|
|
||||||
m_resizeMask[ResizeTypes.Top] = new Rect(
|
|
||||||
totalResizeRect.x,
|
|
||||||
Panel.rect.y + Panel.rect.height - 2,
|
|
||||||
totalResizeRect.width,
|
|
||||||
RESIZE_THICKNESS);
|
|
||||||
|
|
||||||
m_resizeMask[ResizeTypes.Right] = new Rect(
|
|
||||||
totalResizeRect.x + Panel.rect.width + RESIZE_THICKNESS - 2,
|
|
||||||
totalResizeRect.y,
|
|
||||||
RESIZE_THICKNESS,
|
|
||||||
totalResizeRect.height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool MouseInResizeArea(Vector2 mousePos)
|
|
||||||
{
|
|
||||||
return totalResizeRect.Contains(mousePos);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ResizeTypes GetResizeType(Vector2 mousePos)
|
|
||||||
{
|
|
||||||
// Calculate which part of the resize area we're in, if any.
|
|
||||||
// More readable method commented out below.
|
|
||||||
|
|
||||||
int mask = 0;
|
|
||||||
mask |= (int)ResizeTypes.Top * (m_resizeMask[ResizeTypes.Top].Contains(mousePos) ? 1 : 0);
|
|
||||||
mask |= (int)ResizeTypes.Bottom * (m_resizeMask[ResizeTypes.Bottom].Contains(mousePos) ? 1 : 0);
|
|
||||||
mask |= (int)ResizeTypes.Left * (m_resizeMask[ResizeTypes.Left].Contains(mousePos) ? 1 : 0);
|
|
||||||
mask |= (int)ResizeTypes.Right * (m_resizeMask[ResizeTypes.Right].Contains(mousePos) ? 1 : 0);
|
|
||||||
|
|
||||||
//if (m_resizeMask[ResizeTypes.Top].Contains(mousePos))
|
|
||||||
// mask |= ResizeTypes.Top;
|
|
||||||
//else if (m_resizeMask[ResizeTypes.Bottom].Contains(mousePos))
|
|
||||||
// mask |= ResizeTypes.Bottom;
|
|
||||||
|
|
||||||
//if (m_resizeMask[ResizeTypes.Left].Contains(mousePos))
|
|
||||||
// mask |= ResizeTypes.Left;
|
|
||||||
//else if (m_resizeMask[ResizeTypes.Right].Contains(mousePos))
|
|
||||||
// mask |= ResizeTypes.Right;
|
|
||||||
|
|
||||||
return (ResizeTypes)mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnHoverResize(ResizeTypes resizeType)
|
|
||||||
{
|
|
||||||
if (WasHoveringResize && lastResizeHoverType == resizeType)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// we are entering resize, or the resize type has changed.
|
|
||||||
|
|
||||||
//WasHoveringResize = true;
|
|
||||||
lastResizeHoverType = resizeType;
|
|
||||||
|
|
||||||
resizeCursorObj.SetActive(true);
|
|
||||||
resizeCursorObj.transform.SetAsLastSibling();
|
|
||||||
|
|
||||||
// set the rotation for the resize icon
|
|
||||||
float iconRotation = 0f;
|
|
||||||
switch (resizeType)
|
|
||||||
{
|
|
||||||
case ResizeTypes.TopRight:
|
|
||||||
case ResizeTypes.BottomLeft:
|
|
||||||
iconRotation = 45f; break;
|
|
||||||
case ResizeTypes.Top:
|
|
||||||
case ResizeTypes.Bottom:
|
|
||||||
iconRotation = 90f; break;
|
|
||||||
case ResizeTypes.TopLeft:
|
|
||||||
case ResizeTypes.BottomRight:
|
|
||||||
iconRotation = 135f; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Quaternion rot = resizeCursorObj.transform.rotation;
|
|
||||||
rot.eulerAngles = new Vector3(0, 0, iconRotation);
|
|
||||||
resizeCursorObj.transform.rotation = rot;
|
|
||||||
|
|
||||||
UpdateHoverImagePos();
|
|
||||||
}
|
|
||||||
|
|
||||||
// update the resize icon position to be above the mouse
|
|
||||||
private void UpdateHoverImagePos()
|
|
||||||
{
|
|
||||||
resizeCursorObj.transform.localPosition = UIManager.UIRootRect.InverseTransformPoint(DisplayManager.MousePosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnHoverResizeEnd()
|
|
||||||
{
|
|
||||||
//WasHoveringResize = false;
|
|
||||||
resizeCursorObj.SetActive(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnBeginResize(ResizeTypes resizeType)
|
|
||||||
{
|
|
||||||
currentResizeType = resizeType;
|
|
||||||
lastResizePos = DisplayManager.MousePosition;
|
|
||||||
WasResizing = true;
|
|
||||||
Resizing = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnResize()
|
|
||||||
{
|
|
||||||
Vector3 mousePos = DisplayManager.MousePosition;
|
|
||||||
Vector2 diff = lastResizePos - (Vector2)mousePos;
|
|
||||||
|
|
||||||
if ((Vector2)mousePos == lastResizePos)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (mousePos.x < 0 || mousePos.y < 0 || mousePos.x > DisplayManager.Width || mousePos.y > DisplayManager.Height)
|
|
||||||
return;
|
|
||||||
|
|
||||||
lastResizePos = mousePos;
|
|
||||||
|
|
||||||
float diffX = (float)((decimal)diff.x / DisplayManager.Width);
|
|
||||||
float diffY = (float)((decimal)diff.y / DisplayManager.Height);
|
|
||||||
|
|
||||||
Vector2 anchorMin = Panel.anchorMin;
|
|
||||||
Vector2 anchorMax = Panel.anchorMax;
|
|
||||||
|
|
||||||
if (currentResizeType.HasFlag(ResizeTypes.Left))
|
|
||||||
anchorMin.x -= diffX;
|
|
||||||
else if (currentResizeType.HasFlag(ResizeTypes.Right))
|
|
||||||
anchorMax.x -= diffX;
|
|
||||||
|
|
||||||
if (currentResizeType.HasFlag(ResizeTypes.Top))
|
|
||||||
anchorMax.y -= diffY;
|
|
||||||
else if (currentResizeType.HasFlag(ResizeTypes.Bottom))
|
|
||||||
anchorMin.y -= diffY;
|
|
||||||
|
|
||||||
Vector2 prevMin = Panel.anchorMin;
|
|
||||||
Vector2 prevMax = Panel.anchorMax;
|
|
||||||
|
|
||||||
Panel.anchorMin = new Vector2(anchorMin.x, anchorMin.y);
|
|
||||||
Panel.anchorMax = new Vector2(anchorMax.x, anchorMax.y);
|
|
||||||
|
|
||||||
if (Panel.rect.width < UIPanel.MinWidth)
|
|
||||||
{
|
|
||||||
Panel.anchorMin = new Vector2(prevMin.x, Panel.anchorMin.y);
|
|
||||||
Panel.anchorMax = new Vector2(prevMax.x, Panel.anchorMax.y);
|
|
||||||
}
|
|
||||||
if (Panel.rect.height < UIPanel.MinHeight)
|
|
||||||
{
|
|
||||||
Panel.anchorMin = new Vector2(Panel.anchorMin.x, prevMin.y);
|
|
||||||
Panel.anchorMax = new Vector2(Panel.anchorMax.x, prevMax.y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnEndResize()
|
|
||||||
{
|
|
||||||
WasResizing = false;
|
|
||||||
Resizing = false;
|
|
||||||
try { OnHoverResizeEnd(); } catch { }
|
|
||||||
UpdateResizeCache();
|
|
||||||
OnFinishResize?.Invoke(Panel);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void CreateCursorUI()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Text text = UIFactory.CreateLabel(UIManager.UIRoot, "ResizeCursor", "↔", TextAnchor.MiddleCenter, Color.white, true, 35);
|
|
||||||
resizeCursorObj = text.gameObject;
|
|
||||||
Outline outline = text.gameObject.AddComponent<Outline>();
|
|
||||||
outline.effectColor = Color.black;
|
|
||||||
outline.effectDistance = new(1, 1);
|
|
||||||
|
|
||||||
RectTransform rect = resizeCursorObj.GetComponent<RectTransform>();
|
|
||||||
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 64);
|
|
||||||
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 64);
|
|
||||||
|
|
||||||
resizeCursorObj.SetActive(false);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
ExplorerCore.LogWarning("Exception creating Resize Cursor UI!\r\n" + e.ToString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
260
src/UI/Panels/UEPanel.cs
Normal file
260
src/UI/Panels/UEPanel.cs
Normal file
@ -0,0 +1,260 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using UnityExplorer.Config;
|
||||||
|
using UniverseLib;
|
||||||
|
using UniverseLib.Input;
|
||||||
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.UI.Panels;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI.Panels
|
||||||
|
{
|
||||||
|
public abstract class UEPanel : PanelBase
|
||||||
|
{
|
||||||
|
protected UEPanel(UIBase owner) : base(owner) { }
|
||||||
|
|
||||||
|
public abstract UIManager.Panels PanelType { get; }
|
||||||
|
public virtual bool ShowByDefault => false;
|
||||||
|
public virtual bool ShouldSaveActiveState => true;
|
||||||
|
|
||||||
|
public virtual bool NavButtonWanted => true;
|
||||||
|
public ButtonRef NavButton { get; internal set; }
|
||||||
|
|
||||||
|
protected override PanelDragger CreatePanelDragger()
|
||||||
|
{
|
||||||
|
return new UEPanelDragger(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnFinishDrag()
|
||||||
|
{
|
||||||
|
base.OnFinishDrag();
|
||||||
|
SaveInternalData();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnFinishResize()
|
||||||
|
{
|
||||||
|
base.OnFinishResize();
|
||||||
|
SaveInternalData();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetActive(bool active)
|
||||||
|
{
|
||||||
|
if (this.Enabled != active)
|
||||||
|
{
|
||||||
|
base.SetActive(active);
|
||||||
|
|
||||||
|
if (!ApplyingSaveData)
|
||||||
|
SaveInternalData();
|
||||||
|
|
||||||
|
if (NavButtonWanted && NavButton != null)
|
||||||
|
{
|
||||||
|
Color color = active ? UniversalUI.EnabledButtonColor : UniversalUI.DisabledButtonColor;
|
||||||
|
RuntimeHelper.SetColorBlock(NavButton.Component, color, color * 1.2f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!active)
|
||||||
|
{
|
||||||
|
if (Dragger != null)
|
||||||
|
this.Dragger.WasDragging = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.UIRoot.transform.SetAsLastSibling();
|
||||||
|
(this.Owner.Panels as UEPanelManager).DoInvokeOnPanelsReordered();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save Data
|
||||||
|
|
||||||
|
public bool ApplyingSaveData { get; set; }
|
||||||
|
|
||||||
|
public void SaveInternalData()
|
||||||
|
{
|
||||||
|
if (UIManager.Initializing)
|
||||||
|
return;
|
||||||
|
|
||||||
|
SetSaveDataToConfigValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetSaveDataToConfigValue() => ConfigManager.GetPanelSaveData(this.PanelType).Value = this.ToSaveData();
|
||||||
|
|
||||||
|
public virtual string ToSaveData()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return string.Join("|", new string[]
|
||||||
|
{
|
||||||
|
$"{ShouldSaveActiveState && Enabled}",
|
||||||
|
Rect.RectAnchorsToString(),
|
||||||
|
Rect.RectPositionToString()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ExplorerCore.LogWarning($"Exception generating Panel save data: {ex}");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void ApplySaveData()
|
||||||
|
{
|
||||||
|
string data = ConfigManager.GetPanelSaveData(this.PanelType).Value;
|
||||||
|
ApplySaveData(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void ApplySaveData(string data)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(data))
|
||||||
|
return;
|
||||||
|
|
||||||
|
string[] split = data.Split('|');
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Rect.SetAnchorsFromString(split[1]);
|
||||||
|
Rect.SetPositionFromString(split[2]);
|
||||||
|
this.SetActive(bool.Parse(split[0]));
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
ExplorerCore.LogWarning("Invalid or corrupt panel save data! Restoring to default.");
|
||||||
|
SetDefaultSizeAndPosition();
|
||||||
|
SetSaveDataToConfigValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ConstructUI()
|
||||||
|
{
|
||||||
|
base.ConstructUI();
|
||||||
|
|
||||||
|
if (NavButtonWanted)
|
||||||
|
{
|
||||||
|
// create navbar button
|
||||||
|
|
||||||
|
NavButton = UIFactory.CreateButton(UIManager.NavbarTabButtonHolder, $"Button_{PanelType}", Name);
|
||||||
|
GameObject navBtn = NavButton.Component.gameObject;
|
||||||
|
navBtn.AddComponent<ContentSizeFitter>().horizontalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(navBtn, false, true, true, true, 0, 0, 0, 5, 5, TextAnchor.MiddleCenter);
|
||||||
|
UIFactory.SetLayoutElement(navBtn, minWidth: 80);
|
||||||
|
|
||||||
|
RuntimeHelper.SetColorBlock(NavButton.Component, UniversalUI.DisabledButtonColor, UniversalUI.DisabledButtonColor * 1.2f);
|
||||||
|
NavButton.OnClick += () => { UIManager.TogglePanel(PanelType); };
|
||||||
|
|
||||||
|
GameObject txtObj = navBtn.transform.Find("Text").gameObject;
|
||||||
|
txtObj.AddComponent<ContentSizeFitter>().horizontalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.SetActive(true);
|
||||||
|
this.SetActive(false);
|
||||||
|
this.SetActive(ShowByDefault);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void LateConstructUI()
|
||||||
|
{
|
||||||
|
base.LateConstructUI();
|
||||||
|
|
||||||
|
ApplyingSaveData = true;
|
||||||
|
// apply panel save data or revert to default
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ApplySaveData();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ExplorerCore.Log($"Exception loading panel save data: {ex}");
|
||||||
|
SetDefaultSizeAndPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
// simple listener for saving enabled state
|
||||||
|
this.OnToggleEnabled += (bool val) =>
|
||||||
|
{
|
||||||
|
SaveInternalData();
|
||||||
|
};
|
||||||
|
|
||||||
|
ApplyingSaveData = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region WINDOW ANCHORS / POSITION SAVE DATA HELPERS
|
||||||
|
|
||||||
|
public static class RectSaveExtensions
|
||||||
|
{
|
||||||
|
// Window Anchors helpers
|
||||||
|
|
||||||
|
internal static string RectAnchorsToString(this RectTransform rect)
|
||||||
|
{
|
||||||
|
if (!rect)
|
||||||
|
throw new ArgumentNullException("rect");
|
||||||
|
|
||||||
|
return string.Format(CultureInfo.InvariantCulture, "{0},{1},{2},{3}", new object[]
|
||||||
|
{
|
||||||
|
rect.anchorMin.x,
|
||||||
|
rect.anchorMin.y,
|
||||||
|
rect.anchorMax.x,
|
||||||
|
rect.anchorMax.y
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void SetAnchorsFromString(this RectTransform panel, string stringAnchors)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(stringAnchors))
|
||||||
|
throw new ArgumentNullException("stringAnchors");
|
||||||
|
|
||||||
|
if (stringAnchors.Contains(" "))
|
||||||
|
// outdated save data, not worth recovering just reset it.
|
||||||
|
throw new Exception("invalid save data, resetting.");
|
||||||
|
|
||||||
|
string[] split = stringAnchors.Split(',');
|
||||||
|
|
||||||
|
if (split.Length != 4)
|
||||||
|
throw new Exception($"stringAnchors split is unexpected length: {split.Length}");
|
||||||
|
|
||||||
|
Vector4 anchors;
|
||||||
|
anchors.x = float.Parse(split[0], CultureInfo.InvariantCulture);
|
||||||
|
anchors.y = float.Parse(split[1], CultureInfo.InvariantCulture);
|
||||||
|
anchors.z = float.Parse(split[2], CultureInfo.InvariantCulture);
|
||||||
|
anchors.w = float.Parse(split[3], CultureInfo.InvariantCulture);
|
||||||
|
|
||||||
|
panel.anchorMin = new Vector2(anchors.x, anchors.y);
|
||||||
|
panel.anchorMax = new Vector2(anchors.z, anchors.w);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string RectPositionToString(this RectTransform rect)
|
||||||
|
{
|
||||||
|
if (!rect)
|
||||||
|
throw new ArgumentNullException("rect");
|
||||||
|
|
||||||
|
return string.Format(CultureInfo.InvariantCulture, "{0},{1}", new object[]
|
||||||
|
{
|
||||||
|
rect.anchoredPosition.x, rect.anchoredPosition.y
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void SetPositionFromString(this RectTransform rect, string stringPosition)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(stringPosition))
|
||||||
|
throw new ArgumentNullException(stringPosition);
|
||||||
|
|
||||||
|
if (stringPosition.Contains(" "))
|
||||||
|
// outdated save data, not worth recovering just reset it.
|
||||||
|
throw new Exception("invalid save data, resetting.");
|
||||||
|
|
||||||
|
string[] split = stringPosition.Split(',');
|
||||||
|
|
||||||
|
if (split.Length != 2)
|
||||||
|
throw new Exception($"stringPosition split is unexpected length: {split.Length}");
|
||||||
|
|
||||||
|
Vector3 vector = rect.anchoredPosition;
|
||||||
|
vector.x = float.Parse(split[0], CultureInfo.InvariantCulture);
|
||||||
|
vector.y = float.Parse(split[1], CultureInfo.InvariantCulture);
|
||||||
|
rect.anchoredPosition = vector;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
23
src/UI/Panels/UEPanelDragger.cs
Normal file
23
src/UI/Panels/UEPanelDragger.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
|
using UniverseLib.Input;
|
||||||
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Panels;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI.Panels
|
||||||
|
{
|
||||||
|
public class UEPanelDragger : PanelDragger
|
||||||
|
{
|
||||||
|
public UEPanelDragger(PanelBase uiPanel) : base(uiPanel) { }
|
||||||
|
|
||||||
|
protected override bool MouseInResizeArea(Vector2 mousePos)
|
||||||
|
{
|
||||||
|
return !UIManager.NavBarRect.rect.Contains(UIManager.NavBarRect.InverseTransformPoint(mousePos))
|
||||||
|
&& base.MouseInResizeArea(mousePos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,420 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Globalization;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEngine.UI;
|
|
||||||
using UnityExplorer.Config;
|
|
||||||
using UniverseLib;
|
|
||||||
using UniverseLib.Input;
|
|
||||||
using UniverseLib.UI;
|
|
||||||
using UniverseLib.UI.Models;
|
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
|
||||||
{
|
|
||||||
public abstract class UIPanel : UIBehaviourModel
|
|
||||||
{
|
|
||||||
#region STATIC
|
|
||||||
|
|
||||||
internal static void InvokeOnPanelsReordered() => OnPanelsReordered?.Invoke();
|
|
||||||
|
|
||||||
public static event Action OnPanelsReordered;
|
|
||||||
public static event Action OnClickedOutsidePanels;
|
|
||||||
|
|
||||||
internal static readonly List<UIPanel> instances = new();
|
|
||||||
internal static readonly Dictionary<int, UIPanel> transformToPanelDict = new();
|
|
||||||
|
|
||||||
public static void UpdateFocus()
|
|
||||||
{
|
|
||||||
if (PanelDragger.ResizePrompting)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// if the user is clicking
|
|
||||||
if (DisplayManager.MouseInTargetDisplay
|
|
||||||
&& (InputManager.GetMouseButtonDown(0) || InputManager.GetMouseButtonDown(1)))
|
|
||||||
{
|
|
||||||
int count = UIManager.PanelHolder.transform.childCount;
|
|
||||||
Vector3 mousePos = DisplayManager.MousePosition;
|
|
||||||
bool clickedInAny = false;
|
|
||||||
|
|
||||||
for (int i = count - 1; i >= 0; i--)
|
|
||||||
{
|
|
||||||
// make sure this is a real recognized panel
|
|
||||||
Transform transform = UIManager.PanelHolder.transform.GetChild(i);
|
|
||||||
if (!transformToPanelDict.TryGetValue(transform.GetInstanceID(), out UIPanel panel))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// check if our mouse is clicking inside the panel
|
|
||||||
Vector3 pos = panel.Rect.InverseTransformPoint(mousePos);
|
|
||||||
if (!panel.Enabled || !panel.Rect.rect.Contains(pos))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// if this is not the top panel, reorder and invoke the onchanged event
|
|
||||||
if (transform.GetSiblingIndex() != count - 1)
|
|
||||||
{
|
|
||||||
transform.SetAsLastSibling();
|
|
||||||
OnPanelsReordered?.Invoke();
|
|
||||||
}
|
|
||||||
// panel was found, break
|
|
||||||
clickedInAny = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!clickedInAny)
|
|
||||||
OnClickedOutsidePanels?.Invoke();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
// INSTANCE
|
|
||||||
|
|
||||||
public UIPanel()
|
|
||||||
{
|
|
||||||
instances.Add(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract UIManager.Panels PanelType { get; }
|
|
||||||
public abstract string Name { get; }
|
|
||||||
public abstract int MinWidth { get; }
|
|
||||||
public abstract int MinHeight { get; }
|
|
||||||
|
|
||||||
public virtual bool ShowByDefault => false;
|
|
||||||
public virtual bool ShouldSaveActiveState => true;
|
|
||||||
public virtual bool CanDragAndResize => true;
|
|
||||||
public virtual bool NavButtonWanted => true;
|
|
||||||
|
|
||||||
public ButtonRef NavButton { get; internal set; }
|
|
||||||
public PanelDragger Dragger { get; internal set; }
|
|
||||||
|
|
||||||
public override GameObject UIRoot => uiRoot;
|
|
||||||
protected GameObject uiRoot;
|
|
||||||
protected GameObject uiContent;
|
|
||||||
public RectTransform Rect { get; private set; }
|
|
||||||
public GameObject TitleBar { get; private set; }
|
|
||||||
|
|
||||||
public virtual void OnFinishResize(RectTransform panel)
|
|
||||||
{
|
|
||||||
SaveInternalData();
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void OnFinishDrag(RectTransform panel)
|
|
||||||
{
|
|
||||||
SaveInternalData();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void SetActive(bool active)
|
|
||||||
{
|
|
||||||
if (this.Enabled != active)
|
|
||||||
{
|
|
||||||
base.SetActive(active);
|
|
||||||
|
|
||||||
if (!ApplyingSaveData)
|
|
||||||
SaveInternalData();
|
|
||||||
|
|
||||||
if (NavButtonWanted)
|
|
||||||
{
|
|
||||||
Color color = active ? UniversalUI.EnabledButtonColor : UniversalUI.DisabledButtonColor;
|
|
||||||
RuntimeHelper.SetColorBlock(NavButton.Component, color, color * 1.2f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!active)
|
|
||||||
this.Dragger.WasDragging = false;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.UIRoot.transform.SetAsLastSibling();
|
|
||||||
InvokeOnPanelsReordered();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Destroy()
|
|
||||||
{
|
|
||||||
instances.Remove(this);
|
|
||||||
base.Destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected internal abstract void DoSetDefaultPosAndAnchors();
|
|
||||||
|
|
||||||
public void SetTransformDefaults()
|
|
||||||
{
|
|
||||||
DoSetDefaultPosAndAnchors();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void EnsureValidSize()
|
|
||||||
{
|
|
||||||
if (Rect.rect.width < MinWidth)
|
|
||||||
Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, MinWidth);
|
|
||||||
if (Rect.rect.height < MinHeight)
|
|
||||||
Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, MinHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void EnsureValidPosition() => EnsureValidPosition(this.Rect);
|
|
||||||
|
|
||||||
public static void EnsureValidPosition(RectTransform panel)
|
|
||||||
{
|
|
||||||
Vector3 pos = panel.localPosition;
|
|
||||||
|
|
||||||
// Prevent panel going oustide screen bounds
|
|
||||||
float halfW = DisplayManager.Width * 0.5f;
|
|
||||||
float halfH = DisplayManager.Height * 0.5f;
|
|
||||||
|
|
||||||
pos.x = Math.Max(-halfW - panel.rect.width + 50, Math.Min(pos.x, halfW - 50));
|
|
||||||
pos.y = Math.Max(-halfH + 50, Math.Min(pos.y, halfH));
|
|
||||||
|
|
||||||
panel.localPosition = pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save Data
|
|
||||||
|
|
||||||
public bool ApplyingSaveData { get; set; }
|
|
||||||
|
|
||||||
public void SaveInternalData()
|
|
||||||
{
|
|
||||||
if (UIManager.Initializing)
|
|
||||||
return;
|
|
||||||
|
|
||||||
SetSaveDataToConfigValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetSaveDataToConfigValue() => ConfigManager.GetPanelSaveData(this.PanelType).Value = this.ToSaveData();
|
|
||||||
|
|
||||||
public virtual string ToSaveData()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return string.Join("|", new string[]
|
|
||||||
{
|
|
||||||
$"{ShouldSaveActiveState && Enabled}",
|
|
||||||
Rect.RectAnchorsToString(),
|
|
||||||
Rect.RectPositionToString()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ExplorerCore.LogWarning($"Exception generating Panel save data: {ex}");
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void ApplySaveData()
|
|
||||||
{
|
|
||||||
string data = ConfigManager.GetPanelSaveData(this.PanelType).Value;
|
|
||||||
ApplySaveData(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void ApplySaveData(string data)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(data))
|
|
||||||
return;
|
|
||||||
|
|
||||||
string[] split = data.Split('|');
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Rect.SetAnchorsFromString(split[1]);
|
|
||||||
Rect.SetPositionFromString(split[2]);
|
|
||||||
UIManager.SetPanelActive(this.PanelType, bool.Parse(split[0]));
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
ExplorerCore.LogWarning("Invalid or corrupt panel save data! Restoring to default.");
|
|
||||||
SetTransformDefaults();
|
|
||||||
SetSaveDataToConfigValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// UI Construction
|
|
||||||
|
|
||||||
public abstract void ConstructPanelContent();
|
|
||||||
|
|
||||||
public void ConstructUI()
|
|
||||||
{
|
|
||||||
//this.Enabled = true;
|
|
||||||
|
|
||||||
if (NavButtonWanted)
|
|
||||||
{
|
|
||||||
// create navbar button
|
|
||||||
|
|
||||||
NavButton = UIFactory.CreateButton(UIManager.NavbarTabButtonHolder, $"Button_{PanelType}", Name);
|
|
||||||
GameObject navBtn = NavButton.Component.gameObject;
|
|
||||||
navBtn.AddComponent<ContentSizeFitter>().horizontalFit = ContentSizeFitter.FitMode.PreferredSize;
|
|
||||||
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(navBtn, false, true, true, true, 0, 0, 0, 5, 5, TextAnchor.MiddleCenter);
|
|
||||||
UIFactory.SetLayoutElement(navBtn, minWidth: 80);
|
|
||||||
|
|
||||||
RuntimeHelper.SetColorBlock(NavButton.Component, UniversalUI.DisabledButtonColor, UniversalUI.DisabledButtonColor * 1.2f);
|
|
||||||
NavButton.OnClick += () => { UIManager.TogglePanel(PanelType); };
|
|
||||||
|
|
||||||
GameObject txtObj = navBtn.transform.Find("Text").gameObject;
|
|
||||||
txtObj.AddComponent<ContentSizeFitter>().horizontalFit = ContentSizeFitter.FitMode.PreferredSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
// create core canvas
|
|
||||||
uiRoot = UIFactory.CreatePanel(Name, UIManager.PanelHolder, out uiContent);
|
|
||||||
Rect = this.uiRoot.GetComponent<RectTransform>();
|
|
||||||
//UIFactory.SetLayoutGroup<VerticalLayoutGroup>(this.uiRoot, false, false, true, true, 0, 2, 2, 2, 2, TextAnchor.UpperLeft);
|
|
||||||
|
|
||||||
int id = this.uiRoot.transform.GetInstanceID();
|
|
||||||
transformToPanelDict.Add(id, this);
|
|
||||||
|
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(this.uiContent, false, false, true, true, 2, 2, 2, 2, 2, TextAnchor.UpperLeft);
|
|
||||||
|
|
||||||
// Title bar
|
|
||||||
TitleBar = UIFactory.CreateHorizontalGroup(uiContent, "TitleBar", false, true, true, true, 2,
|
|
||||||
new Vector4(2, 2, 2, 2), new Color(0.06f, 0.06f, 0.06f));
|
|
||||||
UIFactory.SetLayoutElement(TitleBar, minHeight: 25, flexibleHeight: 0);
|
|
||||||
|
|
||||||
// Title text
|
|
||||||
|
|
||||||
Text titleTxt = UIFactory.CreateLabel(TitleBar, "TitleBar", Name, TextAnchor.MiddleLeft);
|
|
||||||
UIFactory.SetLayoutElement(titleTxt.gameObject, minWidth: 250, minHeight: 25, flexibleHeight: 0);
|
|
||||||
|
|
||||||
// close button
|
|
||||||
|
|
||||||
GameObject closeHolder = UIFactory.CreateUIObject("CloseHolder", TitleBar);
|
|
||||||
UIFactory.SetLayoutElement(closeHolder, minHeight: 25, flexibleHeight: 0, minWidth: 30, flexibleWidth: 9999);
|
|
||||||
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(closeHolder, false, false, true, true, 3, childAlignment: TextAnchor.MiddleRight);
|
|
||||||
ButtonRef closeBtn = UIFactory.CreateButton(closeHolder, "CloseButton", "—");
|
|
||||||
UIFactory.SetLayoutElement(closeBtn.Component.gameObject, minHeight: 25, minWidth: 25, flexibleWidth: 0);
|
|
||||||
RuntimeHelper.SetColorBlock(closeBtn.Component, new Color(0.33f, 0.32f, 0.31f));
|
|
||||||
|
|
||||||
closeBtn.OnClick += () =>
|
|
||||||
{
|
|
||||||
UIManager.SetPanelActive(this.PanelType, false);
|
|
||||||
SaveInternalData();
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!CanDragAndResize)
|
|
||||||
TitleBar.SetActive(false);
|
|
||||||
|
|
||||||
// Panel dragger
|
|
||||||
|
|
||||||
Dragger = new PanelDragger(TitleBar.GetComponent<RectTransform>(), Rect, this);
|
|
||||||
Dragger.OnFinishResize += OnFinishResize;
|
|
||||||
Dragger.OnFinishDrag += OnFinishDrag;
|
|
||||||
|
|
||||||
// content (abstract)
|
|
||||||
|
|
||||||
ConstructPanelContent();
|
|
||||||
|
|
||||||
UIManager.SetPanelActive(this.PanelType, true);
|
|
||||||
UIManager.SetPanelActive(this.PanelType, false);
|
|
||||||
UIManager.SetPanelActive(this.PanelType, ShowByDefault);
|
|
||||||
|
|
||||||
ApplyingSaveData = true;
|
|
||||||
SetTransformDefaults();
|
|
||||||
// apply panel save data or revert to default
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ApplySaveData();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ExplorerCore.Log($"Exception loading panel save data: {ex}");
|
|
||||||
SetTransformDefaults();
|
|
||||||
}
|
|
||||||
|
|
||||||
RuntimeHelper.StartCoroutine(LateSetupCoroutine());
|
|
||||||
|
|
||||||
// simple listener for saving enabled state
|
|
||||||
this.OnToggleEnabled += (bool val) =>
|
|
||||||
{
|
|
||||||
SaveInternalData();
|
|
||||||
};
|
|
||||||
|
|
||||||
ApplyingSaveData = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private IEnumerator LateSetupCoroutine()
|
|
||||||
{
|
|
||||||
yield return null;
|
|
||||||
|
|
||||||
// ensure initialized position is valid
|
|
||||||
EnsureValidSize();
|
|
||||||
EnsureValidPosition(this.Rect);
|
|
||||||
|
|
||||||
// update dragger and save data
|
|
||||||
Dragger.OnEndResize();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void ConstructUI(GameObject parent) => ConstructUI();
|
|
||||||
}
|
|
||||||
|
|
||||||
#region WINDOW ANCHORS / POSITION HELPERS
|
|
||||||
|
|
||||||
public static class RectSaveExtensions
|
|
||||||
{
|
|
||||||
// Window Anchors helpers
|
|
||||||
|
|
||||||
internal static string RectAnchorsToString(this RectTransform rect)
|
|
||||||
{
|
|
||||||
if (!rect)
|
|
||||||
throw new ArgumentNullException("rect");
|
|
||||||
|
|
||||||
return string.Format(CultureInfo.InvariantCulture, "{0},{1},{2},{3}", new object[]
|
|
||||||
{
|
|
||||||
rect.anchorMin.x,
|
|
||||||
rect.anchorMin.y,
|
|
||||||
rect.anchorMax.x,
|
|
||||||
rect.anchorMax.y
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void SetAnchorsFromString(this RectTransform panel, string stringAnchors)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(stringAnchors))
|
|
||||||
throw new ArgumentNullException("stringAnchors");
|
|
||||||
|
|
||||||
if (stringAnchors.Contains(" "))
|
|
||||||
// outdated save data, not worth recovering just reset it.
|
|
||||||
throw new Exception("invalid save data, resetting.");
|
|
||||||
|
|
||||||
string[] split = stringAnchors.Split(',');
|
|
||||||
|
|
||||||
if (split.Length != 4)
|
|
||||||
throw new Exception($"stringAnchors split is unexpected length: {split.Length}");
|
|
||||||
|
|
||||||
Vector4 anchors;
|
|
||||||
anchors.x = float.Parse(split[0], CultureInfo.InvariantCulture);
|
|
||||||
anchors.y = float.Parse(split[1], CultureInfo.InvariantCulture);
|
|
||||||
anchors.z = float.Parse(split[2], CultureInfo.InvariantCulture);
|
|
||||||
anchors.w = float.Parse(split[3], CultureInfo.InvariantCulture);
|
|
||||||
|
|
||||||
panel.anchorMin = new Vector2(anchors.x, anchors.y);
|
|
||||||
panel.anchorMax = new Vector2(anchors.z, anchors.w);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static string RectPositionToString(this RectTransform rect)
|
|
||||||
{
|
|
||||||
if (!rect)
|
|
||||||
throw new ArgumentNullException("rect");
|
|
||||||
|
|
||||||
return string.Format(CultureInfo.InvariantCulture, "{0},{1}", new object[]
|
|
||||||
{
|
|
||||||
rect.anchoredPosition.x, rect.anchoredPosition.y
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void SetPositionFromString(this RectTransform rect, string stringPosition)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(stringPosition))
|
|
||||||
throw new ArgumentNullException(stringPosition);
|
|
||||||
|
|
||||||
if (stringPosition.Contains(" "))
|
|
||||||
// outdated save data, not worth recovering just reset it.
|
|
||||||
throw new Exception("invalid save data, resetting.");
|
|
||||||
|
|
||||||
string[] split = stringPosition.Split(',');
|
|
||||||
|
|
||||||
if (split.Length != 2)
|
|
||||||
throw new Exception($"stringPosition split is unexpected length: {split.Length}");
|
|
||||||
|
|
||||||
Vector3 vector = rect.anchoredPosition;
|
|
||||||
vector.x = float.Parse(split[0], CultureInfo.InvariantCulture);
|
|
||||||
vector.y = float.Parse(split[1], CultureInfo.InvariantCulture);
|
|
||||||
rect.anchoredPosition = vector;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
39
src/UI/UEPanelManager.cs
Normal file
39
src/UI/UEPanelManager.cs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityExplorer.UI.Panels;
|
||||||
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Panels;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI
|
||||||
|
{
|
||||||
|
public class UEPanelManager : PanelManager
|
||||||
|
{
|
||||||
|
public UEPanelManager(UIBase owner) : base(owner) { }
|
||||||
|
|
||||||
|
protected override Vector3 MousePosition => DisplayManager.MousePosition;
|
||||||
|
|
||||||
|
protected override Vector2 ScreenDimensions => new(DisplayManager.Width, DisplayManager.Height);
|
||||||
|
|
||||||
|
protected override bool MouseInTargetDisplay => DisplayManager.MouseInTargetDisplay;
|
||||||
|
|
||||||
|
internal void DoInvokeOnPanelsReordered()
|
||||||
|
{
|
||||||
|
InvokeOnPanelsReordered();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void SortDraggerHeirarchy()
|
||||||
|
{
|
||||||
|
base.SortDraggerHeirarchy();
|
||||||
|
|
||||||
|
// move AutoCompleter to first update
|
||||||
|
if (!UIManager.Initializing && AutoCompleteModal.Instance != null)
|
||||||
|
{
|
||||||
|
this.draggerInstances.Remove(AutoCompleteModal.Instance.Dragger);
|
||||||
|
this.draggerInstances.Insert(0, AutoCompleteModal.Instance.Dragger);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -10,6 +10,7 @@ using UniverseLib;
|
|||||||
using UniverseLib.Input;
|
using UniverseLib.Input;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.UI.Panels;
|
||||||
using UniverseLib.UI.Widgets.ScrollView;
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
using UniverseLib.Utility;
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
@ -46,8 +47,7 @@ namespace UnityExplorer.UI
|
|||||||
public static RectTransform UIRootRect { get; private set; }
|
public static RectTransform UIRootRect { get; private set; }
|
||||||
public static Canvas UICanvas { get; private set; }
|
public static Canvas UICanvas { get; private set; }
|
||||||
|
|
||||||
internal static GameObject PanelHolder { get; private set; }
|
internal static readonly Dictionary<Panels, UEPanel> UIPanels = new();
|
||||||
internal static readonly Dictionary<Panels, UIPanel> UIPanels = new();
|
|
||||||
|
|
||||||
public static RectTransform NavBarRect;
|
public static RectTransform NavBarRect;
|
||||||
public static GameObject NavbarTabButtonHolder;
|
public static GameObject NavbarTabButtonHolder;
|
||||||
@ -79,7 +79,7 @@ namespace UnityExplorer.UI
|
|||||||
|
|
||||||
internal static void InitUI()
|
internal static void InitUI()
|
||||||
{
|
{
|
||||||
UiBase = UniversalUI.RegisterUI(ExplorerCore.GUID, Update);
|
UiBase = UniversalUI.RegisterUI<ExplorerUIBase>(ExplorerCore.GUID, Update);
|
||||||
|
|
||||||
UIRootRect = UIRoot.GetComponent<RectTransform>();
|
UIRootRect = UIRoot.GetComponent<RectTransform>();
|
||||||
UICanvas = UIRoot.GetComponent<Canvas>();
|
UICanvas = UIRoot.GetComponent<Canvas>();
|
||||||
@ -91,31 +91,24 @@ namespace UnityExplorer.UI
|
|||||||
lastScreenHeight = display.renderingHeight;
|
lastScreenHeight = display.renderingHeight;
|
||||||
|
|
||||||
// Create UI.
|
// Create UI.
|
||||||
CreatePanelHolder();
|
|
||||||
CreateTopNavBar();
|
CreateTopNavBar();
|
||||||
// This could be automated with Assembly.GetTypes(),
|
// This could be automated with Assembly.GetTypes(),
|
||||||
// but the order is important and I'd have to write something to handle the order.
|
// but the order is important and I'd have to write something to handle the order.
|
||||||
UIPanels.Add(Panels.AutoCompleter, new AutoCompleteModal());
|
UIPanels.Add(Panels.AutoCompleter, new AutoCompleteModal(UiBase));
|
||||||
UIPanels.Add(Panels.ObjectExplorer, new ObjectExplorerPanel());
|
UIPanels.Add(Panels.ObjectExplorer, new ObjectExplorerPanel(UiBase));
|
||||||
UIPanels.Add(Panels.Inspector, new InspectorPanel());
|
UIPanels.Add(Panels.Inspector, new InspectorPanel(UiBase));
|
||||||
UIPanels.Add(Panels.CSConsole, new CSConsolePanel());
|
UIPanels.Add(Panels.CSConsole, new CSConsolePanel(UiBase));
|
||||||
UIPanels.Add(Panels.HookManager, new HookManagerPanel());
|
UIPanels.Add(Panels.HookManager, new HookManagerPanel(UiBase));
|
||||||
UIPanels.Add(Panels.Clipboard, new ClipboardPanel());
|
UIPanels.Add(Panels.Clipboard, new ClipboardPanel(UiBase));
|
||||||
UIPanels.Add(Panels.ConsoleLog, new LogPanel());
|
UIPanels.Add(Panels.ConsoleLog, new LogPanel(UiBase));
|
||||||
UIPanels.Add(Panels.Options, new OptionsPanel());
|
UIPanels.Add(Panels.Options, new OptionsPanel(UiBase));
|
||||||
UIPanels.Add(Panels.UIInspectorResults, new MouseInspectorResultsPanel());
|
UIPanels.Add(Panels.UIInspectorResults, new MouseInspectorResultsPanel(UiBase));
|
||||||
UIPanels.Add(Panels.MouseInspector, new MouseInspector());
|
UIPanels.Add(Panels.MouseInspector, new MouseInspector(UiBase));
|
||||||
|
|
||||||
foreach (UIPanel panel in UIPanels.Values)
|
|
||||||
panel.ConstructUI();
|
|
||||||
|
|
||||||
// Call some initialize methods
|
// Call some initialize methods
|
||||||
Notification.Init();
|
Notification.Init();
|
||||||
ConsoleController.Init();
|
ConsoleController.Init();
|
||||||
|
|
||||||
// Add this listener to prevent ScrollPool doing anything while we are resizing panels
|
|
||||||
ScrollPool<ICell>.writingLockedListeners.Add(() => !PanelDragger.Resizing);
|
|
||||||
|
|
||||||
// Set default menu visibility
|
// Set default menu visibility
|
||||||
ShowMenu = !ConfigManager.Hide_On_Startup.Value;
|
ShowMenu = !ConfigManager.Hide_On_Startup.Value;
|
||||||
|
|
||||||
@ -144,10 +137,6 @@ namespace UnityExplorer.UI
|
|||||||
if (InputManager.GetKeyDown(ConfigManager.Force_Unlock_Toggle.Value))
|
if (InputManager.GetKeyDown(ConfigManager.Force_Unlock_Toggle.Value))
|
||||||
UniverseLib.Config.ConfigManager.Force_Unlock_Mouse = !UniverseLib.Config.ConfigManager.Force_Unlock_Mouse;
|
UniverseLib.Config.ConfigManager.Force_Unlock_Mouse = !UniverseLib.Config.ConfigManager.Force_Unlock_Mouse;
|
||||||
|
|
||||||
// update focused panel
|
|
||||||
UIPanel.UpdateFocus();
|
|
||||||
PanelDragger.UpdateInstances();
|
|
||||||
|
|
||||||
// update the timescale value
|
// update the timescale value
|
||||||
if (!timeInput.Component.isFocused && lastTimeScale != Time.timeScale)
|
if (!timeInput.Component.isFocused && lastTimeScale != Time.timeScale)
|
||||||
{
|
{
|
||||||
@ -172,33 +161,26 @@ namespace UnityExplorer.UI
|
|||||||
|
|
||||||
// Panels
|
// Panels
|
||||||
|
|
||||||
public static UIPanel GetPanel(Panels panel) => UIPanels[panel];
|
public static UEPanel GetPanel(Panels panel) => UIPanels[panel];
|
||||||
|
|
||||||
public static T GetPanel<T>(Panels panel) where T : UIPanel => (T)UIPanels[panel];
|
public static T GetPanel<T>(Panels panel) where T : UEPanel => (T)UIPanels[panel];
|
||||||
|
|
||||||
public static void TogglePanel(Panels panel)
|
public static void TogglePanel(Panels panel)
|
||||||
{
|
{
|
||||||
UIPanel uiPanel = GetPanel(panel);
|
UEPanel uiPanel = GetPanel(panel);
|
||||||
SetPanelActive(panel, !uiPanel.Enabled);
|
SetPanelActive(panel, !uiPanel.Enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetPanelActive(Panels panelType, bool active)
|
public static void SetPanelActive(Panels panelType, bool active)
|
||||||
{
|
{
|
||||||
GetPanel(panelType)
|
GetPanel(panelType).SetActive(active);
|
||||||
.SetActive(active);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetPanelActive(UIPanel panel, bool active)
|
public static void SetPanelActive(UEPanel panel, bool active)
|
||||||
{
|
{
|
||||||
panel.SetActive(active);
|
panel.SetActive(active);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void SetPanelActive(Transform transform, bool value)
|
|
||||||
{
|
|
||||||
if (UIPanel.transformToPanelDict.TryGetValue(transform.GetInstanceID(), out UIPanel panel))
|
|
||||||
panel.SetActive(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// navbar
|
// navbar
|
||||||
|
|
||||||
public static void SetNavBarAnchor()
|
public static void SetNavBarAnchor()
|
||||||
@ -229,10 +211,10 @@ namespace UnityExplorer.UI
|
|||||||
lastScreenWidth = display.renderingWidth;
|
lastScreenWidth = display.renderingWidth;
|
||||||
lastScreenHeight = display.renderingHeight;
|
lastScreenHeight = display.renderingHeight;
|
||||||
|
|
||||||
foreach (KeyValuePair<Panels, UIPanel> panel in UIPanels)
|
foreach (KeyValuePair<Panels, UEPanel> panel in UIPanels)
|
||||||
{
|
{
|
||||||
panel.Value.EnsureValidSize();
|
panel.Value.EnsureValidSize();
|
||||||
UIPanel.EnsureValidPosition(panel.Value.Rect);
|
panel.Value.EnsureValidPosition();
|
||||||
panel.Value.Dragger.OnEndResize();
|
panel.Value.Dragger.OnEndResize();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -285,20 +267,6 @@ namespace UnityExplorer.UI
|
|||||||
|
|
||||||
// UI Construction
|
// UI Construction
|
||||||
|
|
||||||
private static void CreatePanelHolder()
|
|
||||||
{
|
|
||||||
PanelHolder = new GameObject("PanelHolder");
|
|
||||||
PanelHolder.transform.SetParent(UIRoot.transform, false);
|
|
||||||
PanelHolder.layer = 5;
|
|
||||||
RectTransform rect = PanelHolder.AddComponent<RectTransform>();
|
|
||||||
rect.sizeDelta = Vector2.zero;
|
|
||||||
rect.anchoredPosition = Vector2.zero;
|
|
||||||
rect.pivot = new Vector2(0.5f, 0.5f);
|
|
||||||
rect.anchorMin = Vector2.zero;
|
|
||||||
rect.anchorMax = Vector2.one;
|
|
||||||
PanelHolder.transform.SetAsFirstSibling();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CreateTopNavBar()
|
private static void CreateTopNavBar()
|
||||||
{
|
{
|
||||||
GameObject navbarPanel = UIFactory.CreateUIObject("MainNavbar", UIRoot);
|
GameObject navbarPanel = UIFactory.CreateUIObject("MainNavbar", UIRoot);
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Specialized;
|
using System.Collections.Specialized;
|
||||||
using UnityExplorer.CacheObject.IValues;
|
using UnityExplorer.CacheObject.IValues;
|
||||||
|
using UnityExplorer.UI.Panels;
|
||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
using UniverseLib.Utility;
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using UnityExplorer.UI.Panels;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
using UniverseLib.Utility;
|
using UniverseLib.Utility;
|
||||||
|
@ -103,7 +103,7 @@ namespace UnityExplorer.UI.Widgets
|
|||||||
image.sprite = sprite;
|
image.sprite = sprite;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnInspectorFinishResize(RectTransform _)
|
private void OnInspectorFinishResize()
|
||||||
{
|
{
|
||||||
SetImageSize();
|
SetImageSize();
|
||||||
}
|
}
|
||||||
|
@ -79,11 +79,11 @@
|
|||||||
<!-- il2cpp nuget -->
|
<!-- il2cpp nuget -->
|
||||||
<ItemGroup Condition="'$(Configuration)'=='ML_Cpp_net6' or '$(Configuration)'=='ML_Cpp_net472' or '$(Configuration)'=='STANDALONE_Cpp' or '$(Configuration)'=='BIE_Cpp'">
|
<ItemGroup Condition="'$(Configuration)'=='ML_Cpp_net6' or '$(Configuration)'=='ML_Cpp_net472' or '$(Configuration)'=='STANDALONE_Cpp' or '$(Configuration)'=='BIE_Cpp'">
|
||||||
<PackageReference Include="Il2CppAssemblyUnhollower.BaseLib" Version="0.4.22" IncludeAssets="compile" />
|
<PackageReference Include="Il2CppAssemblyUnhollower.BaseLib" Version="0.4.22" IncludeAssets="compile" />
|
||||||
<PackageReference Include="UniverseLib.IL2CPP" Version="1.3.2" />
|
<PackageReference Include="UniverseLib.IL2CPP" Version="1.3.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<!-- mono nuget -->
|
<!-- mono nuget -->
|
||||||
<ItemGroup Condition="'$(Configuration)'=='BIE6_Mono' or '$(Configuration)'=='BIE5_Mono' or '$(Configuration)'=='ML_Mono' or '$(Configuration)'=='STANDALONE_Mono'">
|
<ItemGroup Condition="'$(Configuration)'=='BIE6_Mono' or '$(Configuration)'=='BIE5_Mono' or '$(Configuration)'=='ML_Mono' or '$(Configuration)'=='STANDALONE_Mono'">
|
||||||
<PackageReference Include="UniverseLib.Mono" Version="1.3.2" />
|
<PackageReference Include="UniverseLib.Mono" Version="1.3.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<!-- ~~~~~ ASSEMBLY REFERENCES ~~~~~ -->
|
<!-- ~~~~~ ASSEMBLY REFERENCES ~~~~~ -->
|
||||||
|
Loading…
x
Reference in New Issue
Block a user