Ticket #11311: sizer.diff

File sizer.diff, 6.9 KB (added by juliansmart, 8 years ago)

Patch to add 2.8 box sizer compatibility

  • include/wx/sizer.h

     
    901901// wxBoxSizer
    902902//---------------------------------------------------------------------------
    903903
     904// Determines whether minimal/best sizes are taken into account for proportion
     905// calculations, or not
     906enum wxBoxSizerProportionMode
     907{
     908    // take minimal sizes into account
     909    wxBOX_PROPORTION_USE_MINIMAL,
     910
     911    // spread proportions out regardless of minimal size
     912    wxBOX_PROPORTION_EVEN,
     913
     914    // use the current global default
     915    wxBOX_PROPORTION_DEFAULT
     916};
     917
    904918class WXDLLIMPEXP_CORE wxBoxSizer: public wxSizer
    905919{
    906920public:
    907     wxBoxSizer(int orient)
     921    wxBoxSizer(int orient, wxBoxSizerProportionMode proportionMode = wxBOX_PROPORTION_DEFAULT)
    908922    {
    909923        m_orient = orient;
    910924        m_totalProportion = 0;
     925        if (proportionMode == wxBOX_PROPORTION_DEFAULT)
     926            m_proportionMode = sm_defaultProportionMode;
     927        else
     928            m_proportionMode = proportionMode;
    911929
    912930        wxASSERT_MSG( m_orient == wxHORIZONTAL || m_orient == wxVERTICAL,
    913931                      wxT("invalid value for wxBoxSizer orientation") );
     
    921939
    922940    void SetOrientation(int orient) { m_orient = orient; }
    923941
     942    // proportion mode
     943    wxBoxSizerProportionMode GetProportionMode() const { return m_proportionMode; }
     944    void SetProportionMode(wxBoxSizerProportionMode mode) { m_proportionMode = mode; }
     945
     946    // default proportion mode
     947    static wxBoxSizerProportionMode GetDefaultPropotionMode() { return sm_defaultProportionMode; }
     948    static void SetDefaultProportionMode(wxBoxSizerProportionMode mode) { sm_defaultProportionMode = mode; }
     949
    924950    // implementation of our resizing logic
    925951    virtual wxSize CalcMin();
    926952    virtual void RecalcSizes();
     
    9781004    // the sum of proportion of all of our elements
    9791005    int m_totalProportion;
    9801006
     1007    // proportion mode
     1008    wxBoxSizerProportionMode m_proportionMode;
     1009
     1010    // default proportion mode
     1011    static wxBoxSizerProportionMode sm_defaultProportionMode;
     1012
    9811013    // the minimal size needed for this sizer as calculated by the last call to
    9821014    // our CalcMin()
    9831015    wxSize m_minSize;
  • src/common/sizer.cpp

     
    19821982// wxBoxSizer
    19831983//---------------------------------------------------------------------------
    19841984
     1985// default proportion mode
     1986wxBoxSizerProportionMode wxBoxSizer::sm_defaultProportionMode = wxBOX_PROPORTION_USE_MINIMAL;
     1987
    19851988wxSizerItem *wxBoxSizer::AddSpacer(int size)
    19861989{
    19871990    return IsVertical() ? Add(0, size) : Add(size, 0);
     
    19921995    if ( m_children.empty() )
    19931996        return;
    19941997
     1998    if (GetProportionMode() == wxBOX_PROPORTION_USE_MINIMAL)
     1999    {
    19952000    const wxCoord totalMinorSize = GetSizeInMinorDir(m_size);
    19962001
    19972002    // the amount of free space which we should redistribute among the
     
    21042109
    21052110        PosInMajorDir(pt) += majorSize;
    21062111    }
     2112    }
     2113    else
     2114    {
     2115        int fixed_height = 0;
     2116        int fixed_width = 0;
     2117        int stretchable = 0;
     2118        wxSizerItemList::compatibility_iterator node;
     2119
     2120        // find fixed width and height, as well
     2121        // as the total stretchable proportions
     2122        node = m_children.GetFirst();
     2123        while (node)
     2124        {
     2125            wxSizerItem *item = node->GetData();
     2126
     2127            if (item->IsShown())
     2128            {
     2129                stretchable += item->GetProportion();
     2130
     2131                wxSize size(item->GetMinSizeWithBorder());
     2132                if (item->GetProportion() == 0)
     2133                {
     2134                    if (m_orient == wxVERTICAL)
     2135                    {
     2136                        fixed_height += size.y;
     2137                        fixed_width = wxMax(fixed_width, size.x);
     2138                    }
     2139                    else
     2140                    {
     2141                        fixed_width += size.x;
     2142                        fixed_height = wxMax(fixed_height, size.y);
     2143                    }
     2144                }
     2145            }
     2146
     2147            node = node->GetNext();
     2148        }
     2149
     2150
     2151        // delta specifies the total amount to be allocated to stretch spaces
     2152        int delta = 0;
     2153        if (stretchable)
     2154        {
     2155            if (m_orient == wxHORIZONTAL)
     2156                delta = m_size.x - fixed_width;
     2157            else
     2158                delta = m_size.y - fixed_height;
     2159        }
     2160
     2161        // go through each item and assign sizes
     2162        wxPoint pt(m_position);
     2163        node = m_children.GetFirst();
     2164        while (node)
     2165        {
     2166            wxSizerItem* item = node->GetData();
     2167
     2168            if (item->IsShown())
     2169            {
     2170                wxSize size(item->GetMinSizeWithBorder());
     2171
     2172                if (m_orient == wxVERTICAL)
     2173                {
     2174                    wxCoord height = size.y;
     2175                    if (item->GetProportion())
     2176                    {
     2177                        height = (delta * item->GetProportion()) / stretchable;
     2178                        delta -= height;
     2179                        stretchable -= item->GetProportion();
     2180                    }
     2181
     2182                    wxPoint child_pos(pt);
     2183                    wxSize child_size(size.x, height);
     2184
     2185                    if (item->GetFlag() & (wxEXPAND | wxSHAPED))
     2186                        child_size.x = m_size.x;
     2187                    else if (item->GetFlag() & wxALIGN_RIGHT)
     2188                        child_pos.x += m_size.x - size.x;
     2189                    else if (item->GetFlag() & (wxCENTER | wxALIGN_CENTER_HORIZONTAL))
     2190                        child_pos.x += (m_size.x - size.x) / 2;
     2191
     2192                    item->SetDimension(child_pos, child_size);
     2193
     2194                    pt.y += height;
     2195                }
     2196                else
     2197                {
     2198                    wxCoord width = size.x;
     2199                    if (item->GetProportion())
     2200                    {
     2201                        width = (delta * item->GetProportion()) / stretchable;
     2202                        delta -= width;
     2203                        stretchable -= item->GetProportion();
     2204                    }
     2205
     2206                    wxPoint child_pos(pt);
     2207                    wxSize child_size(width, size.y);
     2208
     2209                    if (item->GetFlag() & (wxEXPAND | wxSHAPED))
     2210                        child_size.y = m_size.y;
     2211                    else if (item->GetFlag() & wxALIGN_BOTTOM)
     2212                        child_pos.y += m_size.y - size.y;
     2213                    else if (item->GetFlag() & (wxCENTER | wxALIGN_CENTER_VERTICAL))
     2214                        child_pos.y += (m_size.y - size.y) / 2;
     2215
     2216                    item->SetDimension(child_pos, child_size);
     2217
     2218                    pt.x += width;
     2219                }
     2220            }
     2221
     2222            node = node->GetNext();
     2223        }
     2224    }
    21072225}
    21082226
    21092227wxSize wxBoxSizer::CalcMin()