/// <summary> /// Updates the rendering state for the specified \a item using the specified /// \a index as the data source. /// </summary> /// <param name="item"></param> /// <param name="index"></param> /// <param name="maxWidth"></param> /// <param name="totalHeight"></param> private void UpdateItem(ListViewItemRenderingState item, ModelIndex index, ref float maxWidth, ref float totalHeight) { var text = d_itemModel.GetData(index); var isSelected = IsIndexSelected(index); var initialColours = isSelected ? _selectionTextColourRect : d_textColourRect; var renderedString = GetRenderedStringParser().Parse(text, GetFont(), initialColours); item.d_string = renderedString; item.d_index = index; item.d_text = text; item.d_icon = d_itemModel.GetData(index, ItemDataRole.IDR_Icon); var iconSize = Sizef.Zero; if (!String.IsNullOrEmpty(item.d_icon)) { iconSize = ImageManager.GetSingleton().Get(item.d_icon).GetRenderedSize(); } var textSize = new Sizef(renderedString.GetHorizontalExtent(this), renderedString.GetVerticalExtent(this)); item.d_size = new Sizef(iconSize.Width + textSize.Width, Math.Max(iconSize.Height, textSize.Height)); maxWidth = Math.Max(item.d_size.Width, maxWidth); totalHeight += item.d_size.Height; item.d_isSelected = isSelected;//IsIndexSelected(index); }
protected override bool OnChildrenAdded(EventArgs args) { base.OnChildrenAdded(args); var margs = (ModelEventArgs)args; if (!d_itemModel.AreIndicesEqual(margs.d_parentIndex, d_itemModel.GetRootIndex())) { return(true); } var items = new List <ListViewItemRenderingState>(); for (var i = 0; i < margs.d_count; ++i) { var item = new ListViewItemRenderingState(this); UpdateItem(item, d_itemModel.MakeIndex(margs.d_startId + i, margs.d_parentIndex), ref d_renderedMaxWidth, ref d_renderedTotalHeight); items.Add(item); } d_items.InsertRange(margs.d_startId, items); //TODO: insert in the right place directly! ResortListView(); InvalidateView(false); return(true); }
public override void PrepareForRender() { base.PrepareForRender(); if (d_itemModel == null || !IsDirty()) { return; } if (d_needsFullRender) { d_renderedMaxWidth = d_renderedTotalHeight = 0; d_items.Clear(); } var rootIndex = d_itemModel.GetRootIndex(); var childCount = d_itemModel.GetChildCount(rootIndex); for (var child = 0; child < childCount; ++child) { var index = d_itemModel.MakeIndex(child, rootIndex); if (d_needsFullRender) { var state = new ListViewItemRenderingState(this); UpdateItem(state, index, ref d_renderedMaxWidth, ref d_renderedTotalHeight); d_items.Add(state); } else { var item = d_items[child]; d_renderedTotalHeight -= item.d_size.Height; UpdateItem(item, index, ref d_renderedMaxWidth, ref d_renderedTotalHeight); } } UpdateScrollbars(); SetIsDirty(false); ResortListView(); d_needsFullRender = false; }