* 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:
@@ -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);
|
||||||
|
|||||||
@@ -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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user