Author: yourpalal Date: 2010-08-17 20:43:41 +0200 (Tue, 17 Aug 2010) New Revision: 38207 Changeset: http://dev.haiku-os.org/changeset/38207 Ticket: http://dev.haiku-os.org/ticket/6407 Added: haiku/trunk/headers/os/interface/AbstractLayout.h haiku/trunk/src/kits/interface/AbstractLayout.cpp Modified: haiku/trunk/headers/libs/alm/BALMLayout.h haiku/trunk/headers/os/interface/CardLayout.h haiku/trunk/headers/os/interface/GridLayoutBuilder.h haiku/trunk/headers/os/interface/GroupLayoutBuilder.h haiku/trunk/headers/os/interface/Layout.h haiku/trunk/headers/os/interface/LayoutBuilder.h haiku/trunk/headers/os/interface/LayoutItem.h haiku/trunk/headers/os/interface/TwoDimensionalLayout.h haiku/trunk/headers/os/interface/View.h haiku/trunk/headers/os/interface/Window.h haiku/trunk/headers/private/interface/ViewPrivate.h haiku/trunk/src/apps/aboutsystem/AboutSystem.cpp haiku/trunk/src/kits/interface/CardLayout.cpp haiku/trunk/src/kits/interface/GridLayoutBuilder.cpp haiku/trunk/src/kits/interface/GroupLayoutBuilder.cpp haiku/trunk/src/kits/interface/Jamfile haiku/trunk/src/kits/interface/Layout.cpp haiku/trunk/src/kits/interface/LayoutItem.cpp haiku/trunk/src/kits/interface/SplitLayout.cpp haiku/trunk/src/kits/interface/SplitLayout.h haiku/trunk/src/kits/interface/TwoDimensionalLayout.cpp haiku/trunk/src/kits/interface/View.cpp haiku/trunk/src/kits/interface/ViewLayoutItem.cpp haiku/trunk/src/kits/interface/ViewLayoutItem.h haiku/trunk/src/kits/interface/Window.cpp haiku/trunk/src/libs/alm/BALMLayout.cpp Log: Big change deriving BLayout from BLayoutItem, and allowing viewless BLayouts. a few highlights: * BLayout now derives publicly from BLayoutItem * Added BAbstractLayout class, which our layouts now derive from * updated layout builders to avoid creating views when they don't need to * updated layout classes * updated AboutSystem to fix a little regression * more details on #6407 * please tell me about any regressions, I've tried to find them all, but some may have slipped by. Modified: haiku/trunk/headers/libs/alm/BALMLayout.h =================================================================== --- haiku/trunk/headers/libs/alm/BALMLayout.h 2010-08-17 18:22:17 UTC (rev 38206) +++ haiku/trunk/headers/libs/alm/BALMLayout.h 2010-08-17 18:43:41 UTC (rev 38207) @@ -7,8 +7,8 @@ #ifndef BALM_LAYOUT_H #define BALM_LAYOUT_H +#include <AbstractLayout.h> #include <File.h> -#include <Layout.h> #include <List.h> #include <Size.h> #include <SupportDefs.h> @@ -29,7 +29,7 @@ /** * A GUI layout engine using the ALM. */ -class BALMLayout : public BLayout, public LinearSpec { +class BALMLayout : public BAbstractLayout, public LinearSpec { public: BALMLayout(); @@ -70,15 +70,15 @@ bool RemoveItem(BLayoutItem* item); BLayoutItem* RemoveItem(int32 index); - BSize MinSize(); - BSize MaxSize(); - BSize PreferredSize(); - BAlignment Alignment(); + BSize BaseMinSize(); + BSize BaseMaxSize(); + BSize BasePreferredSize(); + BAlignment BaseAlignment(); bool HasHeightForWidth(); void GetHeightForWidth(float width, float* min, float* max, float* preferred); - void InvalidateLayout(); - void LayoutView(); + void InvalidateLayout(bool children = false); + virtual void DerivedLayoutItems(); char* PerformancePath() const; void SetPerformancePath(char* path); Added: haiku/trunk/headers/os/interface/AbstractLayout.h =================================================================== --- haiku/trunk/headers/os/interface/AbstractLayout.h (rev 0) +++ haiku/trunk/headers/os/interface/AbstractLayout.h 2010-08-17 18:43:41 UTC (rev 38207) @@ -0,0 +1,54 @@ +/* + * Copyright 2010, Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef _ABSTRACT_LAYOUT_H +#define _ABSTRACT_LAYOUT_H + +#include <Alignment.h> +#include <Layout.h> +#include <Size.h> + +class BAbstractLayout : public BLayout { +public: + BAbstractLayout(); + BAbstractLayout(BMessage* from); + virtual ~BAbstractLayout(); + + virtual BSize MinSize(); + virtual BSize MaxSize(); + virtual BSize PreferredSize(); + virtual BAlignment Alignment(); + + virtual void SetExplicitMinSize(BSize size); + virtual void SetExplicitMaxSize(BSize size); + virtual void SetExplicitPreferredSize(BSize size); + virtual void SetExplicitAlignment(BAlignment alignment); + + virtual BSize BaseMinSize(); + virtual BSize BaseMaxSize(); + virtual BSize BasePreferredSize(); + virtual BAlignment BaseAlignment(); + + virtual BRect Frame(); + virtual void SetFrame(BRect frame); + + virtual bool IsVisible(); + virtual void SetVisible(bool visible); + + virtual status_t Archive(BMessage* into, bool deep = true) const; + virtual status_t AllUnarchived(const BMessage* from); + +protected: + virtual void OwnerChanged(BView* was); + virtual void AncestorVisibilityChanged(bool shown); + +private: + struct Proxy; + struct ViewProxy; + struct DataProxy; + + Proxy* fExplicitData; +}; + +#endif // _ABSTRACT_LAYOUT_ITEM_H Modified: haiku/trunk/headers/os/interface/CardLayout.h =================================================================== --- haiku/trunk/headers/os/interface/CardLayout.h 2010-08-17 18:22:17 UTC (rev 38206) +++ haiku/trunk/headers/os/interface/CardLayout.h 2010-08-17 18:43:41 UTC (rev 38207) @@ -5,10 +5,10 @@ #ifndef _CARD_LAYOUT_H #define _CARD_LAYOUT_H -#include <Layout.h> +#include <AbstractLayout.h> -class BCardLayout : public BLayout { +class BCardLayout : public BAbstractLayout { public: BCardLayout(); BCardLayout(BMessage* from); @@ -19,23 +19,23 @@ void SetVisibleItem(int32 index); void SetVisibleItem(BLayoutItem* item); - virtual BSize MinSize(); - virtual BSize MaxSize(); - virtual BSize PreferredSize(); - virtual BAlignment Alignment(); + virtual BSize BaseMinSize(); + virtual BSize BaseMaxSize(); + virtual BSize BasePreferredSize(); + virtual BAlignment BaseAlignment(); virtual bool HasHeightForWidth(); virtual void GetHeightForWidth(float width, float* min, float* max, float* preferred); - virtual void InvalidateLayout(); - virtual void LayoutView(); + virtual void InvalidateLayout(bool children = false); virtual status_t Archive(BMessage* into, bool deep = true) const; virtual status_t AllUnarchived(const BMessage* from); static BArchivable* Instantiate(BMessage* from); protected: + virtual void DerivedLayoutItems(); virtual bool ItemAdded(BLayoutItem* item, int32 atIndex); virtual void ItemRemoved(BLayoutItem* item, int32 fromIndex); Modified: haiku/trunk/headers/os/interface/GridLayoutBuilder.h =================================================================== --- haiku/trunk/headers/os/interface/GridLayoutBuilder.h 2010-08-17 18:22:17 UTC (rev 38206) +++ haiku/trunk/headers/os/interface/GridLayoutBuilder.h 2010-08-17 18:43:41 UTC (rev 38207) @@ -16,9 +16,9 @@ BGridLayoutBuilder(BGridView* view); BGridLayout* GridLayout() const; - BView* View() const; BGridLayoutBuilder& GetGridLayout(BGridLayout** _layout); - BGridLayoutBuilder& GetView(BView** _view); + BView* View() const; + BGridLayoutBuilder& GetView(BView** _view); BGridLayoutBuilder& Add(BView* view, int32 column, int32 row, int32 columnCount = 1, int32 rowCount = 1); @@ -32,7 +32,6 @@ float bottom); operator BGridLayout*(); - operator BView*(); private: BGridLayout* fLayout; Modified: haiku/trunk/headers/os/interface/GroupLayoutBuilder.h =================================================================== --- haiku/trunk/headers/os/interface/GroupLayoutBuilder.h 2010-08-17 18:22:17 UTC (rev 38206) +++ haiku/trunk/headers/os/interface/GroupLayoutBuilder.h 2010-08-17 18:43:41 UTC (rev 38207) @@ -1,5 +1,5 @@ /* - * Copyright 2006, Haiku, Inc. All rights reserved. + * Copyright 2006-2010, Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef _GROUP_LAYOUT_BUILDER_H @@ -39,7 +39,6 @@ float bottom); operator BGroupLayout*(); - operator BView*(); private: bool _PushLayout(BGroupLayout* layout); Modified: haiku/trunk/headers/os/interface/Layout.h =================================================================== --- haiku/trunk/headers/os/interface/Layout.h 2010-08-17 18:22:17 UTC (rev 38206) +++ haiku/trunk/headers/os/interface/Layout.h 2010-08-17 18:43:41 UTC (rev 38207) @@ -8,22 +8,27 @@ #include <Alignment.h> #include <Archivable.h> +#include <LayoutItem.h> #include <List.h> #include <Size.h> +class BLayoutContext; class BLayoutItem; class BView; -class BLayout : public BArchivable { +class BLayout : public BLayoutItem { public: BLayout(); BLayout(BMessage* archive); virtual ~BLayout(); - BView* View() const; + BView* Owner() const; + BView* TargetView() const; + virtual BView* View(); // from BLayoutItem + // methods dealing with items virtual BLayoutItem* AddView(BView* child); virtual BLayoutItem* AddView(int32 index, BView* child); @@ -39,19 +44,23 @@ int32 IndexOfItem(const BLayoutItem* item) const; int32 IndexOfView(BView* child) const; - virtual BSize MinSize() = 0; - virtual BSize MaxSize() = 0; - virtual BSize PreferredSize() = 0; - virtual BAlignment Alignment() = 0; + bool AncestorsVisible(); - virtual bool HasHeightForWidth() = 0; - virtual void GetHeightForWidth(float width, float* min, - float* max, float* preferred) = 0; + // Layouting related methods - virtual void InvalidateLayout(); + virtual void InvalidateLayout(bool children = false); + virtual void Relayout(bool immediate = false); + void RequireLayout(); + bool IsValid(); + void EnableLayoutInvalidation(); + void DisableLayoutInvalidation(); - virtual void LayoutView() = 0; + void LayoutItems(bool force = false); + BRect LayoutArea(); + BLayoutContext* LayoutContext(); + // Archiving methods + virtual status_t Archive(BMessage* into, bool deep = true) const; virtual status_t AllUnarchived(const BMessage* from); @@ -59,17 +68,44 @@ int32 index) const; virtual status_t ItemUnarchived(const BMessage* from, BLayoutItem* item, int32 index); + protected: + // BLayout hook methods virtual bool ItemAdded(BLayoutItem* item, int32 atIndex); virtual void ItemRemoved(BLayoutItem* item, int32 fromIndex); + virtual void DerivedLayoutItems() = 0; + virtual void OwnerChanged(BView* was); + // BLayoutItem hook methods + virtual void AttachedToLayout(); + virtual void DetachedFromLayout(BLayout* layout); + virtual void AncestorVisibilityChanged(bool shown); + + // To be called by sub-classes in SetVisible(). + void VisibilityChanged(bool show); + // To be called when layout data is known to be good + void ResetLayoutInvalidation(); + private: friend class BView; - void SetView(BView* view); + bool RemoveViewRecursive(BView* view); + bool InvalidateLayoutsForView(BView* view); + bool InvalidationLegal(); + void SetOwner(BView* owner); + void SetTarget(BView* target); - BView* fView; + void _LayoutWithinContext(bool force, + BLayoutContext* context); + + uint32 fState; + bool fAncestorsVisible; + int32 fInvalidationDisabled; + BLayoutContext* fContext; + BView* fOwner; + BView* fTarget; BList fItems; + BList fNestedLayouts; }; Modified: haiku/trunk/headers/os/interface/LayoutBuilder.h =================================================================== --- haiku/trunk/headers/os/interface/LayoutBuilder.h 2010-08-17 18:22:17 UTC (rev 38206) +++ haiku/trunk/headers/os/interface/LayoutBuilder.h 2010-08-17 18:43:41 UTC (rev 38207) @@ -33,7 +33,6 @@ public: inline void SetParent(ParentBuilder* parent); // conceptually private - inline ParentBuilder& End(); protected: @@ -71,11 +70,23 @@ inline GroupBuilder AddGroup(enum orientation orientation, float spacing = 0.0f, 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, float weight = 1.0f); + inline GridBuilder AddGrid(BGridLayout* gridLayout, + float weight = 1.0f); + inline GridBuilder AddGrid(BGridView* gridView, + float weight = 1.0f); + inline SplitBuilder AddSplit(enum orientation orientation, float spacing = 0.0f, float weight = 1.0f); + inline SplitBuilder AddSplit(BSplitView* splitView, + float weight = 1.0f); inline ThisBuilder& AddGlue(float weight = 1.0f); inline ThisBuilder& AddStrut(float size); @@ -84,7 +95,6 @@ float bottom); inline operator BGroupLayout*(); - inline operator BView*(); private: BGroupLayout* fLayout; @@ -131,13 +141,30 @@ inline GroupBuilder AddGroup(enum orientation orientation, float spacing, int32 column, int32 row, int32 columnCount = 1, int32 rowCount = 1); + inline GroupBuilder AddGroup(BGroupView* groupView, int32 column, + int32 row, int32 columnCount = 1, + int32 rowCount = 1); + inline GroupBuilder AddGroup(BGroupLayout* groupLayout, + int32 column, int32 row, + int32 columnCount = 1, int32 rowCount = 1); + inline GridBuilder AddGrid(float horizontalSpacing, float verticalSpacing, int32 column, int32 row, int32 columnCount = 1, int32 rowCount = 1); + inline GridBuilder AddGrid(BGridLayout* gridLayout, + int32 column, int32 row, + int32 columnCount = 1, int32 rowCount = 1); + inline GridBuilder AddGrid(BGridView* gridView, + int32 column, int32 row, + int32 columnCount = 1, int32 rowCount = 1); + inline SplitBuilder AddSplit(enum orientation orientation, float spacing, int32 column, int32 row, int32 columnCount = 1, int32 rowCount = 1); + inline SplitBuilder AddSplit(BSplitView* splitView, int32 column, + int32 row, int32 columnCount = 1, + int32 rowCount = 1); inline ThisBuilder& SetColumnWeight(int32 column, float weight); inline ThisBuilder& SetRowWeight(int32 row, float weight); @@ -146,7 +173,6 @@ float bottom); inline operator BGridLayout*(); - inline operator BView*(); private: BGridLayout* fLayout; @@ -168,7 +194,8 @@ inline Split(BSplitView* view); inline BSplitView* View() const; - inline ThisBuilder& GetView(BSplitView** _view); + inline ThisBuilder& GetView(BView** _view); + inline ThisBuilder& GetSplitView(BSplitView** _view); inline ThisBuilder& Add(BView* view); inline ThisBuilder& Add(BView* view, float weight); @@ -177,11 +204,23 @@ inline GroupBuilder AddGroup(enum orientation orientation, float spacing = 0.0f, 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, float weight = 1.0f); + inline GridBuilder AddGrid(BGridView* gridView, + float weight = 1.0f); + inline GridBuilder AddGrid(BGridLayout* gridLayout, + float weight = 1.0f); + inline SplitBuilder AddSplit(enum orientation orientation, float spacing = 0.0f, float weight = 1.0f); + inline SplitBuilder AddSplit(BSplitView* splitView, + float weight = 1.0f); inline ThisBuilder& SetCollapsible(bool collapsible); inline ThisBuilder& SetCollapsible(int32 index, bool collapsible); @@ -244,7 +283,7 @@ { window->SetLayout(fLayout); - fLayout->View()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + fLayout->Owner()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); // TODO: we get a white background if we don't do this } @@ -277,7 +316,7 @@ BView* Group<ParentBuilder>::View() const { - return fLayout->View(); + return fLayout->Owner(); } @@ -294,7 +333,7 @@ typename Group<ParentBuilder>::ThisBuilder& Group<ParentBuilder>::GetView(BView** _view) { - *_view = fLayout->View(); + *_view = fLayout->Owner(); return *this; } @@ -340,26 +379,70 @@ Group<ParentBuilder>::AddGroup(enum orientation orientation, float spacing, float weight) { - GroupBuilder builder(orientation, spacing); + GroupBuilder builder(new BGroupLayout(orientation, spacing)); builder.SetParent(this); - fLayout->AddView(builder.View(), weight); + fLayout->AddItem(builder.Layout(), weight); return builder; } template<typename ParentBuilder> +typename Group<ParentBuilder>::GroupBuilder +Group<ParentBuilder>::AddGroup(BGroupView* groupView, float weight) +{ + GroupBuilder builder(groupView); + builder.SetParent(this); + fLayout->AddItem(builder.Layout(), weight); + return builder; +} + + +template<typename ParentBuilder> +typename Group<ParentBuilder>::GroupBuilder +Group<ParentBuilder>::AddGroup(BGroupLayout* groupLayout, float weight) +{ + GroupBuilder builder(groupLayout); + builder.SetParent(this); + fLayout->AddItem(builder.Layout(), weight); + return builder; +} + + +template<typename ParentBuilder> typename Group<ParentBuilder>::GridBuilder -Group<ParentBuilder>::AddGrid(float horizontalSpacing, float verticalSpacing, - float weight) +Group<ParentBuilder>::AddGrid(float horizontalSpacing, + float verticalSpacing, float weight) { - GridBuilder builder(horizontalSpacing, verticalSpacing); + GridBuilder builder(new BGridLayout(horizontalSpacing, verticalSpacing)); builder.SetParent(this); - fLayout->AddView(builder.View(), weight); + fLayout->AddItem(builder.Layout(), weight); return builder; } template<typename ParentBuilder> +typename Group<ParentBuilder>::GridBuilder +Group<ParentBuilder>::AddGrid(BGridLayout* gridLayout, float weight) +{ + GridBuilder builder(gridLayout); + builder.SetParent(this); + fLayout->AddItem(builder.Layout(), weight); + return builder; +} + + +template<typename ParentBuilder> +typename Group<ParentBuilder>::GridBuilder +Group<ParentBuilder>::AddGrid(BGridView* gridView, float weight) +{ + GridBuilder builder(gridView); + builder.SetParent(this); + fLayout->AddItem(builder.Layout(), weight); + return builder; +} + + +template<typename ParentBuilder> typename Group<ParentBuilder>::SplitBuilder Group<ParentBuilder>::AddSplit(enum orientation orientation, float spacing, float weight) @@ -372,6 +455,17 @@ template<typename ParentBuilder> +typename Group<ParentBuilder>::SplitBuilder +Group<ParentBuilder>::AddSplit(BSplitView* splitView, float weight) +{ + SplitBuilder builder(splitView); + builder.SetParent(this); + fLayout->AddView(builder.View(), weight); + return builder; +} + + +template<typename ParentBuilder> typename Group<ParentBuilder>::ThisBuilder& Group<ParentBuilder>::AddGlue(float weight) { @@ -410,13 +504,6 @@ } -template<typename ParentBuilder> -Group<ParentBuilder>::operator BView*() -{ - return fLayout->View(); -} - - // #pragma mark - Grid @@ -436,7 +523,7 @@ { window->SetLayout(fLayout); - fLayout->View()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + fLayout->Owner()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); // TODO: we get a white background if we don't do this } @@ -469,7 +556,7 @@ BView* Grid<ParentBuilder>::View() const { - return fLayout->View(); + return fLayout->Owner(); } @@ -486,7 +573,7 @@ typename Grid<ParentBuilder>::ThisBuilder& Grid<ParentBuilder>::GetView(BView** _view) { - *_view = fLayout->View(); + *_view = fLayout->Owner(); return *this; } @@ -546,20 +633,56 @@ Grid<ParentBuilder>::AddGroup(enum orientation orientation, float spacing, int32 column, int32 row, int32 columnCount, int32 rowCount) { - GroupBuilder builder(orientation, spacing); + GroupBuilder builder(new BGroupLayout(orientation, spacing)); builder.SetParent(this); - fLayout->AddView(builder.View(), column, row, columnCount, rowCount); + fLayout->AddItem(builder.Layout(), column, row, columnCount, rowCount); return builder; } template<typename ParentBuilder> +typename Grid<ParentBuilder>::GroupBuilder +Grid<ParentBuilder>::AddGroup(BGroupView* groupView, int32 column, int32 row, + int32 columnCount, int32 rowCount) +{ + GroupBuilder builder(groupView); + builder.SetParent(this); + fLayout->AddItem(builder.Layout(), column, row, columnCount, rowCount); + return builder; +} + + +template<typename ParentBuilder> +typename Grid<ParentBuilder>::GroupBuilder +Grid<ParentBuilder>::AddGroup(BGroupLayout* groupLayout, int32 column, + int32 row, int32 columnCount, int32 rowCount) +{ + GroupBuilder builder(groupLayout); + builder.SetParent(this); + fLayout->AddItem(builder.Layout(), column, row, columnCount, rowCount); + return builder; +} + + +template<typename ParentBuilder> typename Grid<ParentBuilder>::GridBuilder Grid<ParentBuilder>::AddGrid(float horizontalSpacing, float verticalSpacing, int32 column, int32 row, int32 columnCount, int32 rowCount) { - GridBuilder builder(horizontalSpacing, verticalSpacing); + GridBuilder builder(new BGridLayout(horizontalSpacing, verticalSpacing)); builder.SetParent(this); + fLayout->AddItem(builder.Layout(), column, row, columnCount, rowCount); + return builder; +} + + +template<typename ParentBuilder> +typename Grid<ParentBuilder>::GridBuilder +Grid<ParentBuilder>::AddGrid(BGridView* gridView, int32 column, int32 row, + int32 columnCount, int32 rowCount) +{ + GridBuilder builder(gridView); + builder.SetParent(this); fLayout->AddView(builder.View(), column, row, columnCount, rowCount); return builder; } @@ -574,10 +697,22 @@ builder.SetParent(this); fLayout->AddView(builder.View(), column, row, columnCount, rowCount); return builder; -} +} template<typename ParentBuilder> +typename Grid<ParentBuilder>::SplitBuilder +Grid<ParentBuilder>::AddSplit(BSplitView* splitView, int32 column, int32 row, + int32 columnCount, int32 rowCount) +{ + SplitBuilder builder(splitView); + builder.SetParent(this); + fLayout->AddView(builder.View(), column, row, columnCount, rowCount); + return builder; +} + + +template<typename ParentBuilder> typename Grid<ParentBuilder>::ThisBuilder& Grid<ParentBuilder>::SetColumnWeight(int32 column, float weight) { @@ -612,13 +747,6 @@ } -template<typename ParentBuilder> -Grid<ParentBuilder>::operator BView*() -{ - return fLayout->View(); -} - - // #pragma mark - Split @@ -648,7 +776,7 @@ template<typename ParentBuilder> typename Split<ParentBuilder>::ThisBuilder& -Split<ParentBuilder>::GetView(BSplitView** _view) +Split<ParentBuilder>::GetView(BView** _view) { *_view = fView; return *this; @@ -657,6 +785,15 @@ template<typename ParentBuilder> typename Split<ParentBuilder>::ThisBuilder& +Split<ParentBuilder>::GetSplitView(BSplitView** _view) +{ + *_view = fView; + return *this; +} + + +template<typename ParentBuilder> +typename Split<ParentBuilder>::ThisBuilder& Split<ParentBuilder>::Add(BView* view) { fView->AddChild(view); @@ -696,26 +833,70 @@ Split<ParentBuilder>::AddGroup(enum orientation orientation, float spacing, float weight) { - GroupBuilder builder(orientation, spacing); + GroupBuilder builder(new BGroupLayout(orientation, spacing)); builder.SetParent(this); - fView->AddChild(builder.View(), weight); + fView->AddChild(builder.Layout(), weight); return builder; } template<typename ParentBuilder> +typename Split<ParentBuilder>::GroupBuilder +Split<ParentBuilder>::AddGroup(BGroupView* groupView, float weight) +{ + GroupBuilder builder(groupView); + builder.SetParent(this); + fView->AddChild(builder.Layout(), weight); + return builder; +} + + +template<typename ParentBuilder> +typename Split<ParentBuilder>::GroupBuilder +Split<ParentBuilder>::AddGroup(BGroupLayout* groupLayout, float weight) +{ + GroupBuilder builder(groupLayout); + builder.SetParent(this); + fView->AddChild(builder.Layout(), weight); + return builder; +} + + +template<typename ParentBuilder> typename Split<ParentBuilder>::GridBuilder Split<ParentBuilder>::AddGrid(float horizontalSpacing, float verticalSpacing, float weight) { - GridBuilder builder(horizontalSpacing, verticalSpacing); + GridBuilder builder(new BGridLayout(horizontalSpacing, verticalSpacing)); builder.SetParent(this); - fView->AddChild(builder.View(), weight); + fView->AddChild(builder.Layout(), weight); return builder; } template<typename ParentBuilder> +typename Split<ParentBuilder>::GridBuilder +Split<ParentBuilder>::AddGrid(BGridView* gridView, float weight) +{ + GridBuilder builder(gridView); + builder.SetParent(this); + fView->AddChild(builder.Layout(), weight); + return builder; +} + + +template<typename ParentBuilder> +typename Split<ParentBuilder>::GridBuilder +Split<ParentBuilder>::AddGrid(BGridLayout* layout, float weight) +{ + GridBuilder builder(layout); + builder.SetParent(this); + fView->AddChild(builder.Layout(), weight); + return builder; +} + + +template<typename ParentBuilder> typename Split<ParentBuilder>::SplitBuilder Split<ParentBuilder>::AddSplit(enum orientation orientation, float spacing, float weight) Modified: haiku/trunk/headers/os/interface/LayoutItem.h =================================================================== --- haiku/trunk/headers/os/interface/LayoutItem.h 2010-08-17 18:22:17 UTC (rev 38206) +++ haiku/trunk/headers/os/interface/LayoutItem.h 2010-08-17 18:43:41 UTC (rev 38207) @@ -16,7 +16,7 @@ class BView; -class BLayoutItem: public BArchivable { +class BLayoutItem : public BArchivable { public: BLayoutItem(); BLayoutItem(BMessage* from); @@ -46,7 +46,8 @@ virtual BView* View(); - virtual void InvalidateLayout(); + virtual void InvalidateLayout(bool children = false); + virtual void Relayout(bool immediate = false); void* LayoutData() const; void SetLayoutData(void* data); @@ -57,11 +58,19 @@ virtual status_t AllArchived(BMessage* into) const; virtual status_t AllUnarchived(const BMessage* from); +protected: + + void SetLayout(BLayout* layout); + + // hook methods + virtual void AttachedToLayout(); + virtual void DetachedFromLayout(BLayout* layout); + + virtual void AncestorVisibilityChanged(bool shown); + private: friend class BLayout; - void SetLayout(BLayout* layout); - BLayout* fLayout; void* fLayoutData; }; Modified: haiku/trunk/headers/os/interface/TwoDimensionalLayout.h =================================================================== --- haiku/trunk/headers/os/interface/TwoDimensionalLayout.h 2010-08-17 18:22:17 UTC (rev 38206) +++ haiku/trunk/headers/os/interface/TwoDimensionalLayout.h 2010-08-17 18:43:41 UTC (rev 38207) @@ -6,12 +6,12 @@ #define _TWO_DIMENSIONAL_LAYOUT_H -#include <Layout.h> +#include <AbstractLayout.h> class BLayoutContext; -class BTwoDimensionalLayout : public BLayout { +class BTwoDimensionalLayout : public BAbstractLayout { public: BTwoDimensionalLayout(); BTwoDimensionalLayout(BMessage* from); @@ -25,18 +25,18 @@ void AlignLayoutWith(BTwoDimensionalLayout* other, enum orientation orientation); - virtual BSize MinSize(); - virtual BSize MaxSize(); - virtual BSize PreferredSize(); - virtual BAlignment Alignment(); + virtual BSize BaseMinSize(); + virtual BSize BaseMaxSize(); + virtual BSize BasePreferredSize(); + virtual BAlignment BaseAlignment(); virtual bool HasHeightForWidth(); virtual void GetHeightForWidth(float width, float* min, float* max, float* preferred); - virtual void InvalidateLayout(); + virtual void SetFrame(BRect frame); - virtual void LayoutView(); + virtual void InvalidateLayout(bool children = false); virtual status_t Archive(BMessage* into, bool deep = true) const; virtual status_t AllArchived(BMessage* into) const; @@ -56,6 +56,8 @@ int32 height; }; + virtual void DerivedLayoutItems(); + BSize AddInsets(BSize size); void AddInsets(float* minHeight, float* maxHeight, float* preferredHeight); @@ -82,7 +84,6 @@ friend class LocalLayouter; void _ValidateMinMax(); - BLayoutContext* _CurrentLayoutContext(); protected: float fLeftInset; Modified: haiku/trunk/headers/os/interface/View.h =================================================================== --- haiku/trunk/headers/os/interface/View.h 2010-08-17 18:22:17 UTC (rev 38206) +++ haiku/trunk/headers/os/interface/View.h 2010-08-17 18:43:41 UTC (rev 38207) @@ -562,6 +562,8 @@ void Layout(bool force); void Relayout(); + class Private; + protected: virtual void DoLayout(); @@ -580,6 +582,8 @@ private: void _Layout(bool force, BLayoutContext* context); + void _LayoutLeft(BLayout* deleted); + void _InvalidateParentLayout(); private: // FBC padding and forbidden methods @@ -595,6 +599,7 @@ private: struct LayoutData; + friend class Private; friend class BBitmap; friend class BLayout; friend class BPrintJob; Modified: haiku/trunk/headers/os/interface/Window.h =================================================================== --- haiku/trunk/headers/os/interface/Window.h 2010-08-17 18:22:17 UTC (rev 38206) +++ haiku/trunk/headers/os/interface/Window.h 2010-08-17 18:43:41 UTC (rev 38207) @@ -103,6 +103,7 @@ void Close() { Quit(); } void AddChild(BView* child, BView* before = NULL); + void AddChild(BLayoutItem* child); bool RemoveChild(BView* child); int32 CountChildren() const; BView* ChildAt(int32 index) const; Modified: haiku/trunk/headers/private/interface/ViewPrivate.h =================================================================== --- haiku/trunk/headers/private/interface/ViewPrivate.h 2010-08-17 18:22:17 UTC (rev 38206) +++ haiku/trunk/headers/private/interface/ViewPrivate.h 2010-08-17 18:43:41 UTC (rev 38207) @@ -16,6 +16,7 @@ #include <Rect.h> #include <Region.h> #include <ServerProtocolStructs.h> +#include <View.h> const static uint32 kDeleteReplicant = 'JAHA'; @@ -48,6 +49,27 @@ }; +class BView::Private { +public: + Private(BView* view) + : + fView(view) + { + } + + int16 ShowLevel() + { + return fView->fShowLevel; + } + + // defined in View.cpp + bool WillLayout(); + bool MinMaxValid(); + + BView* fView; +}; + + namespace BPrivate { class PortLink; Modified: haiku/trunk/src/apps/aboutsystem/AboutSystem.cpp =================================================================== --- haiku/trunk/src/apps/aboutsystem/AboutSystem.cpp 2010-08-17 18:22:17 UTC (rev 38206) +++ haiku/trunk/src/apps/aboutsystem/AboutSystem.cpp 2010-08-17 18:43:41 UTC (rev 38207) @@ -579,6 +579,7 @@ const float offset = 5; SetLayout(new BGroupLayout(B_HORIZONTAL)); + SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); BLayoutBuilder::Group<>((BGroupLayout*)GetLayout()) .AddGroup(B_VERTICAL) Added: haiku/trunk/src/kits/interface/AbstractLayout.cpp [... truncated: 2281 lines follow ...]