forked from TrackMan/Unity.Package.FigmaToUnity
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVisualElementExtensions.cs
120 lines (105 loc) · 5.46 KB
/
VisualElementExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
using System;
using System.Collections;
using System.Collections.Generic;
using Trackman;
using UnityEngine.UIElements;
namespace Figma
{
public static class VisualElementExtensions
{
#region Fields
static Dictionary<(VisualElement prefab, VisualElement parent), IList> cloneDictionary = new();
#endregion
#region Constructors
static VisualElementExtensions() => DisposeStatic.OnDisposeStatic += () => cloneDictionary.Clear();
#endregion
#region Methods
public static bool HasVisibility(this VisualElement element) => element.style.visibility == Visibility.Visible;
public static void MakeVisible(this VisualElement element) => element.style.visibility = Visibility.Visible;
public static void MakeInvisible(this VisualElement element) => element.style.visibility = Visibility.Hidden;
public static void SetVisibility(this VisualElement element, bool visible)
{
if (visible) element.MakeVisible();
else element.MakeInvisible();
}
public static bool IsShowing(this VisualElement element) => element.resolvedStyle.display == DisplayStyle.Flex;
public static void Show(this VisualElement element)
{
element.style.display = DisplayStyle.Flex;
element.MarginMe();
}
public static void Hide(this VisualElement element) => element.style.display = DisplayStyle.None;
public static void SetDisplay(this VisualElement element, bool visible)
{
if (visible) Show(element);
else Hide(element);
}
public static void Disable(this VisualElement element) => element.pickingMode = PickingMode.Ignore;
public static void Enable(this VisualElement element) => element.pickingMode = PickingMode.Position;
public static IList EnsureList<TVisualElement>(TVisualElement prefab, VisualElement parent) where TVisualElement : VisualElement
{
(TVisualElement prefab, VisualElement parent) identifier = (prefab, parent);
if (!cloneDictionary.TryGetValue(identifier, out IList elements))
cloneDictionary.Add(identifier, elements = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(prefab.GetType())));
return elements;
}
public static TVisualElement GetElement<TVisualElement>(this TVisualElement prefab, int index) where TVisualElement : VisualElement => GetElements(prefab, prefab.parent)[index];
public static List<TVisualElement> GetElements<TVisualElement>(this TVisualElement prefab) where TVisualElement : VisualElement => GetElements(prefab, prefab.parent);
public static List<TVisualElement> GetElements<TVisualElement>(this TVisualElement prefab, VisualElement parent) where TVisualElement : VisualElement
{
if (EnsureList(prefab, parent) is List<TVisualElement> list) return list;
throw new ArgumentException($"Casting from {typeof(List<TVisualElement>)} to {cloneDictionary[(prefab, parent)]}");
}
public static List<VisualElement> GetElements(this VisualElement prefab) => GetElements<VisualElement>(prefab);
public static List<VisualElement> GetElements(this VisualElement prefab, VisualElement parent) => GetElements<VisualElement>(prefab, parent);
public static void Sync<TVisualElement, TData>(this TVisualElement prefab, VisualElement parent, IEnumerable<TData> data, Action<TVisualElement> onCreateElement = default) where TVisualElement : VisualElement, ISyncElement<TData>
{
IList elements = EnsureList(prefab, parent);
int i = 0;
foreach (TData value in data)
{
TVisualElement element;
if (i >= elements.Count)
{
element = prefab.Clone(parent, i);
element.Initialize(i);
onCreateElement?.Invoke(element);
elements.Add(element);
}
else
{
element = (TVisualElement)elements[i];
}
if (element.IsVisible(i, value)) element.Show();
else element.Hide();
++i;
}
for (int j = i; j < elements.Count; ++j) elements[j].As<TVisualElement>().Hide();
}
public static void Sync<TVisualElement, TCreationData, TData>(this TVisualElement prefab, VisualElement parent, TCreationData creationData, IEnumerable<TData> data, Action<TVisualElement> onCreateElement = default) where TVisualElement : VisualElement, ISyncElement<TCreationData, TData>
{
IList elements = EnsureList(prefab, parent);
int i = 0;
foreach (TData value in data)
{
TVisualElement element;
if (i >= elements.Count)
{
element = prefab.Clone(parent, i);
element.Initialize(i, creationData);
onCreateElement?.Invoke(element);
elements.Add(element);
}
else
{
element = (TVisualElement)elements[i];
}
if (element.IsVisible(i, value)) element.Show();
else element.Hide();
++i;
}
for (int j = i; j < elements.Count; ++j) elements[j].As<TVisualElement>().Hide();
}
#endregion
}
}