X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/84028727cbe6ee787af8e741daa7031c2e26b7b3..b192a24c92bdd1620020825beaa346a3f61dc5ae:/src/common/sizer.cpp diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 0a92ab0569..8735020e9b 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; @@ -189,7 +196,7 @@ 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. @@ -348,7 +355,13 @@ bool wxSizer::Remove( int pos ) void wxSizer::Fit( wxWindow *window ) { - window->SetSize( GetMinWindowSize( window ) ); + wxSize size; + if (window->IsTopLevel()) + size = FitSize( window ); + else + size = GetMinWindowSize( window ); + + window->SetSize( size ); } void wxSizer::Layout() @@ -359,10 +372,27 @@ void wxSizer::Layout() void wxSizer::SetSizeHints( wxWindow *window ) { - wxSize size( GetMinWindowSize( window ) ); + wxSize size = FitSize( window ); window->SetSizeHints( size.x, size.y ); } +wxSize wxSizer::GetMaxWindowSize( wxWindow *WXUNUSED(window) ) +{ + wxRect rect = wxGetClientDisplayRect(); + wxSize sizeMax (rect.width,rect.height); + + // Make the max size a bit smaller than the visible portion of + // the screen. A window which takes the entire screen doesn't + // look very nice either + sizeMax.x *= 9; + sizeMax.x /= 10; + + sizeMax.y *= 9; + sizeMax.y /= 10; + + return sizeMax; +} + wxSize wxSizer::GetMinWindowSize( wxWindow *window ) { wxSize minSize( GetMinSize() ); @@ -372,6 +402,20 @@ wxSize wxSizer::GetMinWindowSize( wxWindow *window ) minSize.y+size.y-client_size.y ); } +// Return a window size that will fit within the screens dimensions +wxSize wxSizer::FitSize( wxWindow *window ) +{ + wxSize size = GetMinWindowSize( window ); + wxSize sizeMax = GetMaxWindowSize( window ); + + if ( size.x > sizeMax.x ) + size.x = sizeMax.x; + if ( size.y > sizeMax.y ) + size.y = sizeMax.y; + + return size; +} + void wxSizer::SetDimension( int x, int y, int width, int height ) { m_position.x = x; @@ -900,14 +944,43 @@ wxSize wxBoxSizer::CalcMin() m_fixedWidth = 0; m_fixedHeight = 0; + // Find how long each stretch unit needs to be + int stretchSize = 1; wxNode *node = m_children.GetFirst(); while (node) + { + wxSizerItem *item = (wxSizerItem*) node->Data(); + if (item->GetOption() != 0) + { + int stretch = item->GetOption(); + wxSize size( item->CalcMin() ); + int sizePerStretch; + // Integer division rounded up is (a + b - 1) / b + if (m_orient == wxHORIZONTAL) + sizePerStretch = ( size.x + stretch - 1 ) / stretch; + else + sizePerStretch = ( size.y + stretch - 1 ) / stretch; + if (sizePerStretch > stretchSize) + stretchSize = sizePerStretch; + } + node = node->Next(); + } + // Calculate overall minimum size + node = m_children.GetFirst(); + while (node) { wxSizerItem *item = (wxSizerItem*) node->Data(); m_stretchable += item->GetOption(); - + wxSize size( item->CalcMin() ); + if (item->GetOption() != 0) + { + if (m_orient == wxHORIZONTAL) + size.x = stretchSize * item->GetOption(); + else + size.y = stretchSize * item->GetOption(); + } if (m_orient == wxHORIZONTAL) { @@ -928,7 +1001,7 @@ wxSize wxBoxSizer::CalcMin() m_fixedWidth = wxMax( m_fixedWidth, size.x ); } else - { + { m_fixedWidth += size.x; m_fixedHeight = wxMax( m_fixedHeight, size.y ); } @@ -963,7 +1036,7 @@ static void GetStaticBoxBorders(wxStaticBox *box, else #endif // __WXGTK__ *borderTop = 15; - + (void)box; *borderOther = 5; }