A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections.Generic;
3using UnityEngine;
4
5namespace Unity.VisualScripting
6{
7 public class GraphData<TGraph> : IGraphData
8 where TGraph : class, IGraph
9 {
10 public GraphData(TGraph definition)
11 {
12 this.definition = definition;
13 }
14
15 protected TGraph definition { get; }
16
17 protected Dictionary<IGraphElementWithData, IGraphElementData> elementsData { get; } = new Dictionary<IGraphElementWithData, IGraphElementData>();
18
19 protected Dictionary<IGraphParentElement, IGraphData> childrenGraphsData { get; } = new Dictionary<IGraphParentElement, IGraphData>();
20
21 protected Dictionary<Guid, IGraphElementData> phantomElementsData { get; } = new Dictionary<Guid, IGraphElementData>();
22
23 protected Dictionary<Guid, IGraphData> phantomChildrenGraphsData { get; } = new Dictionary<Guid, IGraphData>();
24
25 public bool TryGetElementData(IGraphElementWithData element, out IGraphElementData data)
26 {
27 return elementsData.TryGetValue(element, out data);
28 }
29
30 public bool TryGetChildGraphData(IGraphParentElement element, out IGraphData data)
31 {
32 return childrenGraphsData.TryGetValue(element, out data);
33 }
34
35 public IGraphElementData CreateElementData(IGraphElementWithData element)
36 {
37 // Debug.Log($"Creating element data for {element}");
38
39 if (elementsData.ContainsKey(element))
40 {
41 throw new InvalidOperationException($"Graph data already contains element data for {element}.");
42 }
43
44 IGraphElementData elementData;
45
46 if (phantomElementsData.TryGetValue(element.guid, out elementData))
47 {
48 // Debug.Log($"Restoring phantom element data for {element}.");
49 phantomElementsData.Remove(element.guid);
50 }
51 else
52 {
53 elementData = element.CreateData();
54 }
55
56 elementsData.Add(element, elementData);
57
58 return elementData;
59 }
60
61 public void FreeElementData(IGraphElementWithData element)
62 {
63 // Debug.Log($"Freeing element data for {element}");
64
65 if (elementsData.TryGetValue(element, out var elementData))
66 {
67 elementsData.Remove(element);
68 phantomElementsData.Add(element.guid, elementData);
69 }
70 else
71 {
72 Debug.LogWarning($"Graph data does not contain element data to free for {element}.");
73 }
74 }
75
76 public IGraphData CreateChildGraphData(IGraphParentElement element)
77 {
78 // Debug.Log($"Creating child graph data for {element}");
79
80 if (childrenGraphsData.ContainsKey(element))
81 {
82 throw new InvalidOperationException($"Graph data already contains child graph data for {element}.");
83 }
84
85 IGraphData childGraphData;
86
87 if (phantomChildrenGraphsData.TryGetValue(element.guid, out childGraphData))
88 {
89 // Debug.Log($"Restoring phantom child graph data for {element}.");
90 phantomChildrenGraphsData.Remove(element.guid);
91 }
92 else
93 {
94 childGraphData = element.childGraph.CreateData();
95 }
96
97 childrenGraphsData.Add(element, childGraphData);
98
99 return childGraphData;
100 }
101
102 public void FreeChildGraphData(IGraphParentElement element)
103 {
104 // Debug.Log($"Freeing child graph data for {element}");
105
106 if (childrenGraphsData.TryGetValue(element, out var childGraphData))
107 {
108 childrenGraphsData.Remove(element);
109 phantomChildrenGraphsData.Add(element.guid, childGraphData);
110 }
111 else
112 {
113 Debug.LogWarning($"Graph data does not contain child graph data to free for {element}.");
114 }
115 }
116 }
117}