Add wxDataViewCtrl::ExpandChildren()

This convenient method allows to expand all children of the item
recursively.

This is directly supported by both native implementations, so it makes
sense to have this in wxDataViewCtrl itself, even if it could be also
(less efficiently) implemented in the user code.
This commit is contained in:
Vadim Zeitlin
2020-12-05 14:41:09 +01:00
parent faffc5fe0a
commit d47fa718cd
15 changed files with 87 additions and 20 deletions

View File

@@ -740,6 +740,7 @@ public:
virtual void UnselectAll() = 0;
void Expand( const wxDataViewItem & item );
void ExpandChildren( const wxDataViewItem & item );
void ExpandAncestors( const wxDataViewItem & item );
virtual void Collapse( const wxDataViewItem & item ) = 0;
virtual bool IsExpanded( const wxDataViewItem & item ) const = 0;
@@ -793,7 +794,9 @@ protected:
// Just expand this item assuming it is already shown, i.e. its parent has
// been already expanded using ExpandAncestors().
virtual void DoExpand(const wxDataViewItem & item) = 0;
//
// If expandChildren is true, also expand all its children recursively.
virtual void DoExpand(const wxDataViewItem & item, bool expandChildren) = 0;
private:
// Implementation of the public Set/GetCurrentItem() methods which are only

View File

@@ -364,7 +364,7 @@ private:
virtual wxDataViewItem DoGetCurrentItem() const wxOVERRIDE;
virtual void DoSetCurrentItem(const wxDataViewItem& item) wxOVERRIDE;
virtual void DoExpand(const wxDataViewItem& item) wxOVERRIDE;
virtual void DoExpand(const wxDataViewItem& item, bool expandChildren) wxOVERRIDE;
void InvalidateColBestWidths();
void InvalidateColBestWidth(int idx);

View File

@@ -218,7 +218,7 @@ protected:
virtual void DoSetExpanderColumn() wxOVERRIDE;
virtual void DoSetIndent() wxOVERRIDE;
virtual void DoExpand(const wxDataViewItem& item) wxOVERRIDE;
virtual void DoExpand(const wxDataViewItem& item, bool expandChildren) wxOVERRIDE;
virtual void DoApplyWidgetStyle(GtkRcStyle *style) wxOVERRIDE;
virtual GdkWindow* GTKGetWindow(wxArrayGdkWindows& windows) const wxOVERRIDE;

View File

@@ -530,7 +530,7 @@ public:
//
virtual void DoSetIndent(int indent);
virtual void DoExpand(const wxDataViewItem& item);
virtual void DoExpand(const wxDataViewItem& item, bool expandChildren);
virtual void HitTest(const wxPoint& point,
wxDataViewItem& item,

View File

@@ -105,7 +105,7 @@ public:
// other methods
//
virtual void DoSetIndent (int indent) = 0; // sets the indentation in the native control
virtual void DoExpand (wxDataViewItem const& item) = 0; // expands the passed item in the native control
virtual void DoExpand (wxDataViewItem const& item, bool expandChildren) = 0; // expands the passed item in the native control
virtual void HitTest (wxPoint const& point, wxDataViewItem& item, wxDataViewColumn*& columnPtr) const = 0; // return the item and column pointer that contains with the passed point
virtual void SetRowHeight(int height) = 0; // sets the height of all rows

View File

@@ -276,7 +276,7 @@ protected:
virtual void DoSetExpanderColumn() wxOVERRIDE;
virtual void DoSetIndent() wxOVERRIDE;
virtual void DoExpand(const wxDataViewItem& item) wxOVERRIDE;
virtual void DoExpand(const wxDataViewItem& item, bool expandChildren) wxOVERRIDE;
virtual wxSize DoGetBestSize() const wxOVERRIDE;

View File

@@ -131,7 +131,7 @@ public:
protected:
virtual void DoSetExpanderColumn();
virtual void DoSetIndent();
virtual void DoExpand( const wxDataViewItem & item );
virtual void DoExpand( const wxDataViewItem & item, bool expandChildren );
private:
virtual wxDataViewItem DoGetCurrentItem() const;

View File

@@ -1402,6 +1402,16 @@ public:
*/
void ExpandAncestors( const wxDataViewItem & item );
/**
Expand all all children of the given item recursively.
This is the same as calling Expand() on the @a item itself and then
calling it for all of its children, grandchildren etc recursively.
@since 3.1.5
*/
void ExpandChildren( const wxDataViewItem & item );
/**
Returns pointer to the column. @a pos refers to the position in the
control which may change after reordering columns by the user.

View File

@@ -1265,7 +1265,14 @@ void wxDataViewCtrlBase::Expand(const wxDataViewItem& item)
{
ExpandAncestors(item);
DoExpand(item);
DoExpand(item, false);
}
void wxDataViewCtrlBase::ExpandChildren(const wxDataViewItem& item)
{
ExpandAncestors(item);
DoExpand(item, true);
}
void wxDataViewCtrlBase::ExpandAncestors( const wxDataViewItem & item )
@@ -1287,7 +1294,7 @@ void wxDataViewCtrlBase::ExpandAncestors( const wxDataViewItem & item )
// then we expand the parents, starting at the root
while (!parentChain.empty())
{
DoExpand(parentChain.back());
DoExpand(parentChain.back(), false);
parentChain.pop_back();
}
}

View File

@@ -874,7 +874,7 @@ public:
void HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* &column );
wxRect GetItemRect( const wxDataViewItem & item, const wxDataViewColumn* column );
void Expand( unsigned int row );
void Expand( unsigned int row, bool expandChildren = false );
void Collapse( unsigned int row );
bool IsExpanded( unsigned int row ) const;
bool HasChildren( unsigned int row ) const;
@@ -990,6 +990,9 @@ private:
return NULL;
}
// Helper of public Expand(), must be called with a valid node.
void DoExpand(wxDataViewTreeNode* node, unsigned int row, bool expandChildren);
private:
wxDataViewCtrl *m_owner;
int m_lineHeight;
@@ -3907,7 +3910,7 @@ bool wxDataViewMainWindow::HasChildren( unsigned int row ) const
return true;
}
void wxDataViewMainWindow::Expand( unsigned int row )
void wxDataViewMainWindow::Expand( unsigned int row, bool expandChildren )
{
if (IsList())
return;
@@ -3916,6 +3919,14 @@ void wxDataViewMainWindow::Expand( unsigned int row )
if (!node)
return;
return DoExpand(node, row, expandChildren);
}
void
wxDataViewMainWindow::DoExpand(wxDataViewTreeNode* node,
unsigned int row,
bool expandChildren)
{
if (!node->HasChildren())
return;
@@ -3961,6 +3972,28 @@ void wxDataViewMainWindow::Expand( unsigned int row )
// Send the expanded event
SendExpanderEvent(wxEVT_DATAVIEW_ITEM_EXPANDED,node->GetItem());
}
// Note that we have to expand the children when expanding recursively even
// when this node itself was already open.
if ( expandChildren )
{
const wxDataViewTreeNodes& children = node->GetChildNodes();
for ( wxDataViewTreeNodes::const_iterator i = children.begin();
i != children.end();
++i )
{
wxDataViewTreeNode* const child = *i;
// Row currently corresponds to the previous item, so increment it
// first to correspond to this child.
DoExpand(child, ++row, true);
// We don't need +1 here because we'll increment the row during the
// next loop iteration.
row += child->GetSubTreeCount();
}
}
}
void wxDataViewMainWindow::Collapse(unsigned int row)
@@ -6309,11 +6342,11 @@ int wxDataViewCtrl::GetRowByItem( const wxDataViewItem & item ) const
return m_clientArea->GetRowByItem( item );
}
void wxDataViewCtrl::DoExpand( const wxDataViewItem & item )
void wxDataViewCtrl::DoExpand( const wxDataViewItem & item, bool expandChildren )
{
int row = m_clientArea->GetRowByItem( item );
if (row != -1)
m_clientArea->Expand(row);
m_clientArea->Expand(row, expandChildren);
}
void wxDataViewCtrl::Collapse( const wxDataViewItem & item )

View File

@@ -5068,12 +5068,13 @@ wxDataViewColumn *wxDataViewCtrl::GetSortingColumn() const
return m_internal->GetDataViewSortColumn();
}
void wxDataViewCtrl::DoExpand( const wxDataViewItem & item )
void wxDataViewCtrl::DoExpand( const wxDataViewItem & item, bool expandChildren )
{
GtkTreeIter iter;
iter.user_data = item.GetID();
wxGtkTreePath path(m_internal->get_path( &iter ));
gtk_tree_view_expand_row( GTK_TREE_VIEW(m_treeview), path, false );
gtk_tree_view_expand_row( GTK_TREE_VIEW(m_treeview), path,
expandChildren ? TRUE : FALSE );
}
void wxDataViewCtrl::Collapse( const wxDataViewItem & item )

View File

@@ -2314,9 +2314,9 @@ void wxCocoaDataViewControl::EnsureVisible(const wxDataViewItem& item, const wxD
}
}
void wxCocoaDataViewControl::DoExpand(const wxDataViewItem& item)
void wxCocoaDataViewControl::DoExpand(const wxDataViewItem& item, bool expandChildren)
{
[m_OutlineView expandItem:[m_DataSource getDataViewItemFromBuffer:item]];
[m_OutlineView expandItem:[m_DataSource getDataViewItemFromBuffer:item] expandChildren:expandChildren];
}
unsigned int wxCocoaDataViewControl::GetCount() const

View File

@@ -516,9 +516,9 @@ void wxDataViewCtrl::EnsureVisible(wxDataViewItem const& item, wxDataViewColumn
}
}
void wxDataViewCtrl::DoExpand(wxDataViewItem const& item)
void wxDataViewCtrl::DoExpand(wxDataViewItem const& item, bool expandChildren)
{
return GetDataViewPeer()->DoExpand(item);
return GetDataViewPeer()->DoExpand(item, expandChildren);
}
bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const

View File

@@ -267,7 +267,7 @@ wxRect wxDataViewCtrl::GetItemRect( const wxDataViewItem &item,
return wxRect();
}
void wxDataViewCtrl::DoExpand( const wxDataViewItem & item )
void wxDataViewCtrl::DoExpand( const wxDataViewItem & item, bool expandChildren )
{
}

View File

@@ -271,6 +271,19 @@ TEST_CASE_METHOD(SingleSelectDataViewCtrlTestCase,
CHECK( !m_dvc->IsExpanded(m_grandchild) );
#endif
CHECK( !m_dvc->IsExpanded(m_child2) );
m_dvc->Collapse(m_root);
CHECK( !m_dvc->IsExpanded(m_root) );
m_dvc->ExpandChildren(m_root);
CHECK( m_dvc->IsExpanded(m_root) );
CHECK( m_dvc->IsExpanded(m_child1) );
// Expanding an already expanded node must still expand all its children.
m_dvc->Collapse(m_child1);
CHECK( !m_dvc->IsExpanded(m_child1) );
m_dvc->ExpandChildren(m_root);
CHECK( m_dvc->IsExpanded(m_child1) );
}
TEST_CASE_METHOD(SingleSelectDataViewCtrlTestCase,