/// <summary> /// Inserts a list item at the specified position in the list. /// </summary> /// <param name="item">Reference to the item to be inserted into the list.</param> /// <param name="position">0-based index of the position in the list where the item will be placed.</param> /// <param name="text">Text to display in the item (requires that the item has a TextMesh associated with it, preferably in a child GameObject).</param> public void InsertItem(IUIListObject item, int position, string text) { IUIListObject lastItem; float contentDelta; // Make sure Awake() has already run: if (!m_awake) Awake(); // Make sure Start() has already run: if (!m_started) Start(); // See if the item needs to be enabled: if (activateWhenAdding) { if (!((Component)item).gameObject.active) ((Component)item).gameObject.SetActiveRecursively(true); } // Now deactivate again if the list itself is deactivated: if(!gameObject.active) ((Component)item).gameObject.SetActiveRecursively(false); // Put the item in the correct layer: item.gameObject.layer = gameObject.layer; // Add the item to our container: if (container != null) container.AddChild(item.gameObject); //------------------------------------- // Position our item: //------------------------------------- item.transform.parent = mover.transform; #if AUTO_ORIENT_ITEMS item.transform.localRotation = Quaternion.identity; #endif #if AUTO_SCALE_ITEMS item.transform.localScale = Vector3.one; #endif // Go ahead and get the item in the mover's plane // on the local Z-axis. This must be done here // before anything that follows because if we are // using a perspective camera and these are newly // created items, their Start() will be called for // the first time when FindOuterEdges() is called // either by us, or by the Text property, and if // the item isn't already positioned relative to // the camera, then its size will be calculated // wrong. item.transform.localPosition = Vector3.zero; item.SetList(this); if (text != null) item.Text = text; // Compute the edges of the item: item.FindOuterEdges(); item.UpdateCollider(); // Clamp our position: position = Mathf.Clamp(position, 0, items.Count); // Hide the item by default: if(clipContents) { item.Hide(true); if (!item.Managed) item.gameObject.SetActiveRecursively(false); } // See if we can just add it to the end: if(position == items.Count) { float x=0, y=0; bool addItemSpacing = false; if (orientation == ORIENTATION.HORIZONTAL) { // Find the X-coordinate: if (items.Count > 0) { addItemSpacing = true; // We will be adding itemSpacing lastItem = items[items.Count - 1]; if (direction == DIRECTION.TtoB_LtoR) x = lastItem.transform.localPosition.x + lastItem.BottomRightEdge.x + itemSpacing - item.TopLeftEdge.x; else x = lastItem.transform.localPosition.x - lastItem.BottomRightEdge.x - itemSpacing + item.TopLeftEdge.x; } else { if (spacingAtEnds) addItemSpacing = true; // We will be adding itemSpacing if (direction == DIRECTION.TtoB_LtoR) x = (viewableArea.x * -0.5f) - item.TopLeftEdge.x + ((spacingAtEnds) ? (itemSpacing) : (0)); else x = (viewableArea.x * 0.5f) - item.BottomRightEdge.x - ((spacingAtEnds) ? (itemSpacing) : (0)); } // Find the Y-coordinate: switch(alignment) { case ALIGNMENT.CENTER: y = 0; break; case ALIGNMENT.LEFT_TOP: y = (viewableArea.y * 0.5f) - item.TopLeftEdge.y; break; case ALIGNMENT.RIGHT_BOTTOM: y = (viewableArea.y * -0.5f) - item.BottomRightEdge.y; break; } contentDelta = item.BottomRightEdge.x - item.TopLeftEdge.x + ((addItemSpacing) ? (itemSpacing) : (0)); } else { // Determine the Y-coordinate: if (items.Count > 0) { addItemSpacing = true; // We will be adding itemSpacing lastItem = items[items.Count - 1]; if(direction == DIRECTION.TtoB_LtoR) y = lastItem.transform.localPosition.y + lastItem.BottomRightEdge.y - itemSpacing - item.TopLeftEdge.y; else y = lastItem.transform.localPosition.y - lastItem.BottomRightEdge.y + itemSpacing + item.TopLeftEdge.y; } else { if (spacingAtEnds) addItemSpacing = true; // We will be adding itemSpacing if(direction == DIRECTION.TtoB_LtoR) y = (viewableArea.y * 0.5f) - item.TopLeftEdge.y - ((spacingAtEnds) ? (itemSpacing) : (0)); else y = (viewableArea.y * -0.5f) - item.BottomRightEdge.y + ((spacingAtEnds) ? (itemSpacing) : (0)); } // Determine the X-coordinate: switch (alignment) { case ALIGNMENT.CENTER: x = 0; break; case ALIGNMENT.LEFT_TOP: x = (viewableArea.x * -0.5f) - item.TopLeftEdge.x; break; case ALIGNMENT.RIGHT_BOTTOM: x = (viewableArea.x * 0.5f) - item.BottomRightEdge.x; break; } contentDelta = item.TopLeftEdge.y - item.BottomRightEdge.y + ((addItemSpacing) ? (itemSpacing) : (0)); } // Position the new item: item.transform.localPosition = new Vector3(x, y); item.Index = items.Count; items.Add(item); UpdateContentExtents(contentDelta); ClipItems(); } else { // Else, insert the item in the midst of our list: items.Insert(position, item); PositionItems(); } }
/// <summary> /// Inserts a list item at the specified position in the list. /// </summary> /// <param name="item">Reference to the item to be inserted into the list.</param> /// <param name="position">0-based index of the position in the list where the item will be placed.</param> /// <param name="text">Text to display in the item (requires that the item has a TextMesh associated with it, preferably in a child GameObject).</param> public void InsertItem(IUIListObject item, int position, string text) { IUIListObject lastItem; float contentDelta; // Make sure Start() has already run: if (!m_started) Start(); // See if the item needs to be enabled: if(activateWhenAdding) if (!((Component)item).gameObject.active) ((Component)item).gameObject.SetActiveRecursively(true); // Put the item in the correct layer: item.gameObject.layer = gameObject.layer; // Add the item to our container: if (container != null) container.AddChild(item.gameObject); //------------------------------------- // Position our item: //------------------------------------- item.transform.parent = mover.transform; #if AUTO_ORIENT_ITEMS item.transform.localRotation = Quaternion.identity; #endif #if AUTO_SCALE_ITEMS item.transform.localScale = Vector3.one; #endif // Go ahead and get the item in the mover's plane // on the local Z-axis. This must be done here // before anything that follows because if we are // using a perspective camera and these are newly // created items, their Start() will be called for // the first time when FindOuterEdges() is called // either by us, or by the Text property, and if // the item isn't already positioned relative to // the camera, then its size will be calculated // wrong. item.transform.localPosition = Vector3.zero; if(text != null) item.Text = text; item.SetList(this); // Compute the edges of the item: item.FindOuterEdges(); item.UpdateCollider(); // Clamp our position: position = Mathf.Clamp(position, 0, items.Count); // Hide the item by default: item.Hide(true); if (!item.Managed) item.gameObject.SetActiveRecursively(false); // See if we can just add it to the end: if(position == items.Count) { if (orientation == ORIENTATION.HORIZONTAL) { if (items.Count > 0) { lastItem = items[items.Count - 1]; item.transform.localPosition = new Vector3(lastItem.transform.localPosition.x + lastItem.BottomRightEdge.x + itemSpacing - item.TopLeftEdge.x, 0); } else { item.transform.localPosition = new Vector3((viewableArea.x * -0.5f) - item.TopLeftEdge.x + itemSpacing, 0); } contentDelta = item.BottomRightEdge.x - item.TopLeftEdge.x + itemSpacing; } else { if (items.Count > 0) { lastItem = items[items.Count - 1]; item.transform.localPosition = new Vector3(0, lastItem.transform.localPosition.y + lastItem.BottomRightEdge.y - itemSpacing - item.TopLeftEdge.y); } else { item.transform.localPosition = new Vector3(0, (viewableArea.y * 0.5f) - item.TopLeftEdge.y - itemSpacing); } contentDelta = item.TopLeftEdge.y - item.BottomRightEdge.y + itemSpacing; } item.Index = items.Count; items.Add(item); UpdateContentExtents(contentDelta); ClipItems(); } else { // Else, insert the item in the midst of our list: items.Insert(position, item); PositionItems(); } }