* refactor _Init and DoLayout to share some code

* DoLayout did not work as expected, after the call
  the scrollbars would have an 1px offset inside the target
* the target needs to be resized while setting a new border, otherwise
  it would overlap the border and give some drawing artefacts
  
- I'm still unsure if the behavior change introduced with the layout stuff is nice



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29103 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Karsten Heimrich 2009-01-31 21:27:50 +00:00
parent 2f475458bc
commit 5fd5fe56bb
2 changed files with 67 additions and 40 deletions

View File

@ -92,6 +92,8 @@ private:
BRect _InnerFrame() const;
BSize _ComputeSize(BSize targetSize) const;
BRect _ComputeFrame(BRect targetRect) const;
void _AlignScrollBars(bool horizontal, bool vertical,
BRect targetFrame);
static BRect _ComputeFrame(BRect frame, bool horizontal,
bool vertical, border_style border);

View File

@ -115,39 +115,19 @@ BScrollView::_Init(bool horizontal, bool vertical)
}
if (horizontal) {
BRect rect = targetFrame;
rect.top = rect.bottom + 1;
rect.bottom = rect.top + B_H_SCROLL_BAR_HEIGHT;
if (fBorder != B_NO_BORDER || vertical) {
// extend scrollbar so that it overlaps one pixel with vertical scrollbar
rect.right++;
}
if (fBorder != B_NO_BORDER) {
// the scrollbar draws part of the surrounding frame on the left
rect.left--;
}
fHorizontalScrollBar = new BScrollBar(rect, "_HSB_", fTarget, 0, 1000,
B_HORIZONTAL);
fHorizontalScrollBar = new BScrollBar(BRect(0, 0, 14, 14), "_HSB_",
fTarget, 0, 1000, B_HORIZONTAL);
AddChild(fHorizontalScrollBar);
}
if (vertical) {
BRect rect = targetFrame;
rect.left = rect.right + 1;
rect.right = rect.left + B_V_SCROLL_BAR_WIDTH;
if (fBorder != B_NO_BORDER || horizontal) {
// extend scrollbar so that it overlaps one pixel with vertical scrollbar
rect.bottom++;
}
if (fBorder != B_NO_BORDER) {
// the scrollbar draws part of the surrounding frame on the left
rect.top--;
}
fVerticalScrollBar = new BScrollBar(rect, "_VSB_", fTarget, 0, 1000,
B_VERTICAL);
fVerticalScrollBar = new BScrollBar(BRect(0, 0, 14, 14), "_VSB_",
fTarget, 0, 1000, B_VERTICAL);
AddChild(fVerticalScrollBar);
}
_AlignScrollBars(horizontal, vertical, targetFrame);
fPreviousWidth = uint16(Bounds().Width());
fPreviousHeight = uint16(Bounds().Height());
}
@ -283,6 +263,18 @@ BScrollView::SetBorder(border_style border)
if (fBorder == border)
return;
if (Flags() & B_SUPPORTS_LAYOUT) {
fBorder = border;
SetFlags(_ModifyFlags(Flags(), border));
DoLayout();
BRect bounds(Bounds());
Invalidate(BRect(bounds.LeftTop(), bounds.RightBottom()));
Invalidate(BRect(bounds.LeftBottom(), bounds.RightBottom()));
return;
}
float offset = _BorderSize() - _BorderSize(border);
float resize = 2 * offset;
@ -388,7 +380,7 @@ BScrollView::SetTarget(BView *target)
if (target != NULL) {
target->MoveTo(_BorderSize(), _BorderSize());
BRect innerFrame = _InnerFrame();
target->ResizeTo(innerFrame.Width(), innerFrame.Height());
target->ResizeTo(innerFrame.Width() - 1, innerFrame.Height() - 1);
target->TargetedByScrollView(this);
AddChild(target, ChildAt(0));
@ -559,6 +551,49 @@ BScrollView::_ComputeFrame(BRect targetRect) const
}
void
BScrollView::_AlignScrollBars(bool horizontal, bool vertical, BRect targetFrame)
{
if (horizontal) {
BRect rect = targetFrame;
rect.top = rect.bottom + 1;
rect.bottom = rect.top + B_H_SCROLL_BAR_HEIGHT;
if (fBorder != B_NO_BORDER || vertical) {
// extend scrollbar so that it overlaps one pixel with vertical
// scrollbar
rect.right++;
}
if (fBorder != B_NO_BORDER) {
// the scrollbar draws part of the surrounding frame on the left
rect.left--;
}
fHorizontalScrollBar->MoveTo(rect.left, rect.top);
fHorizontalScrollBar->ResizeTo(rect.Width(), rect.Height());
}
if (vertical) {
BRect rect = targetFrame;
rect.left = rect.right + 1;
rect.right = rect.left + B_V_SCROLL_BAR_WIDTH;
if (fBorder != B_NO_BORDER || horizontal) {
// extend scrollbar so that it overlaps one pixel with vertical
// scrollbar
rect.bottom++;
}
if (fBorder != B_NO_BORDER) {
// the scrollbar draws part of the surrounding frame on the left
rect.top--;
}
fVerticalScrollBar->MoveTo(rect.left, rect.top);
fVerticalScrollBar->ResizeTo(rect.Width(), rect.Height());
}
}
/*! This static method is used to calculate the frame that the
ScrollView will cover depending on the frame of its target
and which border style is used.
@ -690,8 +725,7 @@ BScrollView::DoLayout()
if (!(Flags() & B_SUPPORTS_LAYOUT))
return;
// If the user set a layout, we let the base class version call its
// hook.
// If the user set a layout, we let the base class version call its hook.
if (GetLayout()) {
BView::DoLayout();
return;
@ -706,17 +740,8 @@ BScrollView::DoLayout()
//BLayoutUtils::AlignInFrame(fTarget, fTarget->Bounds());
}
if (fHorizontalScrollBar != NULL) {
fHorizontalScrollBar->MoveTo(innerFrame.left, innerFrame.bottom);
fHorizontalScrollBar->ResizeTo(innerFrame.Width(),
fHorizontalScrollBar->Bounds().Height());
}
if (fVerticalScrollBar != NULL) {
fVerticalScrollBar->MoveTo(innerFrame.right, innerFrame.top);
fVerticalScrollBar->ResizeTo(fVerticalScrollBar->Bounds().Width(),
innerFrame.Height());
}
_AlignScrollBars(fHorizontalScrollBar != NULL, fVerticalScrollBar != NULL,
innerFrame);
}