X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/960615f41009ac62e99f833afbec10d96bd2d2f9..96c9640205933ad0673d5af2c96af0816c50160c:/src/ribbon/page.cpp?ds=sidebyside diff --git a/src/ribbon/page.cpp b/src/ribbon/page.cpp index fcca24e37b..17d8c316dc 100644 --- a/src/ribbon/page.cpp +++ b/src/ribbon/page.cpp @@ -14,10 +14,9 @@ #pragma hdrstop #endif -#include "wx/ribbon/page.h" - #if wxUSE_RIBBON +#include "wx/ribbon/page.h" #include "wx/ribbon/art.h" #include "wx/ribbon/bar.h" #include "wx/dcbuffer.h" @@ -374,6 +373,8 @@ void wxRibbonPage::SetSizeWithScrollButtonAdjustment(int x, int y, int width, in } } } + if (width < 0) width = 0; + if (height < 0) height = 0; SetSize(x, y, width, height); } @@ -414,9 +415,12 @@ void wxRibbonPage::OnSize(wxSizeEvent& evt) { wxSize new_size = evt.GetSize(); - wxMemoryDC temp_dc; - wxRect invalid_rect = m_art->GetPageBackgroundRedrawArea(temp_dc, this, m_old_size, new_size); - Refresh(true, &invalid_rect); + if (m_art) + { + wxMemoryDC temp_dc; + wxRect invalid_rect = m_art->GetPageBackgroundRedrawArea(temp_dc, this, m_old_size, new_size); + Refresh(true, &invalid_rect); + } m_old_size = new_size; @@ -491,19 +495,30 @@ bool wxRibbonPage::Realize() void wxRibbonPage::PopulateSizeCalcArray(wxSize (wxWindow::*get_size)(void) const) { + wxSize parentSize = GetSize(); + parentSize.x -= m_art->GetMetric(wxRIBBON_ART_PAGE_BORDER_LEFT_SIZE); + parentSize.x -= m_art->GetMetric(wxRIBBON_ART_PAGE_BORDER_RIGHT_SIZE); + parentSize.y -= m_art->GetMetric(wxRIBBON_ART_PAGE_BORDER_TOP_SIZE); + parentSize.y -= m_art->GetMetric(wxRIBBON_ART_PAGE_BORDER_BOTTOM_SIZE); + if(m_size_calc_array_size != GetChildren().GetCount()) { delete[] m_size_calc_array; m_size_calc_array_size = GetChildren().GetCount(); m_size_calc_array = new wxSize[m_size_calc_array_size]; } + wxSize* node_size = m_size_calc_array; for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext(), ++node_size ) { wxWindow* child = node->GetData(); - *node_size = (child->*get_size)(); + wxRibbonPanel* panel = wxDynamicCast(child, wxRibbonPanel); + if (panel && panel->GetFlags() & wxRIBBON_PANEL_FLEXIBLE) + *node_size = panel->GetBestSizeForParentSize(parentSize); + else + *node_size = (child->*get_size)(); } } @@ -539,6 +554,7 @@ bool wxRibbonPage::DoActualLayout() minor_axis_size = GetSize().GetWidth() - origin.x - m_art->GetMetric(wxRIBBON_ART_PAGE_BORDER_RIGHT_SIZE); available_space = m_size_in_major_axis_for_children - m_art->GetMetric(wxRIBBON_ART_PAGE_BORDER_BOTTOM_SIZE) - origin.y; } + if (minor_axis_size < 0) minor_axis_size = 0; size_t size_index; for(size_index = 0; size_index < m_size_calc_array_size; ++size_index) { @@ -771,7 +787,12 @@ bool wxRibbonPage::ExpandPanels(wxOrientation direction, int maximum_amount) { continue; } - if(panel->IsSizingContinuous()) + if (panel->GetFlags() & wxRIBBON_PANEL_FLEXIBLE) + { + // Don't change if it's flexible since we already calculated the + // correct size for the panel. + } + else if(panel->IsSizingContinuous()) { int size = GetSizeInOrientation(*panel_size, direction); if(size < smallest_size)