Ticket #5525: groupLayout.patch

File groupLayout.patch, 9.6 KB (added by yourpalal, 11 years ago)

implement archiving of BGroupLayout class

  • headers/os/interface/GroupLayout.h

     
    1 /*
    2  * Copyright 2006, Haiku, Inc. All rights reserved.
    3  * Distributed under the terms of the MIT License.
    4  */
    5 #ifndef _GROUP_LAYOUT_H
    6 #define _GROUP_LAYOUT_H
    7 
    8 #include <TwoDimensionalLayout.h>
    9 
    10 class BGroupLayout : public BTwoDimensionalLayout {
    11 public:
    12                                 BGroupLayout(enum orientation orientation,
    13                                     float spacing = 0.0f);
    14     virtual                     ~BGroupLayout();
    15 
    16             float               Spacing() const;
    17             void                SetSpacing(float spacing);
    18 
    19             orientation         Orientation() const;
    20             void                SetOrientation(enum orientation orientation);
    21    
    22             float               ItemWeight(int32 index) const;
    23             void                SetItemWeight(int32 index, float weight);
    24 
    25     virtual BLayoutItem*        AddView(BView* child);
    26     virtual BLayoutItem*        AddView(int32 index, BView* child);
    27     virtual BLayoutItem*        AddView(BView* child, float weight);
    28     virtual BLayoutItem*        AddView(int32 index, BView* child,
    29                                     float weight);
    30 
    31     virtual bool                AddItem(BLayoutItem* item);
    32     virtual bool                AddItem(int32 index, BLayoutItem* item);
    33     virtual bool                AddItem(BLayoutItem* item, float weight);
    34     virtual bool                AddItem(int32 index, BLayoutItem* item,
    35                                     float weight);
    36 
    37 protected: 
    38     virtual void                ItemAdded(BLayoutItem* item);
    39     virtual void                ItemRemoved(BLayoutItem* item);
    40 
    41     virtual void                PrepareItems(enum orientation orientation);
    42    
    43     virtual int32               InternalCountColumns();
    44     virtual int32               InternalCountRows();
    45     virtual void                GetColumnRowConstraints(
    46                                     enum orientation orientation,
    47                                     int32 index,
    48                                     ColumnRowConstraints* constraints);
    49     virtual void                GetItemDimensions(BLayoutItem* item,
    50                                     Dimensions* dimensions);
    51 
    52 private:
    53             struct ItemLayoutData;
    54 
    55             ItemLayoutData*     _LayoutDataForItem(BLayoutItem* item) const;
    56 
    57             orientation         fOrientation;
    58             BList               fVisibleItems;
    59 };
    60 
    61 #endif  // _GROUP_LAYOUT_H
     1/*
     2 * Copyright 2006-2010, Haiku, Inc. All rights reserved.
     3 * Distributed under the terms of the MIT License.
     4 */
     5#ifndef _GROUP_LAYOUT_H
     6#define _GROUP_LAYOUT_H
     7
     8#include <TwoDimensionalLayout.h>
     9
     10class BGroupLayout : public BTwoDimensionalLayout {
     11public:
     12                                BGroupLayout(enum orientation orientation,
     13                                    float spacing = 0.0f);
     14                                BGroupLayout(BMessage* from);
     15    virtual                     ~BGroupLayout();
     16
     17            float               Spacing() const;
     18            void                SetSpacing(float spacing);
     19
     20            orientation         Orientation() const;
     21            void                SetOrientation(enum orientation orientation);
     22   
     23            float               ItemWeight(int32 index) const;
     24            void                SetItemWeight(int32 index, float weight);
     25
     26    virtual BLayoutItem*        AddView(BView* child);
     27    virtual BLayoutItem*        AddView(int32 index, BView* child);
     28    virtual BLayoutItem*        AddView(BView* child, float weight);
     29    virtual BLayoutItem*        AddView(int32 index, BView* child,
     30                                    float weight);
     31
     32    virtual bool                AddItem(BLayoutItem* item);
     33    virtual bool                AddItem(int32 index, BLayoutItem* item);
     34    virtual bool                AddItem(BLayoutItem* item, float weight);
     35    virtual bool                AddItem(int32 index, BLayoutItem* item,
     36                                    float weight);
     37
     38    virtual status_t            Archive(BMessage* into, bool deep = true) const;
     39    virtual status_t            AllUnarchived(const BMessage* from);
     40    static  BArchivable*        Instantiate(BMessage* from);
     41
     42    virtual status_t            ItemArchived(BMessage* into, BLayoutItem* item,
     43                                    int32 index) const;
     44    virtual status_t            ItemUnarchived(const BMessage* from,
     45                                    BLayoutItem* item, int32 index);
     46
     47protected: 
     48    virtual void                ItemAdded(BLayoutItem* item);
     49    virtual void                ItemRemoved(BLayoutItem* item);
     50
     51    virtual void                PrepareItems(enum orientation orientation);
     52   
     53    virtual int32               InternalCountColumns();
     54    virtual int32               InternalCountRows();
     55    virtual void                GetColumnRowConstraints(
     56                                    enum orientation orientation,
     57                                    int32 index,
     58                                    ColumnRowConstraints* constraints);
     59    virtual void                GetItemDimensions(BLayoutItem* item,
     60                                    Dimensions* dimensions);
     61
     62private:
     63            struct ItemLayoutData;
     64
     65            ItemLayoutData*     _LayoutDataForItem(BLayoutItem* item) const;
     66
     67            orientation         fOrientation;
     68            BList               fVisibleItems;
     69};
     70
     71#endif  // _GROUP_LAYOUT_H
  • src/kits/interface/GroupLayout.cpp

     
    11/*
     2 * Copyright 2010, Haiku, Inc.
    23 * Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
    34 * All rights reserved. Distributed under the terms of the MIT License.
    45 */
     
    67#include <GroupLayout.h>
    78
    89#include <LayoutItem.h>
     10#include <Message.h>
    911
     12#include <new>
     13using std::nothrow;
    1014
    11 // ItemLayoutData
     15
     16namespace {
     17    const char* kWeightField = "BGroupLayoutData:weight";
     18    const char* kVerticalField = "BGroupLayout:vertical";
     19}
     20
     21
    1222struct BGroupLayout::ItemLayoutData {
    1323    float   weight;
    1424
     
    1828    }
    1929};
    2030
    21 // constructor
     31
    2232BGroupLayout::BGroupLayout(enum orientation orientation, float spacing)
    23     : BTwoDimensionalLayout(),
    24       fOrientation(orientation)
     33    :
     34    BTwoDimensionalLayout(),
     35    fOrientation(orientation)
    2536{
    2637    SetSpacing(spacing);
    2738}
    2839
    29 // destructor
     40
     41BGroupLayout::BGroupLayout(BMessage* from)
     42    :
     43    BTwoDimensionalLayout(from)
     44{
     45    bool isVertical;
     46    if (from->FindBool(kVerticalField, &isVertical) != B_OK)
     47        isVertical = false;
     48    fOrientation = (isVertical) ? B_VERTICAL : B_HORIZONTAL;
     49}
     50
     51
    3052BGroupLayout::~BGroupLayout()
    3153{
    3254}
    3355
    34 // Spacing
     56
    3557float
    3658BGroupLayout::Spacing() const
    3759{
    3860    return fHSpacing;
    3961}
    4062
    41 // SetSpacing
     63
    4264void
    4365BGroupLayout::SetSpacing(float spacing)
    4466{
     
    4971    }
    5072}
    5173
    52 // Orientation
     74
    5375orientation
    5476BGroupLayout::Orientation() const
    5577{
    5678    return fOrientation;
    5779}
    5880
    59 // SetOrientation
     81
    6082void
    6183BGroupLayout::SetOrientation(enum orientation orientation)
    6284{
     
    6789    }
    6890}
    6991
    70 // ItemWeight
     92
    7193float
    7294BGroupLayout::ItemWeight(int32 index) const
    7395{
     
    78100    return (data ? data->weight : 0);
    79101}
    80102
    81 // SetItemWeight
     103
    82104void
    83105BGroupLayout::SetItemWeight(int32 index, float weight)
    84106{
     
    91113    InvalidateLayout();
    92114}
    93115
    94 // AddView 
     116
    95117BLayoutItem*
    96118BGroupLayout::AddView(BView* child)
    97119{
    98120    return BTwoDimensionalLayout::AddView(child);
    99121}
    100122
    101 // AddView 
     123
    102124BLayoutItem*
    103125BGroupLayout::AddView(int32 index, BView* child)
    104126{
    105127    return BTwoDimensionalLayout::AddView(index, child);
    106128}
    107129
    108 // AddView 
     130
    109131BLayoutItem*
    110132BGroupLayout::AddView(BView* child, float weight)
    111133{
    112134    return AddView(-1, child, weight);
    113135}
    114136
    115 // AddView
     137
    116138BLayoutItem*
    117139BGroupLayout::AddView(int32 index, BView* child, float weight)
    118140{
     
    123145    return item;
    124146}
    125147
    126 // AddItem
     148
    127149bool
    128150BGroupLayout::AddItem(BLayoutItem* item)
    129151{
    130152    return BTwoDimensionalLayout::AddItem(item);
    131153}
    132154
    133 // AddItem
     155
    134156bool
    135157BGroupLayout::AddItem(int32 index, BLayoutItem* item)
    136158{
    137159    return BTwoDimensionalLayout::AddItem(index, item);
    138160}
    139161
    140 // AddItem
     162
    141163bool
    142164BGroupLayout::AddItem(BLayoutItem* item, float weight)
    143165{
    144166    return AddItem(-1, item, weight);
    145167}
    146168
    147 // AddItem
     169
    148170bool
    149171BGroupLayout::AddItem(int32 index, BLayoutItem* item, float weight)
    150172{
     
    157179    return success;
    158180}
    159181
    160 // ItemAdded
     182
     183status_t
     184BGroupLayout::Archive(BMessage* into, bool deep) const
     185{
     186    BArchiver archiver(into);
     187    status_t err = BTwoDimensionalLayout::Archive(into, deep);
     188
     189    if (err == B_OK)
     190        err = into->AddBool(kVerticalField, fOrientation == B_VERTICAL);
     191
     192    return archiver.Finish(err);
     193}
     194
     195
     196status_t
     197BGroupLayout::AllUnarchived(const BMessage* from)
     198{
     199    return BTwoDimensionalLayout::AllUnarchived(from); 
     200}
     201
     202
     203BArchivable*
     204BGroupLayout::Instantiate(BMessage* from)
     205{
     206    if (validate_instantiation(from, "BGroupLayout"))
     207        return new(nothrow) BGroupLayout(from);
     208    return NULL;
     209}
     210
     211
     212status_t
     213BGroupLayout::ItemArchived(BMessage* into,
     214    BLayoutItem* item, int32 index) const
     215{
     216    BGroupLayout::ItemLayoutData* data =
     217        (BGroupLayout::ItemLayoutData*)item->LayoutData();
     218
     219    if (!data) // TODO: remove this once ItemAdded() returns a bool
     220        return B_BAD_VALUE;
     221
     222    return into->AddFloat(kWeightField, data->weight);
     223}
     224
     225
     226status_t
     227BGroupLayout::ItemUnarchived(const BMessage* from,
     228    BLayoutItem* item, int32 index)
     229{
     230    float weight;
     231    status_t err = from->FindFloat(kWeightField, index, &weight);
     232
     233    if (err == B_OK)
     234        _LayoutDataForItem(item)->weight = weight;
     235
     236    return err;
     237}
     238
     239
    161240void
    162241BGroupLayout::ItemAdded(BLayoutItem* item)
    163242{
    164     item->SetLayoutData(new ItemLayoutData);
     243    item->SetLayoutData(new(nothrow) ItemLayoutData);
    165244}
    166245
    167 // ItemRemoved
     246
    168247void
    169248BGroupLayout::ItemRemoved(BLayoutItem* item)
    170249{
     
    174253    }
    175254}
    176255
    177 // PrepareItems
     256
    178257void
    179258BGroupLayout::PrepareItems(enum orientation orientation)
    180259{
     
    188267    }
    189268}
    190269
    191 // InternalCountColumns
     270
    192271int32
    193272BGroupLayout::InternalCountColumns()
    194273{
    195274    return (fOrientation == B_HORIZONTAL ? fVisibleItems.CountItems() : 1);
    196275}
    197276
    198 // InternalCountRows
     277
    199278int32
    200279BGroupLayout::InternalCountRows()
    201280{
    202281    return (fOrientation == B_VERTICAL ? fVisibleItems.CountItems() : 1);
    203282}
    204283
    205 // GetColumnRowConstraints
     284
    206285void
    207286BGroupLayout::GetColumnRowConstraints(enum orientation orientation, int32 index,
    208287    ColumnRowConstraints* constraints)
     
    218297    }
    219298}
    220299
    221 // ItemDimensions
     300
    222301void
    223302BGroupLayout::GetItemDimensions(BLayoutItem* item, Dimensions* dimensions)
    224303{
     
    239318    }
    240319}
    241320
    242 // _LayoutDataForItem
     321
    243322BGroupLayout::ItemLayoutData*
    244323BGroupLayout::_LayoutDataForItem(BLayoutItem* item) const
    245324{