private ModelTypeWidgetNode(Type modelType, int aggregationCount, Vector2 position, List <Type> previouslyReferencedTypes, bool stopRecursion = false) { TypeWidget = new ModelTypeWidget(modelType); this.aggregationCount = aggregationCount; TypeWidget.Position = position; nodes = new List <ModelTypeWidgetNode>(); if (stopRecursion) { return; } // Make a list with all referenced types including aggregated types of this type List <Type> afterReferencedTypes = new List <Type>(previouslyReferencedTypes); foreach (AggregatedModelType aggregatedType in TypeWidget.AggregatedTypes) { if (afterReferencedTypes.Contains(aggregatedType.ModelType)) { continue; } afterReferencedTypes.Add(aggregatedType.ModelType); } // Construct ModelTypeWidgetNodes for each aggregated type foreach (AggregatedModelType aggregatedType in TypeWidget.AggregatedTypes) { bool stop = previouslyReferencedTypes.Contains(aggregatedType.ModelType); previouslyReferencedTypes.Add(aggregatedType.ModelType); ModelTypeWidgetNode node = new ModelTypeWidgetNode(aggregatedType.ModelType, aggregatedType.AggregationCount, position + new Vector2(marginHor, Height), afterReferencedTypes, stop); nodes.Add(node); } }
public ModelStructuresRenderer() { rootNodes = new List <ModelTypeWidgetNode>(); // Create a rootNode for all types List <Type> types = CodeControlEditorHelper.GetAllModelTypes(); List <TypeAggregation> takenTypes = new List <TypeAggregation>(); foreach (Type type in types) { ModelTypeWidgetNode node = new ModelTypeWidgetNode(type); rootNodes.Add(node); List <TypeAggregation> aggregatedTypes = node.GetAggregatedTypes(); foreach (TypeAggregation aggregatedType in aggregatedTypes) { takenTypes.Add(aggregatedType); } } // Remove rootNodes that are aggregated in other rootNodes while (true) { bool rootNodeRemoved = false; for (int i = rootNodes.Count - 1; i >= 0; i--) { List <TypeAggregation> takenInTypes = takenTypes.FindAll(x => x.Child == rootNodes[i].TypeWidget.ModelType); foreach (TypeAggregation aggregation in takenInTypes) { // Check if the parent of this rootNode would remain in other rootNodes if this would be removed bool parentWillRemain = rootNodes.Find(x => x.TypeWidget.ModelType == aggregation.Parent) != null; if (!parentWillRemain) { foreach (ModelTypeWidgetNode rootNode in rootNodes) { if (rootNode == rootNodes[i]) { continue; } List <TypeAggregation> aggregatedTypes = rootNode.GetAggregatedTypes(); foreach (TypeAggregation aggregatedType in aggregatedTypes) { if (aggregatedType.Child == aggregation.Parent) { parentWillRemain = true; break; } } if (parentWillRemain) { break; } } } if (parentWillRemain) { rootNodes.RemoveAt(i); i = rootNodes.Count - 1; rootNodeRemoved = true; break; } } } if (!rootNodeRemoved) { break; } } // Position rootNodes float maxWidth = 0; float totalHeight = 0; foreach (ModelTypeWidgetNode rootNode in rootNodes) { rootNode.SetPosition(new Vector2(ModelTypeWidget.Width * .5f, ModelTypeWidget.Height * .5f + totalHeight)); maxWidth = Mathf.Max(maxWidth, rootNode.Width); totalHeight += rootNode.Height + marginVert; } boundingBox = new Rect(0, 0, maxWidth, totalHeight); }