Patch by Alex Wilson (with minor changes by myself):

* Added support for archiving/unarchiving.
* Coding style cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37545 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2010-07-17 00:41:56 +00:00
parent a3d9e70188
commit 3fb74eb796
2 changed files with 119 additions and 30 deletions

View File

@ -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_H
@ -11,6 +11,7 @@ class BGroupLayout : public BTwoDimensionalLayout {
public:
BGroupLayout(enum orientation orientation,
float spacing = 0.0f);
BGroupLayout(BMessage* from);
virtual ~BGroupLayout();
float Spacing() const;
@ -34,6 +35,15 @@ public:
virtual bool AddItem(int32 index, BLayoutItem* item,
float weight);
virtual status_t Archive(BMessage* into, bool deep = true) const;
virtual status_t AllUnarchived(const BMessage* from);
static BArchivable* Instantiate(BMessage* from);
virtual status_t ItemArchived(BMessage* into, BLayoutItem* item,
int32 index) const;
virtual status_t ItemUnarchived(const BMessage* from,
BLayoutItem* item, int32 index);
protected:
virtual void ItemAdded(BLayoutItem* item);
virtual void ItemRemoved(BLayoutItem* item);
@ -46,7 +56,7 @@ protected:
enum orientation orientation,
int32 index,
ColumnRowConstraints* constraints);
virtual void GetItemDimensions(BLayoutItem* item,
virtual void GetItemDimensions(BLayoutItem* item,
Dimensions* dimensions);
private:

View File

@ -1,14 +1,24 @@
/*
* Copyright 2010, Haiku, Inc.
* Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
* All rights reserved. Distributed under the terms of the MIT License.
*/
#include <GroupLayout.h>
#include <LayoutItem.h>
#include <Message.h>
#include <new>
namespace {
const char* kWeightField = "BGroupLayoutData:weight";
const char* kVerticalField = "BGroupLayout:vertical";
}
// ItemLayoutData
struct BGroupLayout::ItemLayoutData {
float weight;
@ -18,27 +28,39 @@ struct BGroupLayout::ItemLayoutData {
}
};
// constructor
BGroupLayout::BGroupLayout(enum orientation orientation, float spacing)
: BTwoDimensionalLayout(),
fOrientation(orientation)
:
BTwoDimensionalLayout(),
fOrientation(orientation)
{
SetSpacing(spacing);
}
// destructor
BGroupLayout::BGroupLayout(BMessage* from)
:
BTwoDimensionalLayout(from)
{
bool isVertical;
if (from->FindBool(kVerticalField, &isVertical) != B_OK)
isVertical = false;
fOrientation = isVertical ? B_VERTICAL : B_HORIZONTAL;
}
BGroupLayout::~BGroupLayout()
{
}
// Spacing
float
BGroupLayout::Spacing() const
{
return fHSpacing;
}
// SetSpacing
void
BGroupLayout::SetSpacing(float spacing)
{
@ -49,14 +71,14 @@ BGroupLayout::SetSpacing(float spacing)
}
}
// Orientation
orientation
BGroupLayout::Orientation() const
{
return fOrientation;
}
// SetOrientation
void
BGroupLayout::SetOrientation(enum orientation orientation)
{
@ -67,7 +89,7 @@ BGroupLayout::SetOrientation(enum orientation orientation)
}
}
// ItemWeight
float
BGroupLayout::ItemWeight(int32 index) const
{
@ -78,7 +100,7 @@ BGroupLayout::ItemWeight(int32 index) const
return (data ? data->weight : 0);
}
// SetItemWeight
void
BGroupLayout::SetItemWeight(int32 index, float weight)
{
@ -91,28 +113,28 @@ BGroupLayout::SetItemWeight(int32 index, float weight)
InvalidateLayout();
}
// AddView
BLayoutItem*
BGroupLayout::AddView(BView* child)
{
return BTwoDimensionalLayout::AddView(child);
}
// AddView
BLayoutItem*
BGroupLayout::AddView(int32 index, BView* child)
{
return BTwoDimensionalLayout::AddView(index, child);
}
// AddView
BLayoutItem*
BGroupLayout::AddView(BView* child, float weight)
{
return AddView(-1, child, weight);
}
// AddView
BLayoutItem*
BGroupLayout::AddView(int32 index, BView* child, float weight)
{
@ -123,28 +145,28 @@ BGroupLayout::AddView(int32 index, BView* child, float weight)
return item;
}
// AddItem
bool
BGroupLayout::AddItem(BLayoutItem* item)
{
return BTwoDimensionalLayout::AddItem(item);
}
// AddItem
bool
BGroupLayout::AddItem(int32 index, BLayoutItem* item)
{
return BTwoDimensionalLayout::AddItem(index, item);
}
// AddItem
bool
BGroupLayout::AddItem(BLayoutItem* item, float weight)
{
return AddItem(-1, item, weight);
}
// AddItem
bool
BGroupLayout::AddItem(int32 index, BLayoutItem* item, float weight)
{
@ -157,14 +179,71 @@ BGroupLayout::AddItem(int32 index, BLayoutItem* item, float weight)
return success;
}
// ItemAdded
status_t
BGroupLayout::Archive(BMessage* into, bool deep) const
{
BArchiver archiver(into);
status_t err = BTwoDimensionalLayout::Archive(into, deep);
if (err == B_OK)
err = into->AddBool(kVerticalField, fOrientation == B_VERTICAL);
return archiver.Finish(err);
}
status_t
BGroupLayout::AllUnarchived(const BMessage* from)
{
return BTwoDimensionalLayout::AllUnarchived(from);
}
BArchivable*
BGroupLayout::Instantiate(BMessage* from)
{
if (validate_instantiation(from, "BGroupLayout"))
return new(std::nothrow) BGroupLayout(from);
return NULL;
}
status_t
BGroupLayout::ItemArchived(BMessage* into,
BLayoutItem* item, int32 index) const
{
BGroupLayout::ItemLayoutData* data =
(BGroupLayout::ItemLayoutData*)item->LayoutData();
if (!data) // TODO: remove this once ItemAdded() returns a bool
return B_BAD_VALUE;
return into->AddFloat(kWeightField, data->weight);
}
status_t
BGroupLayout::ItemUnarchived(const BMessage* from,
BLayoutItem* item, int32 index)
{
float weight;
status_t err = from->FindFloat(kWeightField, index, &weight);
if (err == B_OK)
_LayoutDataForItem(item)->weight = weight;
return err;
}
void
BGroupLayout::ItemAdded(BLayoutItem* item)
{
item->SetLayoutData(new ItemLayoutData);
item->SetLayoutData(new(std::nothrow) ItemLayoutData);
}
// ItemRemoved
void
BGroupLayout::ItemRemoved(BLayoutItem* item)
{
@ -174,7 +253,7 @@ BGroupLayout::ItemRemoved(BLayoutItem* item)
}
}
// PrepareItems
void
BGroupLayout::PrepareItems(enum orientation orientation)
{
@ -188,21 +267,21 @@ BGroupLayout::PrepareItems(enum orientation orientation)
}
}
// InternalCountColumns
int32
BGroupLayout::InternalCountColumns()
{
return (fOrientation == B_HORIZONTAL ? fVisibleItems.CountItems() : 1);
}
// InternalCountRows
int32
BGroupLayout::InternalCountRows()
{
return (fOrientation == B_VERTICAL ? fVisibleItems.CountItems() : 1);
}
// GetColumnRowConstraints
void
BGroupLayout::GetColumnRowConstraints(enum orientation orientation, int32 index,
ColumnRowConstraints* constraints)
@ -218,7 +297,7 @@ BGroupLayout::GetColumnRowConstraints(enum orientation orientation, int32 index,
}
}
// ItemDimensions
void
BGroupLayout::GetItemDimensions(BLayoutItem* item, Dimensions* dimensions)
{
@ -239,7 +318,7 @@ BGroupLayout::GetItemDimensions(BLayoutItem* item, Dimensions* dimensions)
}
}
// _LayoutDataForItem
BGroupLayout::ItemLayoutData*
BGroupLayout::_LayoutDataForItem(BLayoutItem* item) const
{