Fix scrollbar handling when removing rows in BCLV.

- If removing a row results in there no longer being any rows whatsoever
  visible, force a scroll back into the visible range. Fixes #8287.
This commit is contained in:
Rene Gollent 2012-07-18 23:00:53 -04:00
parent af2f75a016
commit ed15f1b8fb

View File

@ -4090,6 +4090,16 @@ OutlineView::RemoveRow(BRow* row)
fItemsHeight -= subTreeHeight;
FixScrollBar(false);
int32 indent = 0;
float top = 0.0;
if (FindRow(fVisibleRect.top, &indent, &top) == NULL && ScrollBar(B_VERTICAL) != NULL) {
// after removing this row, no rows are actually visible any more,
// force a scroll to make them visible again
if (fItemsHeight > fVisibleRect.Height())
ScrollBy(0.0, fItemsHeight - fVisibleRect.Height() - Bounds().top);
else
ScrollBy(0.0, -Bounds().top);
}
if (parentRow != NULL) {
parentRow->fChildList->RemoveItem(row);
if (parentRow->fChildList->CountItems() == 0) {
@ -4294,7 +4304,7 @@ OutlineView::FixScrollBar(bool scrollToFit)
float maxScrollBarValue = fItemsHeight - fVisibleRect.Height();
vScrollBar->SetProportion(fVisibleRect.Height() / fItemsHeight);
// If the user is scrolled down too far when makes the range smaller, the list
// If the user is scrolled down too far when making the range smaller, the list
// will jump suddenly, which is undesirable. In this case, don't fix the scroll
// bar here. In ScrollTo, it checks to see if this has occured, and will
// fix the scroll bars sneakily if the user has scrolled up far enough.