[haiku-commits] r35569 - in haiku/trunk: headers/os/interface src/kits/interface

  • From: superstippi@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 21 Feb 2010 21:15:21 +0100 (CET)

Author: stippi
Date: 2010-02-21 21:15:21 +0100 (Sun, 21 Feb 2010)
New Revision: 35569
Changeset: http://dev.haiku-os.org/changeset/35569/haiku

Modified:
   haiku/trunk/headers/os/interface/TabView.h
   haiku/trunk/src/kits/interface/TabView.cpp
Log:
Added SetBorder() virtual method and feature. Could also be used by the Terminal
now to polish the tabbed look.


Modified: haiku/trunk/headers/os/interface/TabView.h
===================================================================
--- haiku/trunk/headers/os/interface/TabView.h  2010-02-21 20:14:00 UTC (rev 
35568)
+++ haiku/trunk/headers/os/interface/TabView.h  2010-02-21 20:15:21 UTC (rev 
35569)
@@ -155,6 +155,9 @@
        virtual void                            SetTabHeight(float height);
                        float                           TabHeight() const;
 
+       virtual void                            SetBorder(border_style border);
+                       border_style            Border() const;
+
                        BView*                          ContainerView() const;
 
                        int32                           CountTabs() const;
@@ -162,7 +165,6 @@
 
 private:
        // FBC padding and forbidden methods
-       virtual void                            _ReservedTabView1();
        virtual void                            _ReservedTabView2();
        virtual void                            _ReservedTabView3();
        virtual void                            _ReservedTabView4();
@@ -181,6 +183,8 @@
 private:
                        void                            _InitObject(bool 
layouted, button_width width);
                        BSize                           _TabsMinSize() const;
+                       float                           _BorderWidth() const;
+                       void                            
_LayoutContainerView(bool layouted);
 
 private:
                        BList*                          fTabList;
@@ -192,8 +196,9 @@
                        int32                           fInitialSelection;
                        int32                           fFocus;
                        float                           fTabOffset;
+                       border_style            fBorderStyle;
 
-                       uint32                          _reserved[11];
+                       uint32                          _reserved[10];
 };
 
 #endif // _TAB_VIEW_H

Modified: haiku/trunk/src/kits/interface/TabView.cpp
===================================================================
--- haiku/trunk/src/kits/interface/TabView.cpp  2010-02-21 20:14:00 UTC (rev 
35568)
+++ haiku/trunk/src/kits/interface/TabView.cpp  2010-02-21 20:15:21 UTC (rev 
35569)
@@ -270,16 +270,6 @@
        rgb_color no_tint = ui_color(B_PANEL_BACKGROUND_COLOR);
 
        if (be_control_look != NULL) {
-//             uint32 borders = BControlLook::B_RIGHT_BORDER
-//                     | BControlLook::B_TOP_BORDER | 
BControlLook::B_BOTTOM_BORDER;
-//             if (frame.left == owner->Bounds().left)
-//                     borders |= BControlLook::B_LEFT_BORDER;
-//             be_control_look->DrawButtonFrame(owner, frame, frame,
-//                     no_tint, 0, borders);
-//             if (position == B_TAB_FRONT)
-//                     no_tint = tint_color(no_tint, B_DARKEN_2_TINT);
-//             be_control_look->DrawButtonBackground(owner, frame, frame, 
no_tint);
-
                uint32 borders = BControlLook::B_TOP_BORDER
                        | BControlLook::B_BOTTOM_BORDER;
                if (frame.left == owner->Bounds().left)
@@ -402,9 +392,8 @@
 
 BTabView::~BTabView()
 {
-       for (int32 i = 0; i < CountTabs(); i++) {
+       for (int32 i = 0; i < CountTabs(); i++)
                delete TabAt(i);
-       }
 
        delete fTabList;
 }
@@ -824,14 +813,6 @@
 BRect
 BTabView::DrawTabs()
 {
-       if (be_control_look != NULL) {
-//             BRect rect(Bounds());
-//             rect.bottom = rect.top + fTabHeight;
-//             rgb_color base = ui_color(B_PANEL_BACKGROUND_COLOR);
-//             be_control_look->DrawButtonFrame(this, rect, rect, base);
-//             be_control_look->DrawButtonBackground(this, rect, rect, base);
-       }
-
        float left = 0;
 
        for (int32 i = 0; i < CountTabs(); i++) {
@@ -844,6 +825,10 @@
 
        if (be_control_look != NULL) {
                BRect frame(Bounds());
+               if (fBorderStyle == B_PLAIN_BORDER)
+                       frame.right += 1;
+               else if (fBorderStyle == B_NO_BORDER)
+                       frame.right += 2;
                if (left < frame.right) {
                        frame.left = left;
                        frame.bottom = fTabHeight;
@@ -855,6 +840,18 @@
                        be_control_look->DrawInactiveTab(this, frame, frame, 
base, 0,
                                borders);
                }
+               if (fBorderStyle == B_NO_BORDER) {
+                       // Draw a small inactive area before first tab.
+                       frame = Bounds();
+                       frame.right = 0.0f;
+                               // one pixel wide
+                       frame.bottom = fTabHeight;
+                       rgb_color base = ui_color(B_PANEL_BACKGROUND_COLOR);
+                       uint32 borders = BControlLook::B_TOP_BORDER
+                               | BControlLook::B_BOTTOM_BORDER;
+                       be_control_look->DrawInactiveTab(this, frame, frame, 
base, 0,
+                               borders);
+               }
        }
 
        if (fSelection < CountTabs())
@@ -870,18 +867,19 @@
        if (be_control_look != NULL) {
                BRect rect(Bounds());
                rect.top = selTabRect.bottom;
+               if (fBorderStyle != B_FANCY_BORDER)
+                       rect.top += 1.0f;
 
-//             BRegion clipping(Bounds());
-//             selTabRect.left += 2;
-//             selTabRect.right -= 2;
-//             clipping.Exclude(selTabRect);
-//             ConstrainClippingRegion(&clipping);
-
                rgb_color base = ui_color(B_PANEL_BACKGROUND_COLOR);
-               be_control_look->DrawGroupFrame(this, rect, rect, base);
-
-//             ConstrainClippingRegion(NULL);
-
+               if (fBorderStyle == B_FANCY_BORDER)
+                       be_control_look->DrawGroupFrame(this, rect, rect, base);
+               else {
+                       uint32 borders = BControlLook::B_TOP_BORDER;
+                       if (fBorderStyle == B_PLAIN_BORDER)
+                               borders = BControlLook::B_ALL_BORDERS;
+                       be_control_look->DrawBorder(this, rect, rect, base, 
B_PLAIN_BORDER,
+                               0, borders);
+               }
                return;
        }
 
@@ -949,25 +947,31 @@
                return BRect();
 
        if (be_control_look != NULL) {
-               float width = 100.0;
-               float height = fTabHeight;;
+               float width = 100.0f;
+               float height = fTabHeight;
+               float borderOffset = 0.0f;
+               // Do not use 2.0f for B_NO_BORDER, that will look yet different
+               // again (handled in DrawTabs()).
+               if (fBorderStyle == B_PLAIN_BORDER)
+                       borderOffset = 1.0f;
                switch (fTabWidthSetting) {
                        case B_WIDTH_FROM_LABEL:
                        {
-                               float x = 0.0;
+                               float x = 0.0f;
                                for (int32 i = 0; i < index; i++){
-                                       x += StringWidth(TabAt(i)->Label()) + 
20.0;
+                                       x += StringWidth(TabAt(i)->Label()) + 
20.0f;
                                }
 
-                               return BRect(x, 0.0,
-                                       x + StringWidth(TabAt(index)->Label()) 
+ 20.0,
+                               return BRect(x - borderOffset, 0.0f,
+                                       x + StringWidth(TabAt(index)->Label()) 
+ 20.0f
+                                               - borderOffset,
                                        height);
                        }
 
                        case B_WIDTH_FROM_WIDEST:
                                width = 0.0;
                                for (int32 i = 0; i < CountTabs(); i++) {
-                                       float tabWidth = 
StringWidth(TabAt(i)->Label()) + 20.0;
+                                       float tabWidth = 
StringWidth(TabAt(i)->Label()) + 20.0f;
                                        if (tabWidth > width)
                                                width = tabWidth;
                                }
@@ -975,7 +979,8 @@
 
                        case B_WIDTH_AS_USUAL:
                        default:
-                               return BRect(index * width, 0.0, index * width 
+ width, height);
+                               return BRect(index * width - borderOffset, 0.0f,
+                                       index * width + width - borderOffset, 
height);
                }
        }
 
@@ -1224,6 +1229,25 @@
 }
 
 
+void
+BTabView::SetBorder(border_style border)
+{
+       if (fBorderStyle == border)
+               return;
+
+       fBorderStyle = border;
+
+       _LayoutContainerView((Flags() & B_SUPPORTS_LAYOUT) != 0);
+}
+
+
+border_style
+BTabView::Border() const
+{
+       return fBorderStyle;
+}
+
+
 BView *
 BTabView::ContainerView() const
 {
@@ -1261,6 +1285,7 @@
        fSelection = 0;
        fFocus = -1;
        fTabOffset = 0.0f;
+       fBorderStyle = B_FANCY_BORDER;
 
        rgb_color color = ui_color(B_PANEL_BACKGROUND_COLOR);
 
@@ -1272,23 +1297,15 @@
        fTabHeight = fh.ascent + fh.descent + fh.leading + 8.0f;
 
        if (layouted) {
-               BGroupLayout* layout = new(std::nothrow) 
BGroupLayout(B_HORIZONTAL);
-               if (layout) {
-                       layout->SetInsets(3.0, 3.0 + TabHeight() - 1, 3.0, 3.0);
-                       SetLayout(layout);
-               }
+               SetLayout(new(std::nothrow) BGroupLayout(B_HORIZONTAL));
 
                fContainerView = new BView("view container", B_WILL_DRAW);
                fContainerView->SetLayout(new(std::nothrow) BCardLayout());
        } else {
-               BRect bounds = Bounds();
-
-               bounds.top += TabHeight();
-               bounds.InsetBy(3.0f, 3.0f);
-
-               fContainerView = new BView(bounds, "view container", 
B_FOLLOW_ALL,
+               fContainerView = new BView(Bounds(), "view container", 
B_FOLLOW_ALL,
                        B_WILL_DRAW);
        }
+       _LayoutContainerView(layouted);
 
        fContainerView->SetViewColor(color);
        fContainerView->SetLowColor(color);
@@ -1316,10 +1333,59 @@
 }
 
 
+float
+BTabView::_BorderWidth() const
+{
+       switch (fBorderStyle) {
+               default:
+               case B_FANCY_BORDER:
+                       return 3.0f;
+               case B_PLAIN_BORDER:
+                       return 1.0f;
+               case B_NO_BORDER:
+                       return 0.0f;
+       }
+}
+
+
+void
+BTabView::_LayoutContainerView(bool layouted)
+{
+       float borderWidth = _BorderWidth();
+       if (layouted) {
+               float topBorderOffset;
+               switch (fBorderStyle) {
+                       default:
+                       case B_FANCY_BORDER:
+                               topBorderOffset = 1.0f;
+                               break;
+                       case B_PLAIN_BORDER:
+                               topBorderOffset = 0.0f;
+                               break;
+                       case B_NO_BORDER:
+                               topBorderOffset = -1.0f;
+                               break;
+               }
+               BGroupLayout* layout = dynamic_cast<BGroupLayout*>(GetLayout());
+               if (layout) {
+                       layout->SetInsets(borderWidth, borderWidth + TabHeight()
+                               - topBorderOffset, borderWidth, borderWidth);
+               }
+       } else {
+               BRect bounds = Bounds();
+
+               bounds.top += TabHeight();
+               bounds.InsetBy(borderWidth, borderWidth);
+
+               fContainerView->MoveTo(bounds.left, bounds.top);
+               fContainerView->ResizeTo(bounds.Width(), bounds.Height());
+       }
+}
+
+
 // #pragma mark - FBC and forbidden
 
 
-void BTabView::_ReservedTabView1() {}
 void BTabView::_ReservedTabView2() {}
 void BTabView::_ReservedTabView3() {}
 void BTabView::_ReservedTabView4() {}
@@ -1346,3 +1412,24 @@
        // this is private and not functional, but exported
        return *this;
 }
+
+//     #pragma mark - binary compatibility
+
+#if __GNUC__ < 3
+
+extern "C" void
+_ReservedTabView1__8BTabView(BTabView* tabView, border_style border)
+{
+       tabView->BTabView::SetBorder(border);
+}
+
+#else // __GNUC__ >= 3
+
+extern "C" void
+_ZN8BTabView17_ReservedTabView1Ev(BTabView* tabView, border_style border)
+{
+       tabView->BTabView::SetBorder(border);
+}
+
+#endif // __GNUC__ >= 3
+


Other related posts:

  • » [haiku-commits] r35569 - in haiku/trunk: headers/os/interface src/kits/interface - superstippi