/// <summary> /// Initializes the IconCollection /// Creates Orbitrings, TextIcons and Entityicons and adds them to Collection /// </summary> /// <param name="entities"></param> /// <param name="camera"></param> public void Init(IEnumerable <Entity> entities, Camera2dv2 camera) { IconDict.Clear(); OrbitList.Clear(); TextIconList.Clear(); EntityList.Clear(); scale = new ScaleIcon(camera); foreach (var item in entities) { if (item.HasDataBlob <OrbitDB>() && item.GetDataBlob <OrbitDB>().Parent != null) { OrbitRing ring = new OrbitRing(item, camera); OrbitList.Add(ring); } if (item.HasDataBlob <NameDB>()) { TextIconList.Add(new TextIcon(item, camera)); } EntityIcon entIcon = new EntityIcon(item, camera); EntityList.Add(entIcon); IconDict.Add(item.Guid, entIcon); } }
internal void HandleChange(EntityChangeData changeData) { if (changeData.ChangeType == EntityChangeData.EntityChangeType.DBAdded) { if (changeData.Datablob is OrbitDB && changeData.Entity.GetDataBlob <OrbitDB>().Parent != null) { if (!((OrbitDB)changeData.Datablob).IsStationary) { OrbitList[changeData.Entity.Guid] = new OrbitRing(changeData.Entity, _camera); } } if (changeData.Datablob is NameDB) { TextIconList[changeData.Entity.Guid] = new TextIcon(changeData.Entity, _camera); } IconDict[changeData.Entity.Guid] = new EntityIcon(changeData.Entity, _camera); } if (changeData.ChangeType == EntityChangeData.EntityChangeType.DBRemoved) { if (changeData.Datablob is OrbitDB) { OrbitList.Remove(changeData.Entity.Guid); } if (changeData.Datablob is NameDB) { TextIconList.Remove(changeData.Entity.Guid); } } }
/// <summary> /// Distributes the TextIcons, when they are overlapping /// </summary> public void TextIconsDistribute() { List <Rectangle> occupiedPosition = new List <Rectangle>(); IComparer <Rectangle> byViewPos = new ByViewPosition(); foreach (var item in TextIconList) { item.ViewOffset = item.DefaultViewOffset; } //Consolidate TextIcons that share the same position and name TextIconList.Sort(); int ListLength = TextIconList.Count; int TextIconQuantity = 1; for (int i = 1; i < ListLength; i++) { if (TextIconList[i - 1].CompareTo(TextIconList[i]) == 0) { TextIconQuantity++; TextIconList.RemoveAt(i); i--; ListLength--; } else if (TextIconQuantity > 1) { TextIconList[i - 1].name += " x" + TextIconQuantity; TextIconQuantity = 1; } } //Placement happens bottom to top, left to right //Each newly placed Texticon is compared to only the Texticons that are placed above its position //Therefore a sorted list of the occupied Positions is maintained occupiedPosition.Add(TextIconList[0].ViewDisplayRect); for (int i = 1; i < TextIconList.Count; i++) { var lowestPosIndex = occupiedPosition.BinarySearch(TextIconList[i].ViewDisplayRect + new Point(0, (int)TextIconList[i].ViewNameSize.Height), byViewPos); if (lowestPosIndex < 0) { lowestPosIndex = ~lowestPosIndex; } for (int j = lowestPosIndex; j < occupiedPosition.Count; j++) { if (TextIconList[i].ViewDisplayRect.Intersects(occupiedPosition[j])) { TextIconList[i].ViewOffset -= new PointF(0, TextIconList[i].ViewDisplayRect.Bottom - occupiedPosition[j].Top); } } //Inserts the new label sorted var InsertIndex = occupiedPosition.BinarySearch(TextIconList[i].ViewDisplayRect, byViewPos); if (InsertIndex < 0) { InsertIndex = ~InsertIndex; } occupiedPosition.Insert(InsertIndex, TextIconList[i].ViewDisplayRect); } }
/// <summary> /// Initializes the IconCollection /// Creates Orbitrings, TextIcons and Entityicons and adds them to Collection /// </summary> /// <param name="entities"></param> /// <param name="camera"></param> public void Init(IEnumerable <Entity> entities, Camera2dv2 camera) { IconDict.Clear(); OrbitList.Clear(); TextIconList.Clear(); EntityList.Clear(); _camera = camera; Scale = new ScaleIcon(_camera); foreach (var item in entities) { AddNewIcon(item); } }
internal void RemoveIcon(Entity entity) { if (OrbitList.ContainsKey(entity.Guid)) { OrbitList.Remove(entity.Guid); } if (TextIconList.ContainsKey(entity.Guid)) { TextIconList.Remove(entity.Guid); } if (IconDict.ContainsKey(entity.Guid)) { IconDict.Remove(entity.Guid); } }
internal void AddNewIcon(Entity entity) { if (entity.HasDataBlob <OrbitDB>() && entity.GetDataBlob <OrbitDB>().Parent != null) { if (!entity.GetDataBlob <OrbitDB>().IsStationary) { OrbitRing ring = new OrbitRing(entity, _camera); OrbitList.Add(entity.Guid, ring); } } if (entity.HasDataBlob <NameDB>()) { TextIconList.Add(entity.Guid, new TextIcon(entity, _camera)); } EntityIcon entIcon = new EntityIcon(entity, _camera); EntityList.Add(entity.Guid, entIcon); IconDict.Add(entity.Guid, entIcon); }