From 28f96bdff022da758beb802b34b5bcda77d8031d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 22 Nov 2016 01:42:28 +0100 Subject: [PATCH] Fix wxTreeListCtrl under wxOSX Postpone resetting indent in wxOSX wxDataViewCtrl to avoid always removing, and hence never showing the expanders at all, for wxTreeListCtrl whose model starts its life as a list but becomes a tree as soon as any items with children are added to it. By postponing the call to IsListModel() until the next resize, we give the model the time it needs to decide what it's going to be, while still removing the unnecessary indent if there is no need for it. Closes #17409. --- include/wx/osx/cocoa/dataview.h | 2 ++ src/osx/cocoa/dataview.mm | 30 ++++++++++++++++++++++-------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/include/wx/osx/cocoa/dataview.h b/include/wx/osx/cocoa/dataview.h index 142fe28a49..18e3179e5c 100644 --- a/include/wx/osx/cocoa/dataview.h +++ b/include/wx/osx/cocoa/dataview.h @@ -534,6 +534,8 @@ private: wxCocoaOutlineDataSource* m_DataSource; wxCocoaOutlineView* m_OutlineView; + + bool m_removeIndentIfNecessary; }; #endif // _WX_DATAVIEWCTRL_COCOOA_H_ diff --git a/src/osx/cocoa/dataview.mm b/src/osx/cocoa/dataview.mm index b146e962f5..d8ea3d456e 100644 --- a/src/osx/cocoa/dataview.mm +++ b/src/osx/cocoa/dataview.mm @@ -1939,7 +1939,8 @@ wxCocoaDataViewControl::wxCocoaDataViewControl(wxWindow* peer, [[NSScrollView alloc] initWithFrame:wxOSXGetFrameForControl(peer,pos,size)] ), m_DataSource(NULL), - m_OutlineView([[wxCocoaOutlineView alloc] init]) + m_OutlineView([[wxCocoaOutlineView alloc] init]), + m_removeIndentIfNecessary(false) { // initialize scrollview (the outline view is part of a scrollview): NSScrollView* scrollview = (NSScrollView*) GetWXWidget(); @@ -2289,13 +2290,11 @@ bool wxCocoaDataViewControl::AssociateModel(wxDataViewModel* model) m_DataSource = NULL; [m_OutlineView setDataSource:m_DataSource]; // if there is a data source the data is immediately going to be requested - // By default, the first column is indented to leave enough place for the - // expanders, but this looks bad if there are no expanders, so don't use - // indent in this case. - if ( model && model->IsListModel() ) - { - DoSetIndent(0); - } + // Set this to true to check if we need to remove the indent in the next + // OnSize() call: we can't do it directly here because the model might not + // be fully initialized yet and so might not know whether it has any items + // with children or not. + m_removeIndentIfNecessary = true; return true; } @@ -2460,6 +2459,21 @@ void wxCocoaDataViewControl::SetRowHeight(const wxDataViewItem& WXUNUSED(item), void wxCocoaDataViewControl::OnSize() { + if ( m_removeIndentIfNecessary ) + { + m_removeIndentIfNecessary = false; + + const wxDataViewModel* const model = GetDataViewCtrl()->GetModel(); + + // By default, the first column is indented to leave enough place for the + // expanders, but this looks bad if there are no expanders, so don't use + // indent in this case. + if ( model && model->IsListModel() ) + { + DoSetIndent(0); + } + } + if ([m_OutlineView numberOfColumns] == 1) [m_OutlineView sizeLastColumnToFit]; }