From fd79684a5f6650a4c479e90da5b884a7923eb152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 9 Sep 2015 19:32:11 +0200 Subject: [PATCH] BScrollView::SetBorders() added to disable borders. * You can specify which borders will be drawn using the BControlLook::B_TOP_BORDER, ... constants. * Adapted Mail to no longer need the SetInsets() hack. --- headers/os/interface/ScrollView.h | 21 ++++---- src/apps/mail/Content.cpp | 9 ++-- src/kits/interface/ScrollView.cpp | 79 ++++++++++++++++++++++--------- 3 files changed, 73 insertions(+), 36 deletions(-) diff --git a/headers/os/interface/ScrollView.h b/headers/os/interface/ScrollView.h index 34521faa7d..a3d1792a04 100644 --- a/headers/os/interface/ScrollView.h +++ b/headers/os/interface/ScrollView.h @@ -1,11 +1,6 @@ /* - * Copyright 2004-2009, Axel Dörfler, axeld@pinc-software.de. - * Copyright 2014 Haiku, Inc. All rights reserved. + * Copyright 2004-2015 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. - * - * Authors: - * Axel Dörfler, axeld@pinc-software.de - * John Scipione, jscpione@gmail.com */ #ifndef _SCROLL_VIEW_H #define _SCROLL_VIEW_H @@ -71,6 +66,8 @@ public: virtual void SetBorder(border_style border); border_style Border() const; + void SetBorders(uint32 borders); + uint32 Borders() const; virtual status_t SetBorderHighlighted(bool highlight); bool IsBorderHighlighted() const; @@ -111,12 +108,15 @@ private: bool vertical, BRect targetFrame); static BRect _ComputeFrame(BRect frame, bool horizontal, - bool vertical, border_style border); + bool vertical, border_style border, + uint32 borders); static BRect _ComputeFrame(BView* target, bool horizontal, - bool vertical, border_style border); + bool vertical, border_style border, + uint32 borders); static float _BorderSize(border_style border); static int32 _ModifyFlags(int32 flags, border_style border); - + static void _InsetBorders(BRect& frame, border_style border, + uint32 borders); private: BView* fTarget; BScrollBar* fHorizontalScrollBar; @@ -125,8 +125,9 @@ private: uint16 fPreviousWidth; uint16 fPreviousHeight; bool fHighlighted; + uint32 fBorders; - uint32 _reserved[3]; + uint32 _reserved[2]; }; #endif // _SCROLL_VIEW_H diff --git a/src/apps/mail/Content.cpp b/src/apps/mail/Content.cpp index 7d2385d897..07ae30d63a 100644 --- a/src/apps/mail/Content.cpp +++ b/src/apps/mail/Content.cpp @@ -41,6 +41,7 @@ of their respective holders. All rights reserved. #include #include #include +#include #include #include #include @@ -648,14 +649,14 @@ TContentView::TContentView(bool incoming, BFont* font, SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); BGroupLayout* layout = new BGroupLayout(B_VERTICAL, 0); - // TODO: control look should give us the spacing information - layout->SetInsets(-2, 0, -2, -2); SetLayout(layout); fTextView = new TTextView(fIncoming, this, font, showHeader, coloredQuotes); - BScrollView *scroll = new BScrollView("", fTextView, 0, true, true); - AddChild(scroll); + + BScrollView* scrollView = new BScrollView("", fTextView, 0, true, true); + scrollView->SetBorders(BControlLook::B_TOP_BORDER); + AddChild(scrollView); } diff --git a/src/kits/interface/ScrollView.cpp b/src/kits/interface/ScrollView.cpp index 5ebf366620..ff4a4bcd82 100644 --- a/src/kits/interface/ScrollView.cpp +++ b/src/kits/interface/ScrollView.cpp @@ -1,7 +1,7 @@ /* - * Copyright 2004-2009, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2004-2015, Axel Dörfler, axeld@pinc-software.de. * Copyright 2009 Stephan Aßmus, superstippi@gmx.de. - * Copyright 2014 Haiku, Inc. All rights reserved. + * Copyright 2014-2015 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -29,8 +29,9 @@ static const float kPlainBorderSize = 1; BScrollView::BScrollView(const char* name, BView* target, uint32 resizingMode, uint32 flags, bool horizontal, bool vertical, border_style border) : - BView(_ComputeFrame(target, horizontal, vertical, border), name, - resizingMode, _ModifyFlags(flags, border)), + BView(_ComputeFrame(target, horizontal, vertical, border, + BControlLook::B_ALL_BORDERS), name, resizingMode, + _ModifyFlags(flags, border)), fTarget(target), fBorder(border) { @@ -131,7 +132,7 @@ BScrollView::Archive(BMessage* archive, bool deep) const // The highlighted state is not archived, but since it is // usually (or should be) used to indicate focus, this // is probably the right thing to do. - + return status; } @@ -206,9 +207,9 @@ BScrollView::AttachedToWindow() return; } - if (fHorizontalScrollBar) + if (fHorizontalScrollBar != NULL) fHorizontalScrollBar->ResizeBy(-B_V_SCROLL_BAR_WIDTH, 0); - else if (fVerticalScrollBar) + else if (fVerticalScrollBar != NULL) fVerticalScrollBar->ResizeBy(0, -B_H_SCROLL_BAR_HEIGHT); } @@ -254,7 +255,7 @@ BScrollView::Draw(BRect updateRect) be_control_look->DrawScrollViewFrame(this, rect, updateRect, verticalScrollBarFrame, horizontalScrollBarFrame, base, fBorder, - flags); + flags, fBorders); } @@ -276,7 +277,7 @@ BScrollView::FrameResized(float newWidth, float newHeight) BRect bounds = Bounds(); float border = _BorderSize() - 1; - if (be_control_look && fHorizontalScrollBar && fVerticalScrollBar) { + if (fHorizontalScrollBar != NULL && fVerticalScrollBar != NULL) { BRect scrollCorner(bounds); scrollCorner.left = min_c( fPreviousWidth - fVerticalScrollBar->Frame().Height(), @@ -447,10 +448,7 @@ BScrollView::SetBorder(border_style border) SetFlags(_ModifyFlags(Flags(), border)); DoLayout(); - - BRect bounds(Bounds()); - Invalidate(BRect(bounds.LeftTop(), bounds.RightBottom())); - Invalidate(BRect(bounds.LeftBottom(), bounds.RightBottom())); + Invalidate(); return; } @@ -506,6 +504,25 @@ BScrollView::Border() const } +void +BScrollView::SetBorders(uint32 borders) +{ + if (fBorders == borders || (Flags() & B_SUPPORTS_LAYOUT) == 0) + return; + + fBorders = borders; + DoLayout(); + Invalidate(); +} + + +uint32 +BScrollView::Borders() const +{ + return fBorders; +} + + status_t BScrollView::SetBorderHighlighted(bool highlight) { @@ -565,7 +582,10 @@ BScrollView::SetTarget(BView* target) fVerticalScrollBar->SetTarget(target); if (target != NULL) { - target->MoveTo(_BorderSize(), _BorderSize()); + float borderSize = _BorderSize(); + target->MoveTo((fBorders & BControlLook::B_LEFT_BORDER) != 0 + ? borderSize : 0, (fBorders & BControlLook::B_TOP_BORDER) != 0 + ? borderSize : 0); BRect innerFrame = _InnerFrame(); target->ResizeTo(innerFrame.Width() - 1, innerFrame.Height() - 1); target->TargetedByScrollView(this); @@ -715,6 +735,7 @@ BScrollView::_Init(bool horizontal, bool vertical) fHorizontalScrollBar = NULL; fVerticalScrollBar = NULL; fHighlighted = false; + fBorders = BControlLook::B_ALL_BORDERS; if (be_control_look != NULL) SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); @@ -773,9 +794,9 @@ BRect BScrollView::_InnerFrame() const { BRect frame = Bounds(); + _InsetBorders(frame, fBorder, fBorders); float borderSize = _BorderSize(); - frame.InsetBy(borderSize, borderSize); if (fHorizontalScrollBar != NULL) { frame.bottom -= B_H_SCROLL_BAR_HEIGHT; @@ -806,7 +827,7 @@ BRect BScrollView::_ComputeFrame(BRect targetRect) const { return _ComputeFrame(targetRect, fHorizontalScrollBar != NULL, - fVerticalScrollBar != NULL, fBorder); + fVerticalScrollBar != NULL, fBorder, fBorders); } @@ -860,17 +881,16 @@ BScrollView::_AlignScrollBars(bool horizontal, bool vertical, BRect targetFrame) */ /*static*/ BRect BScrollView::_ComputeFrame(BRect frame, bool horizontal, bool vertical, - border_style border) + border_style border, uint32 borders) { if (vertical) frame.right += B_V_SCROLL_BAR_WIDTH; if (horizontal) frame.bottom += B_H_SCROLL_BAR_HEIGHT; - float borderSize = _BorderSize(border); - frame.InsetBy(-borderSize, -borderSize); + _InsetBorders(frame, border, borders); - if (borderSize == 0) { + if (_BorderSize(border) == 0) { if (vertical) frame.right++; if (horizontal) @@ -883,10 +903,10 @@ BScrollView::_ComputeFrame(BRect frame, bool horizontal, bool vertical, /*static*/ BRect BScrollView::_ComputeFrame(BView *target, bool horizontal, bool vertical, - border_style border) + border_style border, uint32 borders) { return _ComputeFrame(target != NULL ? target->Frame() - : BRect(0, 0, 16, 16), horizontal, vertical, border); + : BRect(0, 0, 16, 16), horizontal, vertical, border, borders); } @@ -919,6 +939,21 @@ BScrollView::_ModifyFlags(int32 flags, border_style border) } +/*static*/ void +BScrollView::_InsetBorders(BRect& frame, border_style border, uint32 borders) +{ + float borderSize = _BorderSize(border); + if ((borders & BControlLook::B_LEFT_BORDER) != 0) + frame.left += borderSize; + if ((borders & BControlLook::B_TOP_BORDER) != 0) + frame.top += borderSize; + if ((borders & BControlLook::B_RIGHT_BORDER) != 0) + frame.right -= borderSize; + if ((borders & BControlLook::B_BOTTOM_BORDER) != 0) + frame.bottom -= borderSize; +} + + // #pragma mark - FBC and forbidden