From: Vadim Zeitlin Date: Fri, 23 Jul 2010 23:33:46 +0000 (+0000) Subject: Ensure that wxAuiNotebook::SetArtProvider() always does set it. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/4026f044ee28289b2c05e05f2ec7f15f02b9cf76?ds=inline Ensure that wxAuiNotebook::SetArtProvider() always does set it. It used to only set the provider if the height of the tabs defined by the new provider was different from the one used by the old one, otherwise the call was optimized away. Fix this by explicitly setting the art provider for all tabs in SetArtProvider() itself if UpdateTabCtrlHeight() didn't do it. Closes #9738. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65068 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/aui/auibook.h b/include/wx/aui/auibook.h index eaae78212f..5fa37345d2 100644 --- a/include/wx/aui/auibook.h +++ b/include/wx/aui/auibook.h @@ -590,7 +590,11 @@ protected: virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } // these can be overridden - virtual void UpdateTabCtrlHeight(); + + // update the height, return true if it was done or false if the new height + // calculated by CalculateTabCtrlHeight() is the same as the old one + virtual bool UpdateTabCtrlHeight(); + virtual int CalculateTabCtrlHeight(); virtual wxSize CalculateNewSplitSize(); diff --git a/src/aui/auibook.cpp b/src/aui/auibook.cpp index ac483df486..34b51274db 100644 --- a/src/aui/auibook.cpp +++ b/src/aui/auibook.cpp @@ -2909,7 +2909,23 @@ void wxAuiNotebook::SetArtProvider(wxAuiTabArt* art) { m_tabs.SetArtProvider(art); - UpdateTabCtrlHeight(); + // Update the height and do nothing else if it did something but otherwise + // (i.e. if the new art provider uses the same height as the old one) we + // need to manually set the art provider for all tabs ourselves. + if ( !UpdateTabCtrlHeight() ) + { + wxAuiPaneInfoArray& all_panes = m_mgr.GetAllPanes(); + const size_t pane_count = all_panes.GetCount(); + for (size_t i = 0; i < pane_count; ++i) + { + wxAuiPaneInfo& pane = all_panes.Item(i); + if (pane.name == wxT("dummy")) + continue; + wxTabFrame* tab_frame = (wxTabFrame*)pane.window; + wxAuiTabCtrl* tabctrl = tab_frame->m_tabs; + tabctrl->SetArtProvider(art->Clone()); + } + } } // SetTabCtrlHeight() is the highest-level override of the @@ -2950,34 +2966,36 @@ void wxAuiNotebook::SetUniformBitmapSize(const wxSize& size) } // UpdateTabCtrlHeight() does the actual tab resizing. It's meant -// to be used interally -void wxAuiNotebook::UpdateTabCtrlHeight() +// to be used internally +bool wxAuiNotebook::UpdateTabCtrlHeight() { // get the tab ctrl height we will use int height = CalculateTabCtrlHeight(); // if the tab control height needs to change, update // all of our tab controls with the new height - if (m_tab_ctrl_height != height) - { - wxAuiTabArt* art = m_tabs.GetArtProvider(); + if (m_tab_ctrl_height == height) + return false; - m_tab_ctrl_height = height; + wxAuiTabArt* art = m_tabs.GetArtProvider(); - wxAuiPaneInfoArray& all_panes = m_mgr.GetAllPanes(); - size_t i, pane_count = all_panes.GetCount(); - for (i = 0; i < pane_count; ++i) - { - wxAuiPaneInfo& pane = all_panes.Item(i); - if (pane.name == wxT("dummy")) - continue; - wxTabFrame* tab_frame = (wxTabFrame*)pane.window; - wxAuiTabCtrl* tabctrl = tab_frame->m_tabs; - tab_frame->SetTabCtrlHeight(m_tab_ctrl_height); - tabctrl->SetArtProvider(art->Clone()); - tab_frame->DoSizing(); - } + m_tab_ctrl_height = height; + + wxAuiPaneInfoArray& all_panes = m_mgr.GetAllPanes(); + size_t i, pane_count = all_panes.GetCount(); + for (i = 0; i < pane_count; ++i) + { + wxAuiPaneInfo& pane = all_panes.Item(i); + if (pane.name == wxT("dummy")) + continue; + wxTabFrame* tab_frame = (wxTabFrame*)pane.window; + wxAuiTabCtrl* tabctrl = tab_frame->m_tabs; + tab_frame->SetTabCtrlHeight(m_tab_ctrl_height); + tabctrl->SetArtProvider(art->Clone()); + tab_frame->DoSizing(); } + + return true; } void wxAuiNotebook::UpdateHintWindowSize()