private NumberLineNumber getPooledNumber() { NumberLineNumber number; if (inactiveNumbers.Count > 0) { number = inactiveNumbers[0]; inactiveNumbers.RemoveAt(0); number.Visible = true; } else { number = new NumberLineNumber(numberlineScroller.createWidgetT("TextBox", "TextBox", 0, 0, 10, 15, Align.Left | Align.Top, "") as TextBox, numberlineScroller.createWidgetT("Widget", "SeparatorSkin", 0, 16, 1, numberlineScroller.Height - 16, Align.Left | Align.Top, ""), this); } return(number); }
private void returnNumberToPool(NumberLineNumber number) { number.Visible = false; inactiveNumbers.Add(number); }
void canvasModified() { float leftSide = numberlineScroller.CanvasPosition.x - pixelsPerSecond * numberSeparationDuration; float rightSide = leftSide + numberlineScroller.Width + pixelsPerSecond * numberSeparationDuration; //Remove inactive numbers for (int i = 0; i < activeNumbers.Count; ++i) { NumberLineNumber number = activeNumbers[i]; if (number.Right < leftSide) { activeNumbers.RemoveAt(i--); returnNumberToPool(number); } if (number.Left > rightSide) { activeNumbers.RemoveAt(i--); returnNumberToPool(number); } } //If there are any active numbers if (activeNumbers.Count > 0) { NumberLineNumber number = null; //See if any numbers need to be added to the front of the list float startingPoint = activeNumbers[0].Time - numberSeparationDuration; for (float i = startingPoint; i *pixelsPerSecond > leftSide; i -= numberSeparationDuration) { number = getPooledNumber(); number.Time = i; activeNumbers.Insert(0, number); } //Add numbers to the back of the list number = null; startingPoint = activeNumbers[activeNumbers.Count - 1].Time + numberSeparationDuration; for (float i = startingPoint; i <= timelineView.Duration && i * pixelsPerSecond < rightSide; i += numberSeparationDuration) { number = getPooledNumber(); number.Time = i; activeNumbers.Add(number); } if (number != null) { IntSize2 canvasSize = numberlineScroller.CanvasSize; if (number.Right > canvasSize.Width) { canvasSize.Width = number.Right; numberlineScroller.CanvasSize = canvasSize; } } } //If there are currently no active numbers else { //Compute the starting point on the next even start point. float startingPoint = leftSide / pixelsPerSecond; int numTicks = (int)(startingPoint / numberSeparationDuration); startingPoint = numTicks * numberSeparationDuration; NumberLineNumber number = null; for (float i = startingPoint; i <= timelineView.Duration && i * pixelsPerSecond < rightSide; i += numberSeparationDuration) { number = getPooledNumber(); number.Time = i; activeNumbers.Add(number); } IntVector2 scrollPos = numberlineScroller.CanvasPosition; numberlineScroller.CanvasSize = new IntSize2(number != null ? number.Right : 0, numberlineScroller.Height); numberlineScroller.CanvasPosition = scrollPos; //Have to set the position back cause sometimes it changes. } }