Compare commits

..

1 Commits

Author SHA1 Message Date
a051415c16 WIP 2024-08-13 17:12:50 +02:00
20 changed files with 85 additions and 157 deletions

View File

@ -1,4 +1,5 @@
using UnityEngine; using UnityEngine;
using UnityEngine.SceneManagement;
namespace NEG.Utils namespace NEG.Utils
{ {

View File

@ -185,10 +185,8 @@ public static class BuildingUtils
string command = string command =
$"cd {Application.dataPath}/../../{Application.productName}-Steam/ContentBuilder && push_build.bat"; $"cd {Application.dataPath}/../../{Application.productName}-Steam/ContentBuilder && push_build.bat";
if (demo) if (demo)
{
command = command =
$"cd {Application.dataPath}/../../{Application.productName}-Steam/ContentBuilder && push_demo.bat"; $"cd {Application.dataPath}/../../{Application.productName}-Steam/ContentBuilder && push_demo.bat";
}
var processInfo = new ProcessStartInfo("cmd.exe", $"/c {command}") var processInfo = new ProcessStartInfo("cmd.exe", $"/c {command}")
{ {

View File

@ -102,10 +102,8 @@ namespace NegUtils.Editor
return; return;
if (EditorPrefs.GetBool("GoToCurrentSceneAfterPlay")) if (EditorPrefs.GetBool("GoToCurrentSceneAfterPlay"))
{
EditorSceneManager.LoadSceneInPlayMode(EditorPrefs.GetString("LastOpenedScenePath"), EditorSceneManager.LoadSceneInPlayMode(EditorPrefs.GetString("LastOpenedScenePath"),
new LoadSceneParameters(LoadSceneMode.Single)); new LoadSceneParameters(LoadSceneMode.Single));
}
else if (EditorPrefs.GetBool("GoToFirstSceneAfterPlay")) else if (EditorPrefs.GetBool("GoToFirstSceneAfterPlay"))
SceneManager.LoadScene(1); SceneManager.LoadScene(1);
} }

View File

@ -31,12 +31,10 @@ namespace NEG.Utils
var methodFields = var methodFields =
type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
for (int i = 0; i < methodFields.Length; i++) for (int i = 0; i < methodFields.Length; i++)
{
if (Attribute.GetCustomAttribute(methodFields[i], typeof(FactoryRegistration)) != null) if (Attribute.GetCustomAttribute(methodFields[i], typeof(FactoryRegistration)) != null)
methodFields[i].Invoke(null, Array.Empty<object>()); methodFields[i].Invoke(null, Array.Empty<object>());
} }
} }
}
public void Register(T1 key, Type type) => data.Add(key, type); public void Register(T1 key, Type type) => data.Add(key, type);

3
NEG/UI/AssemblyInfo.cs Normal file
View File

@ -0,0 +1,3 @@
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("NEG.UI.UnityUi")]

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1bf54cf2dc934c9b85c514bb01057e64
timeCreated: 1716843793

View File

@ -248,10 +248,8 @@ namespace System.Collections.Generic
public PriorityQueue(int initialCapacity, IComparer<TPriority>? comparer) public PriorityQueue(int initialCapacity, IComparer<TPriority>? comparer)
{ {
if (initialCapacity < 0) if (initialCapacity < 0)
{
throw new ArgumentOutOfRangeException( throw new ArgumentOutOfRangeException(
nameof(initialCapacity), initialCapacity, SR.ArgumentOutOfRange_NeedNonNegNum); nameof(initialCapacity), initialCapacity, SR.ArgumentOutOfRange_NeedNonNegNum);
}
_nodes = new (TElement, TPriority)[initialCapacity]; _nodes = new (TElement, TPriority)[initialCapacity];
_comparer = InitializeComparer(comparer); _comparer = InitializeComparer(comparer);
@ -510,8 +508,9 @@ namespace System.Collections.Generic
if (_size > 1) Heapify(); if (_size > 1) Heapify();
} }
else else
foreach (var (element, priority) in items) {
Enqueue(element, priority); foreach (var (element, priority) in items) Enqueue(element, priority);
}
} }
/// <summary> /// <summary>
@ -555,8 +554,9 @@ namespace System.Collections.Generic
if (i > 1) Heapify(); if (i > 1) Heapify();
} }
else else
foreach (var element in elements) {
Enqueue(element, priority); foreach (var element in elements) Enqueue(element, priority);
}
} }
/// <summary> /// <summary>
@ -684,16 +684,12 @@ namespace System.Collections.Generic
int lastParentWithChildren = GetParentIndex(_size - 1); int lastParentWithChildren = GetParentIndex(_size - 1);
if (_comparer == null) if (_comparer == null)
{
for (int index = lastParentWithChildren; index >= 0; --index) for (int index = lastParentWithChildren; index >= 0; --index)
MoveDownDefaultComparer(nodes[index], index); MoveDownDefaultComparer(nodes[index], index);
}
else else
{
for (int index = lastParentWithChildren; index >= 0; --index) for (int index = lastParentWithChildren; index >= 0; --index)
MoveDownCustomComparer(nodes[index], index); MoveDownCustomComparer(nodes[index], index);
} }
}
/// <summary> /// <summary>
/// Moves a node up in the tree to restore heap order. /// Moves a node up in the tree to restore heap order.
@ -719,8 +715,10 @@ namespace System.Collections.Generic
nodeIndex = parentIndex; nodeIndex = parentIndex;
} }
else else
{
break; break;
} }
}
nodes[nodeIndex] = node; nodes[nodeIndex] = node;
} }
@ -750,8 +748,10 @@ namespace System.Collections.Generic
nodeIndex = parentIndex; nodeIndex = parentIndex;
} }
else else
{
break; break;
} }
}
nodes[nodeIndex] = node; nodes[nodeIndex] = node;
} }
@ -894,10 +894,8 @@ namespace System.Collections.Generic
if (array.GetLowerBound(0) != 0) throw new ArgumentException(SR.Arg_NonZeroLowerBound, nameof(array)); if (array.GetLowerBound(0) != 0) throw new ArgumentException(SR.Arg_NonZeroLowerBound, nameof(array));
if (index < 0 || index > array.Length) if (index < 0 || index > array.Length)
{
throw new ArgumentOutOfRangeException(nameof(index), index, throw new ArgumentOutOfRangeException(nameof(index), index,
SR.ArgumentOutOfRange_IndexMustBeLessOrEqual); SR.ArgumentOutOfRange_IndexMustBeLessOrEqual);
}
if (array.Length - index < _queue._size) throw new ArgumentException(SR.Argument_InvalidOffLen); if (array.Length - index < _queue._size) throw new ArgumentException(SR.Argument_InvalidOffLen);

View File

@ -13,31 +13,6 @@ namespace NEG.UI
[PublicAPI] [PublicAPI]
public abstract class UiManager : IDisposable public abstract class UiManager : IDisposable
{ {
private IArea currentArea;
protected IDefaultPopup currentDefaultPopup;
private (PopupData data, int priority) currentShownPopup;
//TODO: localize
private string localizedYes = "Yes", localizedNo = "No", localizedOk = "Ok";
private List<IWindow> mainWindows;
private PriorityQueue<PopupData, int> popupsToShow = new();
protected UiManager(IArea startArea)
{
if (Instance != null)
{
Debug.LogError("Only one instance od UiManager is allowed");
return;
}
Instance = this;
CurrentArea = startArea;
mainWindows = new List<IWindow>();
}
public static UiManager Instance { get; protected set; } public static UiManager Instance { get; protected set; }
/// <summary> /// <summary>
@ -63,6 +38,31 @@ namespace NEG.UI
public PopupData CurrentPopup => currentShownPopup.data; public PopupData CurrentPopup => currentShownPopup.data;
private IArea currentArea;
protected IDefaultPopup currentDefaultPopup;
private (PopupData data, int priority) currentShownPopup;
//TODO: localize
private string localizedYes = "Yes", localizedNo = "No", localizedOk = "Ok";
private List<IWindow> mainWindows;
private PriorityQueue<PopupData, int> popupsToShow = new();
private Dictionary<string, IWindow> registeredWindows = new();
protected UiManager(IArea startArea = default)
{
if (Instance != null)
{
Debug.LogError("Only one instance od UiManager is allowed");
return;
}
Instance = this;
CurrentArea = startArea;
mainWindows = new List<IWindow>();
}
public virtual void Dispose() => Instance = null; public virtual void Dispose() => Instance = null;
/// <summary> /// <summary>
@ -164,6 +164,9 @@ namespace NEG.UI
public void OnWindowClosed(IWindow window) => MainWindowClosed(window); public void OnWindowClosed(IWindow window) => MainWindowClosed(window);
internal void RegisterWindow(IWindow window) => registeredWindows.Add(window.WindowId, window);
internal void UnRegisterWindow(IWindow window) => registeredWindows.Remove(window.WindowId);
//TODO: select new main window //TODO: select new main window
protected void PopupClosed(PopupData data) protected void PopupClosed(PopupData data)
{ {

View File

@ -29,7 +29,7 @@ namespace NEG.UI.Area
private void OnDestroy() private void OnDestroy()
{ {
if (UiManager.Instance == null) if(UiManager.Instance == null)
return; return;
if (ReferenceEquals(UiManager.Instance.CurrentArea, this)) if (ReferenceEquals(UiManager.Instance.CurrentArea, this))
UiManager.Instance.CurrentArea = null; UiManager.Instance.CurrentArea = null;

View File

@ -43,7 +43,10 @@ namespace NEG.UI.UnityUi.Buttons
private void Start() => OnDeselect(null); private void Start() => OnDeselect(null);
private void OnValidate() => this.ValidateRefs(); private void OnValidate()
{
this.ValidateRefs();
}
public void OnDeselect(BaseEventData eventData) => OnDeselected?.Invoke(eventData is SilentEventData); public void OnDeselect(BaseEventData eventData) => OnDeselected?.Invoke(eventData is SilentEventData);

View File

@ -1,4 +1,3 @@
using UnityEditor;
using UnityEngine; using UnityEngine;
namespace NEG.UI.UnityUi.Buttons.Reactions namespace NEG.UI.UnityUi.Buttons.Reactions
@ -8,7 +7,7 @@ namespace NEG.UI.UnityUi.Buttons.Reactions
protected override void OnClicked() protected override void OnClicked()
{ {
#if UNITY_EDITOR #if UNITY_EDITOR
EditorApplication.isPlaying = false; UnityEditor.EditorApplication.isPlaying = false;
#endif #endif
Application.Quit(); Application.Quit();
} }

View File

@ -74,12 +74,10 @@ namespace NEG.UI.UnityUi
var data = new PointerEventData(EventSystem.current); var data = new PointerEventData(EventSystem.current);
var currentSelected = EventSystem.current.currentSelectedGameObject; var currentSelected = EventSystem.current.currentSelectedGameObject;
if (currentSelected != null) if (currentSelected != null)
{
for (var current = EventSystem.current.currentSelectedGameObject.transform; for (var current = EventSystem.current.currentSelectedGameObject.transform;
current != null; current != null;
current = current.parent) current = current.parent)
ExecuteEvents.Execute(current.gameObject, data, ExecuteEvents.pointerExitHandler); ExecuteEvents.Execute(current.gameObject, data, ExecuteEvents.pointerExitHandler);
}
EventSystem.current.SetSelectedGameObject(currentSelected); EventSystem.current.SetSelectedGameObject(currentSelected);
} }

View File

@ -12,25 +12,44 @@ namespace NEG.UI.UnityUi.Window
[DefaultExecutionOrder(10)] [DefaultExecutionOrder(10)]
public class MonoWindow : MonoBehaviour, IWindow public class MonoWindow : MonoBehaviour, IWindow
{ {
[SerializeField] private List<MonoWindowSlot> windowSlots; public event Action<object> OnOpened;
public event Action OnClosed;
public event Action<IControllable.BackUsed> OnBackUsed;
[SerializeField] private GameObject defaultSelectedItem; [field: SerializeField] public string WindowId { get; private set; }
public bool IsMainWindow { get; } public IEnumerable<IWindowSlot> AvailableSlots => windowSlots;
public IWindowSlot Parent { get; private set; }
public bool IsOpened { get; protected set; } public bool IsOpened { get; protected set; }
private IWindowSlot DefaultWindowSlot => windowSlots[0]; public bool IsMainWindow { get; }
public GameObject DefaultSelectedItem => defaultSelectedItem; public GameObject DefaultSelectedItem => defaultSelectedItem;
private void Awake() => ((IWindow)this).SetHiddenState(); [SerializeField] private List<MonoWindowSlot> windowSlots;
[SerializeField] private string windowName;
[SerializeField] private GameObject defaultSelectedItem;
private IWindowSlot DefaultWindowSlot => windowSlots[0];
private void Awake()
{
UiManager.Instance.RegisterWindow(this);
((IWindow)this).SetHiddenState();
}
private void OnDestroy() private void OnDestroy()
{ {
if (UiManager.Instance == null) if(UiManager.Instance == null)
return; return;
if (IsOpened) if (IsOpened)
UiManager.Instance.OnWindowClosed(this); UiManager.Instance.OnWindowClosed(this);
UiManager.Instance.UnRegisterWindow(this);
} }
private void OnValidate() private void OnValidate()
@ -41,13 +60,6 @@ namespace NEG.UI.UnityUi.Window
#endif #endif
} }
public event Action<object> OnOpened;
public event Action OnClosed;
public event Action<IControllable.BackUsed> OnBackUsed;
public IEnumerable<IWindowSlot> AvailableSlots => windowSlots;
public IWindowSlot Parent { get; private set; }
public void SetOpenedState(IWindowSlot parentSlot, object data) public void SetOpenedState(IWindowSlot parentSlot, object data)
{ {
gameObject.SetActive(true); gameObject.SetActive(true);

View File

@ -12,6 +12,8 @@ namespace NEG.UI.Window
/// </summary> /// </summary>
IWindowSlot Parent { get; } IWindowSlot Parent { get; }
string WindowId { get; }
/// <summary> /// <summary>
/// Called internally by slot to open window. /// Called internally by slot to open window.
/// </summary> /// </summary>

View File

@ -5,4 +5,5 @@ namespace NEG.Utils
public class ReadOnlyAttribute : PropertyAttribute public class ReadOnlyAttribute : PropertyAttribute
{ {
} }
} }

View File

@ -1,85 +0,0 @@
using System;
using UnityEngine;
namespace NEG.Utils
{
[Serializable]
public struct SerializableGuid : IComparable, IComparable<SerializableGuid>, IEquatable<SerializableGuid>
{
[SerializeField] private uint value0;
[SerializeField] private uint value1;
[SerializeField] private uint value2;
[SerializeField] private uint value3;
// public SerializableGuid(string hexRepresentation)
// {
// value0 = 0U;
// value1 = 0U;
// value2 = 0U;
// value3 = 0U;
// TryParse(hexRepresentation, out this);
// }
public static bool operator ==(SerializableGuid x, SerializableGuid y)
{
return (int)x.value0 == (int)y.value0 && (int)x.value1 == (int)y.value1 &&
(int)x.value2 == (int)y.value2 && (int)x.value3 == (int)y.value3;
}
public static bool operator !=(SerializableGuid x, SerializableGuid y) => !(x == y);
public static bool operator <(SerializableGuid x, SerializableGuid y)
{
if ((int)x.value0 != (int)y.value0)
return x.value0 < y.value0;
if ((int)x.value1 != (int)y.value1)
return x.value1 < y.value1;
return (int)x.value2 != (int)y.value2 ? x.value2 < y.value2 : x.value3 < y.value3;
}
public static bool operator > (SerializableGuid x, SerializableGuid y) => !(x < y) && !(x == y);
public override bool Equals(object obj) => obj is SerializableGuid guid && Equals(guid);
public bool Equals(SerializableGuid obj) => this == obj;
public override int GetHashCode()
{
return ((((((int)value0 * 397) ^ (int)value1) * 397) ^ (int)value2) * 397) ^
(int)value3;
}
public int CompareTo(object obj) => obj == null ? 1 : CompareTo((SerializableGuid)obj);
public int CompareTo(SerializableGuid rhs)
{
if (this < rhs)
return -1;
return this > rhs ? 1 : 0;
}
public bool Empty() => value0 == 0U && value1 == 0U && value2 == 0U && value3 == 0U;
// public static bool TryParse(string hex, out SerializableGuid result)
// {
// result = HexToSerializableGuidInternal(hex);
// return !result.Empty();
// }
public static SerializableGuid Generate()
{
byte[] array = Guid.NewGuid().ToByteArray();
var guid = new SerializableGuid
{
value0 = BitConverter.ToUInt32(new ReadOnlySpan<byte>(array, 0, 4)),
value1 = BitConverter.ToUInt32(new ReadOnlySpan<byte>(array, 4, 4)),
value2 = BitConverter.ToUInt32(new ReadOnlySpan<byte>(array, 8, 4)),
value3 = BitConverter.ToUInt32(new ReadOnlySpan<byte>(array, 12, 4))
};
return guid;
}
//public override string ToString() => SerializableGuidToHexInternal(ref this);
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: a81e7c502db5413194d0ebfc7bad054e
timeCreated: 1741038901

View File

@ -10,9 +10,10 @@ namespace NEG.Utils.UiToolkits
{ {
public class MultiSelectChips : VisualElement public class MultiSelectChips : VisualElement
{ {
private readonly VisualTreeAsset itemPrefab;
private readonly List<MultiSelectChipItem> spawnedItems = new(); private readonly List<MultiSelectChipItem> spawnedItems = new();
private readonly VisualTreeAsset itemPrefab;
private ICollection<IMultiSelectChipItem> itemsSource; private ICollection<IMultiSelectChipItem> itemsSource;
private Label label; private Label label;
@ -85,10 +86,8 @@ namespace NEG.Utils.UiToolkits
List<IMultiSelectChipItem> itemsToAdd = new(itemsSource); List<IMultiSelectChipItem> itemsToAdd = new(itemsSource);
foreach (var item in spawnedItems) foreach (var item in spawnedItems)
{
if (itemsToAdd.Contains(item.ChipItem)) if (itemsToAdd.Contains(item.ChipItem))
itemsToAdd.Remove(item.ChipItem); itemsToAdd.Remove(item.ChipItem);
}
foreach (var item in itemsToAdd) foreach (var item in itemsToAdd)
{ {

View File

@ -1,4 +1,4 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" <ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements"
xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements"
noNamespaceSchemaLocation="../../../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False"> noNamespaceSchemaLocation="../../../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
<ui:VisualElement name="VisualElement" class="unity-button" <ui:VisualElement name="VisualElement" class="unity-button"

View File

@ -1,4 +1,4 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" <ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements"
xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements"
noNamespaceSchemaLocation="../../../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False"> noNamespaceSchemaLocation="../../../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
<ui:VisualElement style="flex-direction: row; flex-wrap: wrap;"> <ui:VisualElement style="flex-direction: row; flex-wrap: wrap;">