* 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
+2
View File
@@ -92,6 +92,8 @@ private:
BRect _InnerFrame() const; BRect _InnerFrame() const;
BSize _ComputeSize(BSize targetSize) const; BSize _ComputeSize(BSize targetSize) const;
BRect _ComputeFrame(BRect targetRect) const; BRect _ComputeFrame(BRect targetRect) const;
void _AlignScrollBars(bool horizontal, bool vertical,
BRect targetFrame);
static BRect _ComputeFrame(BRect frame, bool horizontal, static BRect _ComputeFrame(BRect frame, bool horizontal,
bool vertical, border_style border); bool vertical, border_style border);
+65 -40
View File
@@ -115,39 +115,19 @@ BScrollView::_Init(bool horizontal, bool vertical)
} }
if (horizontal) { if (horizontal) {
BRect rect = targetFrame; fHorizontalScrollBar = new BScrollBar(BRect(0, 0, 14, 14), "_HSB_",
rect.top = rect.bottom + 1; fTarget, 0, 1000, B_HORIZONTAL);
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);
AddChild(fHorizontalScrollBar); AddChild(fHorizontalScrollBar);
} }
if (vertical) { if (vertical) {
BRect rect = targetFrame; fVerticalScrollBar = new BScrollBar(BRect(0, 0, 14, 14), "_VSB_",
rect.left = rect.right + 1; fTarget, 0, 1000, B_VERTICAL);
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);
AddChild(fVerticalScrollBar); AddChild(fVerticalScrollBar);
} }
_AlignScrollBars(horizontal, vertical, targetFrame);
fPreviousWidth = uint16(Bounds().Width()); fPreviousWidth = uint16(Bounds().Width());
fPreviousHeight = uint16(Bounds().Height()); fPreviousHeight = uint16(Bounds().Height());
} }
@@ -283,6 +263,18 @@ BScrollView::SetBorder(border_style border)
if (fBorder == border) if (fBorder == border)
return; 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 offset = _BorderSize() - _BorderSize(border);
float resize = 2 * offset; float resize = 2 * offset;
@@ -388,7 +380,7 @@ BScrollView::SetTarget(BView *target)
if (target != NULL) { if (target != NULL) {
target->MoveTo(_BorderSize(), _BorderSize()); target->MoveTo(_BorderSize(), _BorderSize());
BRect innerFrame = _InnerFrame(); BRect innerFrame = _InnerFrame();
target->ResizeTo(innerFrame.Width(), innerFrame.Height()); target->ResizeTo(innerFrame.Width() - 1, innerFrame.Height() - 1);
target->TargetedByScrollView(this); target->TargetedByScrollView(this);
AddChild(target, ChildAt(0)); 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 /*! This static method is used to calculate the frame that the
ScrollView will cover depending on the frame of its target ScrollView will cover depending on the frame of its target
and which border style is used. and which border style is used.
@@ -690,8 +725,7 @@ BScrollView::DoLayout()
if (!(Flags() & B_SUPPORTS_LAYOUT)) if (!(Flags() & B_SUPPORTS_LAYOUT))
return; return;
// If the user set a layout, we let the base class version call its // If the user set a layout, we let the base class version call its hook.
// hook.
if (GetLayout()) { if (GetLayout()) {
BView::DoLayout(); BView::DoLayout();
return; return;
@@ -706,17 +740,8 @@ BScrollView::DoLayout()
//BLayoutUtils::AlignInFrame(fTarget, fTarget->Bounds()); //BLayoutUtils::AlignInFrame(fTarget, fTarget->Bounds());
} }
if (fHorizontalScrollBar != NULL) { _AlignScrollBars(fHorizontalScrollBar != NULL, fVerticalScrollBar != NULL,
fHorizontalScrollBar->MoveTo(innerFrame.left, innerFrame.bottom); innerFrame);
fHorizontalScrollBar->ResizeTo(innerFrame.Width(),
fHorizontalScrollBar->Bounds().Height());
}
if (fVerticalScrollBar != NULL) {
fVerticalScrollBar->MoveTo(innerFrame.right, innerFrame.top);
fVerticalScrollBar->ResizeTo(fVerticalScrollBar->Bounds().Width(),
innerFrame.Height());
}
} }