コード例 #1
0
ファイル: IconCollection.cs プロジェクト: johny5w/Pulsar4x
        /// <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);
            }
        }
コード例 #2
0
        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);
                }
            }
        }
コード例 #3
0
ファイル: IconCollection.cs プロジェクト: johny5w/Pulsar4x
        /// <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);
            }
        }
コード例 #4
0
        /// <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);
            }
        }
コード例 #5
0
 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);
     }
 }
コード例 #6
0
        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);
        }