From 4854630d290208095d847eca34ad738653bf3cbc Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Sun, 27 Jan 2019 14:35:32 -0500 Subject: [PATCH] BScrollView: Resize scrollbars dynamically based on target's B_SUPPORTS_LAYOUT... ...instead of the BScrollView itself's layout flag. Thanks to Adrien and Kacper for discussion on the mailing list. --- headers/os/interface/ScrollView.h | 3 ++- src/kits/interface/ScrollView.cpp | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/headers/os/interface/ScrollView.h b/headers/os/interface/ScrollView.h index d90c758762..faeae09a76 100644 --- a/headers/os/interface/ScrollView.h +++ b/headers/os/interface/ScrollView.h @@ -113,7 +113,8 @@ private: bool vertical, border_style border, uint32 borders); static float _BorderSize(border_style border); - static int32 _ModifyFlags(int32 flags, border_style border); + static uint32 _ModifyFlags(uint32 flags, BView* target, + border_style border); static void _InsetBorders(BRect& frame, border_style border, uint32 borders, bool expand = false); private: diff --git a/src/kits/interface/ScrollView.cpp b/src/kits/interface/ScrollView.cpp index ee6a1d0507..c4bf4ea916 100644 --- a/src/kits/interface/ScrollView.cpp +++ b/src/kits/interface/ScrollView.cpp @@ -31,7 +31,7 @@ BScrollView::BScrollView(const char* name, BView* target, uint32 resizingMode, : BView(_ComputeFrame(target, horizontal, vertical, border, BControlLook::B_ALL_BORDERS), name, resizingMode, - _ModifyFlags(flags, border)), + _ModifyFlags(flags, target, border)), fTarget(target), fBorder(border) { @@ -42,7 +42,7 @@ BScrollView::BScrollView(const char* name, BView* target, uint32 resizingMode, BScrollView::BScrollView(const char* name, BView* target, uint32 flags, bool horizontal, bool vertical, border_style border) : - BView(name, _ModifyFlags(flags | B_SUPPORTS_LAYOUT, border)), + BView(name, _ModifyFlags(flags, target, border)), fTarget(target), fBorder(border) { @@ -273,8 +273,8 @@ BScrollView::FrameResized(float newWidth, float newHeight) const BRect bounds = Bounds(); - if ((Flags() & B_SUPPORTS_LAYOUT) != 0) { - BSize size = fTarget != NULL ? fTarget->PreferredSize() : BSize(); + if (fTarget != NULL && (fTarget->Flags() & B_SUPPORTS_LAYOUT) != 0) { + BSize size = fTarget->PreferredSize(); if (fHorizontalScrollBar != NULL) { float delta = size.Width() - bounds.Width(), proportion = bounds.Width() / size.Width(); @@ -472,7 +472,7 @@ BScrollView::SetBorder(border_style border) if ((Flags() & B_SUPPORTS_LAYOUT) != 0) { fBorder = border; - SetFlags(_ModifyFlags(Flags(), border)); + SetFlags(_ModifyFlags(Flags(), fTarget, border)); DoLayout(); Invalidate(); @@ -520,7 +520,7 @@ BScrollView::SetBorder(border_style border) fVerticalScrollBar->ResizeBy(0, resize + verticalGap - change); } - SetFlags(_ModifyFlags(Flags(), border)); + SetFlags(_ModifyFlags(Flags(), fTarget, border)); } @@ -621,6 +621,8 @@ BScrollView::SetTarget(BView* target) // be added top most in the list (which is important // for unarchiving) } + + SetFlags(_ModifyFlags(Flags(), fTarget, fBorder)); } @@ -952,10 +954,10 @@ BScrollView::_BorderSize(border_style border) /*! This method changes the "flags" argument as passed on to the BView constructor. */ -/*static*/ int32 -BScrollView::_ModifyFlags(int32 flags, border_style border) +/*static*/ uint32 +BScrollView::_ModifyFlags(uint32 flags, BView* target, border_style border) { - if ((flags & B_SUPPORTS_LAYOUT) != 0) + if (target != NULL && (target->Flags() & B_SUPPORTS_LAYOUT) != 0) flags |= B_FRAME_EVENTS; // We either need B_FULL_UPDATE_ON_RESIZE or B_FRAME_EVENTS if we have