//////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void DrawPane(object sender, DrawEventArgs e) { if (Items != null && Items.Count > 0) { SkinText font = Skin.Layers["Control"].Text; SkinLayer sel = Skin.Layers["ListView.Selection"]; int h = (int)font.Font.Resource.MeasureString(Items[0][0].ToString()).Y; int v = (sbVert.Value / 10); int p = (sbVert.PageSize / 10); int d = (int)(((sbVert.Value % 10) / 10f) * h); int c = Items.Count; int s = itemIndex; FormatHeaders(Headers); //e.Renderer.DrawString(this, Skin.Layers["Control"], stufs, new Rectangle(e.Rectangle.Left, e.Rectangle.Top, e.Rectangle.Width, h), false); for (int i = v; i <= v + p + 1; i++) { if (i < c) { DrawStrings(e, this, Skin.Layers["Control"], Items[i], new Rectangle(e.Rectangle.Left, e.Rectangle.Top - d + ((i - v) * h), e.Rectangle.Width, h), false); } } if (s >= 0 && s < c && (Focused || !hideSelection)) { int pos = -d + ((s - v) * h); if (pos > -h && pos < (p + 1) * h) { e.Renderer.DrawLayer(this, sel, new Rectangle(0, pos, e.Rectangle.Width, h)); DrawStrings(e, this, sel, Items[s], new Rectangle(e.Rectangle.Left, e.Rectangle.Top + pos, e.Rectangle.Width, h), false); } } } }
/// <summary> /// Overridden DrawControl method /// </summary> /// <param name="renderer"></param> /// <param name="rect"></param> /// <param name="gameTime"></param> protected override void DrawControl(Renderer renderer, Rectangle rect, GameTime gameTime) { base.DrawControl(renderer, rect, gameTime); if (data.Count > 0) { if (origin == TextOrigin.BOTTOM) { String[] arr = Reverse(data); SkinText font = Skin.Layers["Control"].Text; int h = (int)font.Font.Resource.MeasureString(data.Peek()).Y; int v = ((vert.Range - vert.PageSize - vert.Value) / 10); int p = (vert.PageSize / 10); int d = (int)(((vert.Value % 10) / 10f) * h); int c = data.Count; for (int i = v; i <= v + p; i++) { if (i < c) { renderer.DrawString(this, Skin.Layers["Control"], arr[i], new Rectangle(rect.Left + 5, (rect.Height - h) - ((i - v) * h), rect.Width, h)); } } } else if (origin == TextOrigin.TOP) { rect.Y += 5; rect.Height += 15; String[] arr = Reverse(data); SkinText font = Skin.Layers["Control"].Text; int h = (int)font.Font.Resource.MeasureString(data.Peek()).Y; int v = (vert.Value / 10); int p = (vert.PageSize / 10); int d = (int)(((vert.Value % 10) / 10f) * h); int c = data.Count; for (int i = v; i <= v + p + 1; i++) { if (i < c) { renderer.DrawString(this, Skin.Layers["Control"], arr[i], new Rectangle(rect.Left + 5, rect.Top - d + ((i - v) * h), rect.Width, h)); } } } } }
/// <summary> /// Draws the list pane containing the collection items. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public override void DrawPane(object sender, DrawEventArgs e) { // Collection is non-empty? if (items != null && items.Count > 0) { SkinText font = Skin.Layers["Control"].Text; SkinLayer sel = Skin.Layers["ListBox.Selection"]; int h = (items[0] as T).Height; int v = (sbVert.Value / 10); int p = (sbVert.PageSize / 10); int d = (int)(((sbVert.Value % 10) / 10f) * h); int c = items.Count; int s = itemIndex; // Draw selection overlay? if (s >= 0 && s < c && (Focused || !hideSelection)) { int pos = -d + ((s - v) * h); // Selected index is visible? if (pos > -h && pos < (p + 1) * h) { e.Renderer.DrawLayer(this, sel, new Rectangle(e.Rectangle.Left, e.Rectangle.Top + pos, e.Rectangle.Width, h)); } } // Draw the visible collection items in the list pane. for (int i = v; i <= v + p + 1; i++) { if (i < c) { foreach (Control ctr in (items[i] as T).Controls) { ctr.DrawControl(e.Renderer, new Rectangle(e.Rectangle.Left + ctr.Left, (e.Rectangle.Top - d + ((i - v) * h)) + ctr.Top, e.Rectangle.Width, h), e.GameTime); } } } // Draw selection overlay? if (s >= 0 && s < c && (Focused || !hideSelection)) { int pos = -d + ((s - v) * h); // Selected index is visible? if (pos > -h && pos < (p + 1) * h) { e.Renderer.DrawLayer(sel, new Rectangle(e.Rectangle.Left, e.Rectangle.Top + pos, e.Rectangle.Width, h), Color.White * .2f, 0); } } } }
//////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void TrackItem(int x, int y) { y -= Headers.Height; if (Items != null && Items.Count > 0 && (pane.ControlRect.Contains(new Point(x, y + Headers.Height)))) { SkinText font = Skin.Layers["Control"].Text; int h = (int)font.Font.Resource.MeasureString(Items[0][0].ToString()).Y; int d = (int)(((sbVert.Value % 10) / 10f) * h); int i = (int)Math.Floor((sbVert.Value / 10f) + ((float)y / h)); if (i >= 0 && i < Items.Count && i >= (int)Math.Floor((float)sbVert.Value / 10f) && i < (int)Math.Ceiling((float)(sbVert.Value + sbVert.PageSize) / 10f)) { ItemIndex = i; } Focused = true; } }
//////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// private void ItemsChanged() { if (Items != null && Items.Count > 0) { SkinText font = Skin.Layers["Control"].Text; int h = (int)font.Font.Resource.MeasureString(Items[0][0].ToString()).Y; int sizev = Height - Skin.Layers["Control"].ContentMargins.Vertical; sbVert.Range = Items.Count * 10; sbVert.PageSize = (int)Math.Floor((float)sizev * 10 / h); Invalidate(); } else if (Items == null || Items.Count <= 0) { sbVert.Range = 1; sbVert.PageSize = 1; Invalidate(); } RescaleHeaders(); }
/// <summary> /// Sizes the list pane so the specified number of items will be able to be /// displayed in it without needing a scroll bar. /// </summary> /// <param name="maxItems">Number of items that can be displayed without needing a scroll bar.</param> public override void AutoHeight(int maxItems) { // Collection has less than the maximum items specified? if (items != null && items.Count < maxItems) { maxItems = items.Count; } // Adjust width of the pane to account for scroll bar visibility. if (maxItems < 3) { //maxItems = 3; sbVert.Visible = false; pane.Width = Width - Skin.Layers["Control"].ContentMargins.Horizontal - 1; } else { pane.Width = Width - sbVert.Width - Skin.Layers["Control"].ContentMargins.Horizontal - 1; sbVert.Visible = true; } // Get the list box font resource. SkinText font = Skin.Layers["Control"].Text; // Non-empty collection? Measure the height of a line of font and set the // height of the list pane based on the specified number of items that // should be able to display in it. if (items != null && items.Count > 0) { int h = (items[0] as T).Height; Height = (h * maxItems) + (Skin.Layers["Control"].ContentMargins.Vertical);// - Skin.OriginMargins.Vertical); } // Empty collection. Default height to 32. else { Height = 32; } }
//////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// public virtual void AutoHeight(int maxItems) { if (Items != null && Items.Count < maxItems) { maxItems = Items.Count; } if (maxItems < 3) { maxItems = 3; } SkinText font = Skin.Layers["Control"].Text; if (Items != null && Items.Count > 0) { int h = (int)font.Font.Resource.MeasureString(Items[0][0].ToString()).Y; Height = (h * maxItems) + (Skin.Layers["Control"].ContentMargins.Vertical);// - Skin.OriginMargins.Vertical); } else { Height = 32; } }
/// <summary> /// Event handler that will resize the scrollbars when resizes take place or strings are added /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void Recalc(object sender, ResizeEventArgs e) { if (!vert.Enabled) { vert.Enabled = true; } if (data != null && data.Count > 0) { SkinText font = Skin.Layers["Control"].Text; int h = (int)font.Font.Resource.MeasureString(data.Peek()).Y; int sizev = Height - Skin.Layers["Control"].ContentMargins.Vertical; vert.Range = data.Count * 10; vert.PageSize = (int)Math.Floor((float)sizev * 10 / h); Invalidate(); } else if (data == null || data.Count <= 0) { vert.Range = 1; vert.PageSize = 1; Invalidate(); } }