From 82ab3167232c5c8ee53e684eddc83dc7cb60f1cc Mon Sep 17 00:00:00 2001 From: Alex Wilson Date: Thu, 2 Sep 2010 22:58:24 +0000 Subject: [PATCH] Add default spacing for Layouts (#5614) * introduce B_USE_DEFAULT_SPACING, which works somewhat like B_SIZE_UNSET and B_ALIGN_HORIZONTAL_UNSET * introduce static float BControlLook::ComposeItemSpacing(float spacing), which checks uses be_control_look->DefaultItemSpacing(). * modify layouts to use BControlLook::ComposeItemSpacing() in SetInsets and SetSpacing methods. * default insets are still 0, 0, 0, 0, but can be set to default spacing by passing B_USE_DEFAULT_SPACING * I've found two regressions, patches incoming, please report others on #5614. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38512 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/interface/ControlLook.h | 1 + headers/os/interface/GridLayout.h | 5 +-- headers/os/interface/GridLayoutBuilder.h | 6 ++-- headers/os/interface/GridView.h | 8 +++-- headers/os/interface/GroupLayout.h | 2 +- headers/os/interface/GroupLayoutBuilder.h | 5 +-- headers/os/interface/GroupView.h | 4 +-- headers/os/interface/InterfaceDefs.h | 2 ++ headers/os/interface/LayoutBuilder.h | 37 ++++++++++++--------- headers/os/interface/SplitLayoutBuilder.h | 2 +- headers/os/interface/SplitView.h | 2 +- src/kits/interface/ControlLook.cpp | 12 +++++++ src/kits/interface/GridLayout.cpp | 5 +++ src/kits/interface/GridView.cpp | 9 +++++ src/kits/interface/GroupLayout.cpp | 2 ++ src/kits/interface/SplitLayout.cpp | 12 ++++--- src/kits/interface/TwoDimensionalLayout.cpp | 9 ++--- 17 files changed, 85 insertions(+), 38 deletions(-) diff --git a/headers/os/interface/ControlLook.h b/headers/os/interface/ControlLook.h index 69b9bbda13..1e880ea9b4 100644 --- a/headers/os/interface/ControlLook.h +++ b/headers/os/interface/ControlLook.h @@ -79,6 +79,7 @@ public: /* TODO: virtual*/ float DefaultItemSpacing() const; + static float ComposeItemSpacing(float spacing); uint32 Flags(BControl* control) const; diff --git a/headers/os/interface/GridLayout.h b/headers/os/interface/GridLayout.h index 96a38f9000..63bfbc8a07 100644 --- a/headers/os/interface/GridLayout.h +++ b/headers/os/interface/GridLayout.h @@ -10,8 +10,9 @@ class BGridLayout : public BTwoDimensionalLayout { public: - BGridLayout(float horizontal = 0.0f, - float vertical = 0.0f); + BGridLayout(float horizontal + = B_USE_DEFAULT_SPACING, + float vertical = B_USE_DEFAULT_SPACING); BGridLayout(BMessage* from); virtual ~BGridLayout(); diff --git a/headers/os/interface/GridLayoutBuilder.h b/headers/os/interface/GridLayoutBuilder.h index 2b6cc713db..e6b29f2e13 100644 --- a/headers/os/interface/GridLayoutBuilder.h +++ b/headers/os/interface/GridLayoutBuilder.h @@ -9,9 +9,9 @@ class BGridLayoutBuilder { public: - BGridLayoutBuilder( - float horizontalSpacing = 0.0f, - float verticalSpacing = 0.0f); + BGridLayoutBuilder(float horizontal + = B_USE_DEFAULT_SPACING, + float vertical = B_USE_DEFAULT_SPACING); BGridLayoutBuilder(BGridLayout* layout); BGridLayoutBuilder(BGridView* view); diff --git a/headers/os/interface/GridView.h b/headers/os/interface/GridView.h index d91954d2fe..220ee326be 100644 --- a/headers/os/interface/GridView.h +++ b/headers/os/interface/GridView.h @@ -11,8 +11,12 @@ class BGridView : public BView { public: - BGridView(float horizontalSpacing = 0.0f, - float verticalSpacing = 0.0f); + BGridView(float horizontal + = B_USE_DEFAULT_SPACING, + float vertical = B_USE_DEFAULT_SPACING); + BGridView(const char* name, + float horizontal = B_USE_DEFAULT_SPACING, + float vertical = B_USE_DEFAULT_SPACING); BGridView(BMessage* from); virtual ~BGridView(); diff --git a/headers/os/interface/GroupLayout.h b/headers/os/interface/GroupLayout.h index 96123b3240..82d61d70b6 100644 --- a/headers/os/interface/GroupLayout.h +++ b/headers/os/interface/GroupLayout.h @@ -10,7 +10,7 @@ class BGroupLayout : public BTwoDimensionalLayout { public: BGroupLayout(enum orientation orientation, - float spacing = 0.0f); + float spacing = B_USE_DEFAULT_SPACING); BGroupLayout(BMessage* from); virtual ~BGroupLayout(); diff --git a/headers/os/interface/GroupLayoutBuilder.h b/headers/os/interface/GroupLayoutBuilder.h index 44f024064d..843a00865a 100644 --- a/headers/os/interface/GroupLayoutBuilder.h +++ b/headers/os/interface/GroupLayoutBuilder.h @@ -13,7 +13,7 @@ class BGroupLayoutBuilder { public: BGroupLayoutBuilder( enum orientation orientation = B_HORIZONTAL, - float spacing = 0.0f); + float spacing = B_USE_DEFAULT_SPACING); BGroupLayoutBuilder(BGroupLayout* layout); BGroupLayoutBuilder(BGroupView* view); @@ -29,7 +29,8 @@ public: BGroupLayoutBuilder& Add(BLayoutItem* item, float weight); BGroupLayoutBuilder& AddGroup(enum orientation orientation, - float spacing = 0.0f, float weight = 1.0f); + float spacing = B_USE_DEFAULT_SPACING, + float weight = 1.0f); BGroupLayoutBuilder& End(); BGroupLayoutBuilder& AddGlue(float weight = 1.0f); diff --git a/headers/os/interface/GroupView.h b/headers/os/interface/GroupView.h index f4abfeb167..ad4644a72c 100644 --- a/headers/os/interface/GroupView.h +++ b/headers/os/interface/GroupView.h @@ -14,10 +14,10 @@ class BGroupView : public BView { public: BGroupView( enum orientation orientation = B_HORIZONTAL, - float spacing = 0.0f); + float spacing = B_USE_DEFAULT_SPACING); BGroupView(const char* name, enum orientation orientation = B_HORIZONTAL, - float spacing = 0.0f); + float spacing = B_USE_DEFAULT_SPACING); BGroupView(BMessage* from); virtual ~BGroupView(); diff --git a/headers/os/interface/InterfaceDefs.h b/headers/os/interface/InterfaceDefs.h index e78f9d0a21..7f5a84a8b8 100644 --- a/headers/os/interface/InterfaceDefs.h +++ b/headers/os/interface/InterfaceDefs.h @@ -223,6 +223,8 @@ enum vertical_alignment { B_ALIGN_USE_FULL_HEIGHT = -2L }; +const float B_USE_DEFAULT_SPACING = -2.0f; + // Line join and cap modes diff --git a/headers/os/interface/LayoutBuilder.h b/headers/os/interface/LayoutBuilder.h index a2d48b0fbc..3093b10c71 100644 --- a/headers/os/interface/LayoutBuilder.h +++ b/headers/os/interface/LayoutBuilder.h @@ -51,10 +51,10 @@ public: public: inline Group(enum orientation orientation = B_HORIZONTAL, - float spacing = 0.0f); + float spacing = B_USE_DEFAULT_SPACING); inline Group(BWindow* window, enum orientation orientation = B_HORIZONTAL, - float spacing = 0.0f); + float spacing = B_USE_DEFAULT_SPACING); inline Group(BGroupLayout* layout); inline Group(BGroupView* view); @@ -69,14 +69,16 @@ public: inline ThisBuilder& Add(BLayoutItem* item, float weight); inline GroupBuilder AddGroup(enum orientation orientation, - float spacing = 0.0f, float weight = 1.0f); + float spacing = B_USE_DEFAULT_SPACING, + float weight = 1.0f); inline GroupBuilder AddGroup(BGroupView* groupView, float weight = 1.0f); inline GroupBuilder AddGroup(BGroupLayout* groupLayout, float weight = 1.0f); - inline GridBuilder AddGrid(float horizontalSpacing = 0.0f, - float verticalSpacing = 0.0f, + inline GridBuilder AddGrid(float horizontal + = B_USE_DEFAULT_SPACING, + float vertical = B_USE_DEFAULT_SPACING, float weight = 1.0f); inline GridBuilder AddGrid(BGridLayout* gridLayout, float weight = 1.0f); @@ -84,7 +86,8 @@ public: float weight = 1.0f); inline SplitBuilder AddSplit(enum orientation orientation, - float spacing = 0.0f, float weight = 1.0f); + float spacing = B_USE_DEFAULT_SPACING, + float weight = 1.0f); inline SplitBuilder AddSplit(BSplitView* splitView, float weight = 1.0f); @@ -110,11 +113,12 @@ public: typedef Split SplitBuilder; public: - inline Grid(float horizontalSpacing = 0.0f, - float verticalSpacing = 0.0f); + inline Grid(float horizontal + = B_USE_DEFAULT_SPACING, + float vertical = B_USE_DEFAULT_SPACING); inline Grid(BWindow* window, - float horizontalSpacing = 0.0f, - float verticalSpacing = 0.0f); + float horizontal = B_USE_DEFAULT_SPACING, + float vertical = B_USE_DEFAULT_SPACING); inline Grid(BGridLayout* layout); inline Grid(BGridView* view); @@ -190,7 +194,7 @@ public: public: inline Split(enum orientation orientation = B_HORIZONTAL, - float spacing = 0.0f); + float spacing = B_USE_DEFAULT_SPACING); inline Split(BSplitView* view); inline BSplitView* View() const; @@ -203,14 +207,16 @@ public: inline ThisBuilder& Add(BLayoutItem* item, float weight); inline GroupBuilder AddGroup(enum orientation orientation, - float spacing = 0.0f, float weight = 1.0f); + float spacing = B_USE_DEFAULT_SPACING, + float weight = 1.0f); inline GroupBuilder AddGroup(BGroupView* groupView, float weight = 1.0f); inline GroupBuilder AddGroup(BGroupLayout* groupLayout, float weight = 1.0f); - inline GridBuilder AddGrid(float horizontalSpacing = 0.0f, - float verticalSpacing = 0.0f, + inline GridBuilder AddGrid(float horizontal + = B_USE_DEFAULT_SPACING, + float vertical = B_USE_DEFAULT_SPACING, float weight = 1.0f); inline GridBuilder AddGrid(BGridView* gridView, float weight = 1.0f); @@ -218,7 +224,8 @@ public: float weight = 1.0f); inline SplitBuilder AddSplit(enum orientation orientation, - float spacing = 0.0f, float weight = 1.0f); + float spacing = B_USE_DEFAULT_SPACING, + float weight = 1.0f); inline SplitBuilder AddSplit(BSplitView* splitView, float weight = 1.0f); diff --git a/headers/os/interface/SplitLayoutBuilder.h b/headers/os/interface/SplitLayoutBuilder.h index 7ae53ade0b..a10f1d6b08 100644 --- a/headers/os/interface/SplitLayoutBuilder.h +++ b/headers/os/interface/SplitLayoutBuilder.h @@ -11,7 +11,7 @@ class BSplitLayoutBuilder { public: BSplitLayoutBuilder( enum orientation orientation = B_HORIZONTAL, - float spacing = 0.0f); + float spacing = B_USE_DEFAULT_SPACING); BSplitLayoutBuilder(BSplitView* view); BSplitView* SplitView() const; diff --git a/headers/os/interface/SplitView.h b/headers/os/interface/SplitView.h index b72b2ba012..8d3aadf3e9 100644 --- a/headers/os/interface/SplitView.h +++ b/headers/os/interface/SplitView.h @@ -15,7 +15,7 @@ public: BSplitView( enum orientation orientation = B_HORIZONTAL, - float spacing = 0.0f); + float spacing = B_USE_DEFAULT_SPACING); BSplitView(BMessage* from); virtual ~BSplitView(); diff --git a/src/kits/interface/ControlLook.cpp b/src/kits/interface/ControlLook.cpp index e9c9fdaf07..6af0612928 100644 --- a/src/kits/interface/ControlLook.cpp +++ b/src/kits/interface/ControlLook.cpp @@ -50,6 +50,18 @@ BControlLook::DefaultItemSpacing() const } +float +BControlLook::ComposeItemSpacing(float spacing) +{ + if (spacing != B_USE_DEFAULT_SPACING) + return spacing; + + if (be_control_look) + return be_control_look->DefaultItemSpacing(); + return 0; +} + + uint32 BControlLook::Flags(BControl* control) const { diff --git a/src/kits/interface/GridLayout.cpp b/src/kits/interface/GridLayout.cpp index 9770f5a63b..2d286d67c5 100644 --- a/src/kits/interface/GridLayout.cpp +++ b/src/kits/interface/GridLayout.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -252,6 +253,7 @@ BGridLayout::VerticalSpacing() const void BGridLayout::SetHorizontalSpacing(float spacing) { + spacing = BControlLook::ComposeItemSpacing(spacing); if (spacing != fHSpacing) { fHSpacing = spacing; @@ -263,6 +265,7 @@ BGridLayout::SetHorizontalSpacing(float spacing) void BGridLayout::SetVerticalSpacing(float spacing) { + spacing = BControlLook::ComposeItemSpacing(spacing); if (spacing != fVSpacing) { fVSpacing = spacing; @@ -274,6 +277,8 @@ BGridLayout::SetVerticalSpacing(float spacing) void BGridLayout::SetSpacing(float horizontal, float vertical) { + horizontal = BControlLook::ComposeItemSpacing(horizontal); + vertical = BControlLook::ComposeItemSpacing(vertical); if (horizontal != fHSpacing || vertical != fVSpacing) { fHSpacing = horizontal; fVSpacing = vertical; diff --git a/src/kits/interface/GridView.cpp b/src/kits/interface/GridView.cpp index 92383c65b5..4e4c7ab238 100644 --- a/src/kits/interface/GridView.cpp +++ b/src/kits/interface/GridView.cpp @@ -16,6 +16,15 @@ BGridView::BGridView(float horizontalSpacing, float verticalSpacing) } +BGridView::BGridView(const char* name, float horizontalSpacing, + float verticalSpacing) + : + BView(name, 0, new BGridLayout(horizontalSpacing, verticalSpacing)) +{ + SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); +} + + BGridView::BGridView(BMessage* from) : BView(from) diff --git a/src/kits/interface/GroupLayout.cpp b/src/kits/interface/GroupLayout.cpp index a9e2d5705b..13b7fc10f1 100644 --- a/src/kits/interface/GroupLayout.cpp +++ b/src/kits/interface/GroupLayout.cpp @@ -7,6 +7,7 @@ #include +#include #include #include @@ -67,6 +68,7 @@ BGroupLayout::Spacing() const void BGroupLayout::SetSpacing(float spacing) { + spacing = BControlLook::ComposeItemSpacing(spacing); if (spacing != fHSpacing) { fHSpacing = spacing; fVSpacing = spacing; diff --git a/src/kits/interface/SplitLayout.cpp b/src/kits/interface/SplitLayout.cpp index f0ad900d3b..d35bb7c5ff 100644 --- a/src/kits/interface/SplitLayout.cpp +++ b/src/kits/interface/SplitLayout.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -161,7 +162,7 @@ BSplitLayout::BSplitLayout(enum orientation orientation, fTopInset(0), fBottomInset(0), fSplitterSize(6), - fSpacing(spacing), + fSpacing(BControlLook::ComposeItemSpacing(spacing)), fSplitterItems(), fVisibleItems(), @@ -259,10 +260,10 @@ BSplitLayout::~BSplitLayout() void BSplitLayout::SetInsets(float left, float top, float right, float bottom) { - fLeftInset = left; - fTopInset = top; - fRightInset = right; - fBottomInset = bottom; + fLeftInset = BControlLook::ComposeItemSpacing(left); + fTopInset = BControlLook::ComposeItemSpacing(top); + fRightInset = BControlLook::ComposeItemSpacing(right); + fBottomInset = BControlLook::ComposeItemSpacing(bottom); InvalidateLayout(); } @@ -293,6 +294,7 @@ BSplitLayout::Spacing() const void BSplitLayout::SetSpacing(float spacing) { + spacing = BControlLook::ComposeItemSpacing(spacing); if (spacing != fSpacing) { fSpacing = spacing; diff --git a/src/kits/interface/TwoDimensionalLayout.cpp b/src/kits/interface/TwoDimensionalLayout.cpp index d829f59238..f53edc0b59 100644 --- a/src/kits/interface/TwoDimensionalLayout.cpp +++ b/src/kits/interface/TwoDimensionalLayout.cpp @@ -8,6 +8,7 @@ #include +#include #include #include #include @@ -286,10 +287,10 @@ void BTwoDimensionalLayout::SetInsets(float left, float top, float right, float bottom) { - fLeftInset = left; - fTopInset = top; - fRightInset = right; - fBottomInset = bottom; + fLeftInset = BControlLook::ComposeItemSpacing(left); + fTopInset = BControlLook::ComposeItemSpacing(top); + fRightInset = BControlLook::ComposeItemSpacing(right); + fBottomInset = BControlLook::ComposeItemSpacing(bottom); InvalidateLayout(); }