X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/aa21b5090ad75a806fe20b6371933302f67d821e..4178000933f0618d2cc9dc2f80dfed91b0c61464:/src/common/sizer.cpp?ds=sidebyside diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index a412637448..c49530577e 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -133,21 +133,28 @@ wxSize wxSizerItem::CalcMin() if (IsSizer()) { ret = m_sizer->GetMinSize(); + // if we have to preserve aspect ratio _AND_ this is // the first-time calculation, consider ret to be initial size - if ((m_flag & wxSHAPED) && !m_ratio) SetRatio(ret); + if ((m_flag & wxSHAPED) && !m_ratio) + SetRatio(ret); } - -/* - The minimum size of a window should be the - initial size, as saved in m_minSize, not the - current size. - else - if (IsWindow()) - ret = m_window->GetSize(); -*/ - else ret = m_minSize; + { + if ( IsWindow() && (m_flag & wxADJUST_MINSIZE) ) + { + // check if the best (minimal, in fact) window size hadn't changed + // by chance: this may happen for, e.g. static text if its label + // changed + wxSize size = m_window->GetBestSize(); + if ( size.x > m_minSize.x ) + m_minSize.x = size.x; + if ( size.y > m_minSize.y ) + m_minSize.y = size.y; + } + + ret = m_minSize; + } if (m_flag & wxWEST) ret.x += m_border; @@ -163,30 +170,12 @@ wxSize wxSizerItem::CalcMin() void wxSizerItem::SetDimension( wxPoint pos, wxSize size ) { - m_pos = pos; - - if (m_flag & wxWEST) + if (m_flag & wxSHAPED) { - pos.x += m_border; - size.x -= m_border; - } - if (m_flag & wxEAST) - { - size.x -= m_border; - } - if (m_flag & wxNORTH) - { - pos.y += m_border; - size.y -= m_border; - } - if (m_flag & wxSOUTH) - { - size.y -= m_border; - } - if (m_flag & wxSHAPED) { // adjust aspect ratio int rwidth = (int) (size.y * m_ratio); - if (rwidth > size.x) { + if (rwidth > size.x) + { // fit horizontally int rheight = (int) (size.x / m_ratio); // add vertical space @@ -196,7 +185,9 @@ void wxSizerItem::SetDimension( wxPoint pos, wxSize size ) pos.y += (size.y - rheight); // use reduced dimensions size.y =rheight; - } else if (rwidth < size.x) { + } + else if (rwidth < size.x) + { // add horizontal space if (m_flag & wxALIGN_CENTER_HORIZONTAL) pos.x += (size.x - rwidth) / 2; @@ -205,6 +196,30 @@ void wxSizerItem::SetDimension( wxPoint pos, wxSize size ) size.x = rwidth; } } + + // This is what GetPosition() returns. Since we calculate + // borders afterwards, GetPosition() will be the left/top + // corner of the surrounding border. + m_pos = pos; + + if (m_flag & wxWEST) + { + pos.x += m_border; + size.x -= m_border; + } + if (m_flag & wxEAST) + { + size.x -= m_border; + } + if (m_flag & wxNORTH) + { + pos.y += m_border; + size.y -= m_border; + } + if (m_flag & wxSOUTH) + { + size.y -= m_border; + } if (IsSizer()) m_sizer->SetDimension( pos.x, pos.y, size.x, size.y ); @@ -937,21 +952,32 @@ wxSize wxBoxSizer::CalcMin() //--------------------------------------------------------------------------- wxStaticBoxSizer::wxStaticBoxSizer( wxStaticBox *box, int orient ) - : wxBoxSizer( orient ) + : wxBoxSizer( orient ) { wxASSERT_MSG( box, wxT("wxStaticBoxSizer needs a static box") ); m_staticBox = box; } +static void GetStaticBoxBorders(wxStaticBox *box, + int *borderTop, int *borderOther) +{ + // this has to be done platform by platform as there is no way to + // guess the thickness of a wxStaticBox border +#ifdef __WXGTK__ + if ( box->GetLabel().IsEmpty() ) + *borderTop = 5; + else +#endif // __WXGTK__ + *borderTop = 15; + + *borderOther = 5; +} + void wxStaticBoxSizer::RecalcSizes() { - // this will have to be done platform by platform - // as there is no way to guess the thickness of - // a wxStaticBox border - int top_border = 15; - if (m_staticBox->GetLabel().IsEmpty()) top_border = 5; - int other_border = 5; + int top_border, other_border; + GetStaticBoxBorders(m_staticBox, &top_border, &other_border); m_staticBox->SetSize( m_position.x, m_position.y, m_size.x, m_size.y ); @@ -970,13 +996,8 @@ void wxStaticBoxSizer::RecalcSizes() wxSize wxStaticBoxSizer::CalcMin() { - // This will have to be done platform by platform - // as there is no way to guess the thickness of - // a wxStaticBox border. - - int top_border = 15; - if (m_staticBox->GetLabel().IsEmpty()) top_border = 5; - int other_border = 5; + int top_border, other_border; + GetStaticBoxBorders(m_staticBox, &top_border, &other_border); wxSize ret( wxBoxSizer::CalcMin() ); ret.x += 2*other_border;