Merge branch 'grid-event-delete'

Handle deleting grid rows/columns in event handlers gracefully.

See https://github.com/wxWidgets/wxWidgets/pull/1834
This commit is contained in:
Vadim Zeitlin
2020-05-06 18:45:16 +02:00
2 changed files with 34 additions and 22 deletions

View File

@@ -5297,16 +5297,35 @@ wxGrid::SendGridSizeEvent(wxEventType type,
return GetEventHandler()->ProcessEvent(gridEvt);
}
// Generate a grid event based on a mouse event and return:
// -1 if the event was vetoed
// Process the event and return
// -1 if the event was vetoed or if event cell was deleted
// +1 if the event was processed (but not vetoed)
// 0 if the event wasn't handled
int wxGrid::DoSendEvent(wxGridEvent& gridEvt)
{
const bool claimed = GetEventHandler()->ProcessEvent(gridEvt);
// A Veto'd event may not be `claimed' so test this first
if ( !gridEvt.IsAllowed() )
return -1;
// We also return -1 if the event cell was deleted, as this allows to have
// checks in several functions that generate an event and then proceed
// doing something by default with the selected cell: this shouldn't be
// done if the user-defined handler deleted this cell.
if ( gridEvt.GetRow() >= GetNumberRows() ||
gridEvt.GetCol() >= GetNumberCols() )
return -1;
return claimed ? 1 : 0;
}
// Generate a grid event based on a mouse event and call DoSendEvent() with it.
int
wxGrid::SendEvent(wxEventType type,
int row, int col,
const wxMouseEvent& mouseEv)
{
bool claimed, vetoed;
if ( type == wxEVT_GRID_LABEL_LEFT_CLICK ||
type == wxEVT_GRID_LABEL_LEFT_DCLICK ||
@@ -5328,8 +5347,8 @@ wxGrid::SendEvent(wxEventType type,
pos.y,
false,
mouseEv);
claimed = GetEventHandler()->ProcessEvent(gridEvt);
vetoed = !gridEvt.IsAllowed();
return DoSendEvent(gridEvt);
}
else
{
@@ -5349,15 +5368,8 @@ wxGrid::SendEvent(wxEventType type,
gridEvt.Veto();
}
claimed = GetEventHandler()->ProcessEvent(gridEvt);
vetoed = !gridEvt.IsAllowed();
return DoSendEvent(gridEvt);
}
// A Veto'd event may not be `claimed' so test this first
if (vetoed)
return -1;
return claimed ? 1 : 0;
}
// Generate a grid event of specified type, return value same as above
@@ -5368,13 +5380,7 @@ wxGrid::SendEvent(wxEventType type, int row, int col, const wxString& s)
wxGridEvent gridEvt( GetId(), type, this, row, col );
gridEvt.SetString(s);
const bool claimed = GetEventHandler()->ProcessEvent(gridEvt);
// A Veto'd event may not be `claimed' so test this first
if ( !gridEvt.IsAllowed() )
return -1;
return claimed ? 1 : 0;
return DoSendEvent(gridEvt);
}
void wxGrid::Refresh(bool eraseb, const wxRect* rect)