git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63534
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
/** Appearance of a unspecified value cell. */
wxPGCell m_unspecifiedAppearance;
/** Appearance of a unspecified value cell. */
wxPGCell m_unspecifiedAppearance;
+ /** List of properties to be deleted/removed in idle event handler. */
+ wxArrayPGProperty m_deletedProperties;
+ wxArrayPGProperty m_removedProperties;
+
//
// Temporary values
//
//
// Temporary values
//
bool ChangePropertyValue( wxPGPropArg id, wxVariant newValue );
/**
bool ChangePropertyValue( wxPGPropArg id, wxVariant newValue );
/**
- Deletes a property by id. If category is deleted, all children are
- automatically deleted as well.
- */
+ Removes and deletes a property and any children.
+
+ @param id
+ Pointer or name of a property.
+
+ @remarks If you delete a property in a wxPropertyGrid event
+ handler, the actual deletion is postponed until the next
+ idle event.
+
+ This functions deselects selected property, if any.
+ Validation failure option wxPG_VFB_STAY_IN_PROPERTY is not
+ respected, ie. selection is cleared even if editor had
+ invalid value.
+ */
void DeleteProperty( wxPGPropArg id );
/**
void DeleteProperty( wxPGPropArg id );
/**
- Removes and returns a property.
+ Removes a property. Does not delete the property object, but
+ instead returns it.
@param id
Pointer or name of a property.
@remarks Removed property cannot have any children.
@param id
Pointer or name of a property.
@remarks Removed property cannot have any children.
+
+ Also, if you remove property in a wxPropertyGrid event
+ handler, the actual removal is postponed until the next
+ idle event.
*/
wxPGProperty* RemoveProperty( wxPGPropArg id );
*/
wxPGProperty* RemoveProperty( wxPGPropArg id );
bool ChangePropertyValue( wxPGPropArg id, wxVariant newValue );
/**
bool ChangePropertyValue( wxPGPropArg id, wxVariant newValue );
/**
+ Removes and deletes a property and any children.
- @remarks This functions deselects selected property, if any. Validation
- failure option wxPG_VFB_STAY_IN_PROPERTY is not respected, ie.
- selection is cleared even if editor had invalid value.
+ @param id
+ Pointer or name of a property.
+
+ @remarks If you delete a property in a wxPropertyGrid event
+ handler, the actual deletion is postponed until the next
+ idle event.
+
+ This functions deselects selected property, if any.
+ Validation failure option wxPG_VFB_STAY_IN_PROPERTY is not
+ respected, ie. selection is cleared even if editor had
+ invalid value.
*/
void DeleteProperty( wxPGPropArg id );
*/
void DeleteProperty( wxPGPropArg id );
static void RegisterAdditionalEditors();
/**
static void RegisterAdditionalEditors();
/**
- Removes and returns a property.
+ Removes a property. Does not delete the property object, but
+ instead returns it.
@param id
Pointer or name of a property.
@remarks Removed property cannot have any children.
@param id
Pointer or name of a property.
@remarks Removed property cannot have any children.
+
+ Also, if you remove property in a wxPropertyGrid event
+ handler, the actual removal is postponed until the next
+ idle event.
*/
wxPGProperty* RemoveProperty( wxPGPropArg id );
*/
wxPGProperty* RemoveProperty( wxPGPropArg id );
+ wxPropertyGridEvent* prevProcessedEvent = m_processedEvent;
m_processedEvent = &evt;
m_eventObject->HandleWindowEvent(evt);
m_processedEvent = &evt;
m_eventObject->HandleWindowEvent(evt);
- m_processedEvent = NULL;
+ m_processedEvent = prevProcessedEvent;
return evt.WasVetoed();
}
return evt.WasVetoed();
}
if ( tlp != m_tlp )
OnTLPChanging(tlp);
}
if ( tlp != m_tlp )
OnTLPChanging(tlp);
}
+
+ //
+ // Resolve pending property removals
+ if ( m_deletedProperties.size() > 0 )
+ {
+ wxArrayPGProperty& arr = m_deletedProperties;
+ for ( unsigned int i=0; i<arr.size(); i++ )
+ {
+ DeleteProperty(arr[i]);
+ }
+ arr.clear();
+ }
+ if ( m_removedProperties.size() > 0 )
+ {
+ wxArrayPGProperty& arr = m_removedProperties;
+ for ( unsigned int i=0; i<arr.size(); i++ )
+ {
+ RemoveProperty(arr[i]);
+ }
+ arr.clear();
+ }
}
bool wxPropertyGrid::IsEditorFocused() const
}
bool wxPropertyGrid::IsEditorFocused() const
wxCHECK_RET( item != &m_regularArray && item != m_abcArray,
wxT("wxPropertyGrid: Do not attempt to remove the root item.") );
wxCHECK_RET( item != &m_regularArray && item != m_abcArray,
wxT("wxPropertyGrid: Do not attempt to remove the root item.") );
+ wxPropertyGrid* pg = GetGrid();
+
+ // Must defer deletion? Yes, if handling a wxPG event.
+ if ( pg && pg->m_processedEvent )
+ {
+ if ( doDelete )
+ pg->m_deletedProperties.push_back(item);
+ else
+ pg->m_removedProperties.push_back(item);
+ return;
+ }
+
unsigned int indinparent = item->GetIndexInParent();
wxPGProperty* pwc = (wxPGProperty*)item;
unsigned int indinparent = item->GetIndexInParent();
wxPGProperty* pwc = (wxPGProperty*)item;
wxASSERT( item->GetParentState() == this );
wxASSERT( item->GetParentState() == this );
- wxPropertyGrid* pg = GetGrid();
-
if ( DoIsPropertySelected(item) )
{
if ( pg && pg->GetState() == this )
if ( DoIsPropertySelected(item) )
{
if ( pg && pg->GetState() == this )