Reverted to old wxPG_AUTO_SORT behavior in which only root properties and immediate children of categories are (automatically) sorted; Added Sort flags; Applied slight optimization when sorting on propgridmanager page change

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57975 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Jaakko Salli
2009-01-10 15:16:03 +00:00
parent fa8224a15a
commit 0eb877f2c1
7 changed files with 73 additions and 31 deletions

View File

@@ -387,7 +387,12 @@ wxPG_INC_ATTRIBUTES = 0x00000040,
wxPG_RECURSE_STARTS = 0x00000080, wxPG_RECURSE_STARTS = 0x00000080,
/** Force value change. */ /** Force value change. */
wxPG_FORCE = 0x00000100 wxPG_FORCE = 0x00000100,
/** Only sort categories and their immediate children.
Sorting done by wxPG_AUTO_SORT option uses this.
*/
wxPG_SORT_TOP_LEVEL_ONLY = 0x00000200
}; };

View File

@@ -1227,11 +1227,17 @@ public:
void SetValidationFailureBehavior( int vfbFlags ); void SetValidationFailureBehavior( int vfbFlags );
/** /**
Sorts all properties. Sorts all properties recursively.
@param flags
This can contain any of the following options:
wxPG_SORT_TOP_LEVEL_ONLY: Only sort categories and their
immediate children. Sorting done by wxPG_AUTO_SORT option
uses this.
@see SortChildren, wxPropertyGrid::SetSortFunction @see SortChildren, wxPropertyGrid::SetSortFunction
*/ */
void Sort(); void Sort( int flags = 0 );
/** /**
Sorts children of a property. Sorts children of a property.
@@ -1239,15 +1245,16 @@ public:
@param id @param id
Name or pointer to a property. Name or pointer to a property.
@param recursively @param flags
If @true, then children are sorted recursively. This can contain any of the following options:
wxPG_RECURSE: Sorts recursively.
@see Sort, wxPropertyGrid::SetSortFunction @see Sort, wxPropertyGrid::SetSortFunction
*/ */
void SortChildren( wxPGPropArg id, bool recursively = false ) void SortChildren( wxPGPropArg id, int flags = 0 )
{ {
wxPG_PROP_ARG_CALL_PROLOG() wxPG_PROP_ARG_CALL_PROLOG()
m_pState->DoSortChildren(p, recursively); m_pState->DoSortChildren(p, flags);
} }
#ifdef SWIG #ifdef SWIG

View File

@@ -613,8 +613,10 @@ public:
/** Set virtual width for this particular page. */ /** Set virtual width for this particular page. */
void SetVirtualWidth( int width ); void SetVirtualWidth( int width );
void DoSortChildren( wxPGProperty* p, bool recursively = false ); void DoSortChildren( wxPGProperty* p, int flags = 0 );
void DoSort(); void DoSort( int flags = 0 );
bool PrepareAfterItemsAdded();
void SetSelection( wxPGProperty* p ) { m_selected = p; } void SetSelection( wxPGProperty* p ) { m_selected = p; }

View File

@@ -902,11 +902,17 @@ public:
void SetValidationFailureBehavior( int vfbFlags ); void SetValidationFailureBehavior( int vfbFlags );
/** /**
Sorts all properties. Sorts all properties recursively.
@param flags
This can contain any of the following options:
wxPG_SORT_TOP_LEVEL_ONLY: Only sort categories and their
immediate children. Sorting done by wxPG_AUTO_SORT option
uses this.
@see SortChildren, wxPropertyGrid::SetSortFunction @see SortChildren, wxPropertyGrid::SetSortFunction
*/ */
void Sort(); void Sort( int flags = 0 );
/** /**
Sorts children of a property. Sorts children of a property.
@@ -914,12 +920,13 @@ public:
@param id @param id
Name or pointer to a property. Name or pointer to a property.
@param recursively @param flags
If @true, then children are sorted recursively. This can contain any of the following options:
wxPG_RECURSE: Sorts recursively.
@see Sort, wxPropertyGrid::SetSortFunction @see Sort, wxPropertyGrid::SetSortFunction
*/ */
void SortChildren( wxPGPropArg id, bool recursively = false ); void SortChildren( wxPGPropArg id, int flags = 0 );
/** /**
Returns editor pointer of editor with given name; Returns editor pointer of editor with given name;

View File

@@ -1180,7 +1180,7 @@ void wxPropertyGrid::PrepareAfterItemsAdded()
m_pState->m_itemsAdded = 0; m_pState->m_itemsAdded = 0;
if ( m_windowStyle & wxPG_AUTO_SORT ) if ( m_windowStyle & wxPG_AUTO_SORT )
Sort(); Sort(wxPG_SORT_TOP_LEVEL_ONLY);
RecalculateVirtualSize(); RecalculateVirtualSize();
} }
@@ -2277,8 +2277,7 @@ void wxPropertyGrid::SwitchState( wxPropertyGridPageState* pNewState )
else if ( !m_frozen ) else if ( !m_frozen )
{ {
// Refresh, if not frozen. // Refresh, if not frozen.
if ( m_pState->m_itemsAdded ) m_pState->PrepareAfterItemsAdded();
PrepareAfterItemsAdded();
// Reselect // Reselect
if ( m_pState->m_selected ) if ( m_pState->m_selected )

View File

@@ -762,7 +762,7 @@ bool wxPropertyGridInterface::Expand( wxPGPropArg id )
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
void wxPropertyGridInterface::Sort() void wxPropertyGridInterface::Sort( int flags )
{ {
wxPropertyGrid* pg = GetPropertyGrid(); wxPropertyGrid* pg = GetPropertyGrid();
@@ -774,7 +774,7 @@ void wxPropertyGridInterface::Sort()
{ {
wxPropertyGridPageState* page = GetPageState(pageIndex); wxPropertyGridPageState* page = GetPageState(pageIndex);
if ( !page ) break; if ( !page ) break;
page->DoSort(); page->DoSort(flags);
pageIndex++; pageIndex++;
} }
} }

View File

@@ -635,16 +635,21 @@ static int wxPG_SortFunc_ByLabel(wxPGProperty **pp1, wxPGProperty **pp2)
#endif #endif
void wxPropertyGridPageState::DoSortChildren( wxPGProperty* p, void wxPropertyGridPageState::DoSortChildren( wxPGProperty* p,
bool recursively ) int flags )
{ {
if ( !p ) if ( !p )
p = m_properties; p = m_properties;
// Can only sort items with children
if ( !p->GetChildCount() ) if ( !p->GetChildCount() )
return; return;
// Can only sort items with children // Never sort children of aggregate properties
if ( p->GetChildCount() < 1 ) if ( p->HasFlag(wxPG_PROP_AGGREGATE) )
return;
if ( (flags & wxPG_SORT_TOP_LEVEL_ONLY)
&& !p->IsCategory() && !p->IsRoot() )
return; return;
#if wxUSE_STL #if wxUSE_STL
@@ -661,35 +666,52 @@ void wxPropertyGridPageState::DoSortChildren( wxPGProperty* p,
p->m_children.Sort( wxPG_SortFunc_ByLabel ); p->m_children.Sort( wxPG_SortFunc_ByLabel );
#endif #endif
// Fix indexes // Fix indices
p->FixIndicesOfChildren(); p->FixIndicesOfChildren();
if ( recursively && !p->HasFlag(wxPG_PROP_AGGREGATE) ) if ( flags & wxPG_RECURSE )
{ {
// Apply sort recursively
for ( unsigned int i=0; i<p->GetChildCount(); i++ ) for ( unsigned int i=0; i<p->GetChildCount(); i++ )
DoSortChildren(p->Item(i)); DoSortChildren(p->Item(i), flags);
} }
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
void wxPropertyGridPageState::DoSort() void wxPropertyGridPageState::DoSort( int flags )
{ {
DoSortChildren( m_properties, true ); DoSortChildren( m_properties, flags | wxPG_RECURSE );
// Sort categories as well (but we need not do it recursively) // Sort categories as well (but we need not do it recursively)
if ( !IsInNonCatMode() ) if ( IsInNonCatMode() )
{ {
size_t i; size_t i;
for ( i=0;i<m_properties->GetChildCount();i++) for ( i=0;i<m_regularArray.GetChildCount();i++)
{ {
wxPGProperty* p = m_properties->Item(i); wxPGProperty* p = m_regularArray.Item(i);
if ( p->IsCategory() ) if ( p->IsCategory() )
DoSortChildren( p ); DoSortChildren( p, 0 );
} }
} }
} }
// -----------------------------------------------------------------------
bool wxPropertyGridPageState::PrepareAfterItemsAdded()
{
if ( !m_itemsAdded ) return false;
wxPropertyGrid* pg = GetGrid();
m_itemsAdded = 0;
if ( pg->HasFlag(wxPG_AUTO_SORT) )
DoSort(wxPG_SORT_TOP_LEVEL_ONLY);
return true;
}
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// wxPropertyGridPageState splitter, column and hittest functions // wxPropertyGridPageState splitter, column and hittest functions
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------