private void UpdateVisibleItems()
{
// Find the first and last visible items
if (mImageListView.showGroups)
{
mFirstPartiallyVisible = -1;
mLastPartiallyVisible = -1;
mFirstVisible = -1;
mLastVisible = -1;
foreach (ImageListView.ImageListViewGroup group in mImageListView.groups)
{
// Break out if we moved outside the item area
if ((mImageListView.View == View.Gallery && group.itemBounds.Left > ItemAreaBounds.Right) ||
(mImageListView.View != View.Gallery && group.itemBounds.Top > ItemAreaBounds.Bottom))
break;
// Skip groups above (or to the left of in gallery mode) item area
if ((mImageListView.View == View.Gallery && group.itemBounds.Right < ItemAreaBounds.Left) ||
(mImageListView.View != View.Gallery && group.itemBounds.Bottom < ItemAreaBounds.Top))
continue;
if (mFirstPartiallyVisible < 0)
{
if (mImageListView.View == View.Gallery)
{
mFirstPartiallyVisible = group.FirstItemIndex + (int)System.Math.Floor((float)(ItemAreaBounds.Left - group.itemBounds.Left) / (float)mItemSizeWithMargin.Width) * group.itemRows;
mFirstVisible = group.FirstItemIndex + (int)System.Math.Ceiling((float)(ItemAreaBounds.Left - group.itemBounds.Left) / (float)mItemSizeWithMargin.Width) * group.itemRows;
}
else
{
mFirstPartiallyVisible = group.FirstItemIndex + (int)System.Math.Floor((float)(ItemAreaBounds.Top - group.itemBounds.Top) / (float)mItemSizeWithMargin.Height) * group.itemCols;
mFirstVisible = group.FirstItemIndex + (int)System.Math.Ceiling((float)(ItemAreaBounds.Top - group.itemBounds.Top) / (float)mItemSizeWithMargin.Height) * group.itemCols;
}
}
if (mImageListView.View == View.Gallery)
{
mLastPartiallyVisible = group.FirstItemIndex + (int)System.Math.Ceiling((float)((ItemAreaBounds.Left - group.itemBounds.Left) + mItemAreaBounds.Width) / (float)mItemSizeWithMargin.Width) * group.itemRows - 1;
mLastVisible = group.FirstItemIndex + (int)System.Math.Floor((float)((ItemAreaBounds.Left - group.itemBounds.Left) + mItemAreaBounds.Width) / (float)mItemSizeWithMargin.Width) * group.itemRows - 1;
}
else
{
mLastPartiallyVisible = group.FirstItemIndex + (int)System.Math.Ceiling((float)((ItemAreaBounds.Top - group.itemBounds.Top) + mItemAreaBounds.Height) / (float)mItemSizeWithMargin.Height) * group.itemCols - 1;
mLastVisible = group.FirstItemIndex + (int)System.Math.Floor((float)((ItemAreaBounds.Top - group.itemBounds.Top) + mItemAreaBounds.Height) / (float)mItemSizeWithMargin.Height) * group.itemCols - 1;
}
}
}
else
{
if (mImageListView.View == View.Gallery)
{
mFirstPartiallyVisible = (int)System.Math.Floor((float)mImageListView.ViewOffset.X / (float)mItemSizeWithMargin.Width) * mDisplayedRows;
mLastPartiallyVisible = (int)System.Math.Ceiling((float)(mImageListView.ViewOffset.X + mItemAreaBounds.Width) / (float)mItemSizeWithMargin.Width) * mDisplayedRows - 1;
mFirstVisible = (int)System.Math.Ceiling((float)mImageListView.ViewOffset.X / (float)mItemSizeWithMargin.Width) * mDisplayedRows;
mLastVisible = (int)System.Math.Floor((float)(mImageListView.ViewOffset.X + mItemAreaBounds.Width) / (float)mItemSizeWithMargin.Width) * mDisplayedRows - 1;
}
else
{
mFirstPartiallyVisible = (int)System.Math.Floor((float)mImageListView.ViewOffset.Y / (float)mItemSizeWithMargin.Height) * mDisplayedCols;
mLastPartiallyVisible = (int)System.Math.Ceiling((float)(mImageListView.ViewOffset.Y + mItemAreaBounds.Height) / (float)mItemSizeWithMargin.Height) * mDisplayedCols - 1;
mFirstVisible = (int)System.Math.Ceiling((float)mImageListView.ViewOffset.Y / (float)mItemSizeWithMargin.Height) * mDisplayedCols;
mLastVisible = (int)System.Math.Floor((float)(mImageListView.ViewOffset.Y + mItemAreaBounds.Height) / (float)mItemSizeWithMargin.Height) * mDisplayedCols - 1;
}
}
// Bounds check
if (mFirstPartiallyVisible < 0) mFirstPartiallyVisible = 0;
if (mFirstPartiallyVisible > mImageListView.Items.Count - 1) mFirstPartiallyVisible = mImageListView.Items.Count - 1;
if (mLastPartiallyVisible < 0) mLastPartiallyVisible = 0;
if (mLastPartiallyVisible > mImageListView.Items.Count - 1) mLastPartiallyVisible = mImageListView.Items.Count - 1;
if (mFirstVisible < 0) mFirstVisible = 0;
if (mFirstVisible > mImageListView.Items.Count - 1) mFirstVisible = mImageListView.Items.Count - 1;
if (mLastVisible < 0) mLastVisible = 0;
if (mLastVisible > mImageListView.Items.Count - 1) mLastVisible = mImageListView.Items.Count - 1;
// Cache visible items
cachedVisibleItems.Clear();
if (mFirstPartiallyVisible >= 0 &&
mLastPartiallyVisible >= 0 &&
mFirstPartiallyVisible <= mImageListView.Items.Count - 1 &&
mLastPartiallyVisible <= mImageListView.Items.Count - 1)
{
for (int i = mFirstPartiallyVisible; i <= mLastPartiallyVisible; i++)
cachedVisibleItems.Add(mImageListView.Items[i].Guid, false);
}
// Current item state processed
mImageListView.Items.collectionModified = false;
}