Improve rows, columns and cells deselection in wxGrid

Use DeselectBlock() instead of ToggleCellSelection() to improve execution
speed and make the code more clean.
This commit is contained in:
Ilya Sinitsyn 2020-03-26 05:50:25 +07:00 committed by Vadim Zeitlin
parent f1c3dfdca6
commit cdf3187fe5
2 changed files with 14 additions and 32 deletions

View File

@ -2687,7 +2687,6 @@ private:
void DoGridProcessTab(wxKeyboardState& kbdState);
// common implementations of methods defined for both rows and columns
void DeselectLine(int line, const wxGridOperations& oper);
bool DoEndDragResizeLine(const wxGridOperations& oper, wxGridWindow *gridWindow);
int PosToLinePos(int pos, bool clipToMinMax,
const wxGridOperations& oper,

View File

@ -10198,47 +10198,30 @@ void wxGrid::SelectAll()
// cell, row and col deselection
// ----------------------------------------------------------------------------
void wxGrid::DeselectLine(int line, const wxGridOperations& oper)
{
if ( !m_selection )
return;
const wxGridSelectionModes mode = m_selection->GetSelectionMode();
if ( mode == oper.GetSelectionMode() ||
mode == wxGrid::wxGridSelectRowsOrColumns )
{
const wxGridCellCoords c(oper.MakeCoords(line, 0));
if ( m_selection->IsInSelection(c) )
m_selection->ToggleCellSelection(c);
}
else if ( mode != oper.Dual().GetSelectionMode() )
{
const int nOther = oper.Dual().GetNumberOfLines(this, NULL);
for ( int i = 0; i < nOther; i++ )
{
const wxGridCellCoords c(oper.MakeCoords(line, i));
if ( m_selection->IsInSelection(c) )
m_selection->ToggleCellSelection(c);
}
}
//else: can only select orthogonal lines so no lines in this direction
// could have been selected anyhow
}
void wxGrid::DeselectRow(int row)
{
DeselectLine(row, wxGridRowOperations());
wxCHECK_RET( row >= 0 && row < m_numRows, wxT("invalid row index") );
if ( m_selection )
m_selection->DeselectBlock(wxGridBlockCoords(row, 0, row, m_numRows - 1));
}
void wxGrid::DeselectCol(int col)
{
DeselectLine(col, wxGridColumnOperations());
wxCHECK_RET( col >= 0 && col < m_numCols, wxT("invalid column index") );
if ( m_selection )
m_selection->DeselectBlock(wxGridBlockCoords(0, col, m_numCols - 1, col));
}
void wxGrid::DeselectCell( int row, int col )
{
if ( m_selection && m_selection->IsInSelection(row, col) )
m_selection->ToggleCellSelection(row, col);
wxCHECK_RET( row >= 0 && row < m_numRows &&
col >= 0 && col < m_numCols,
wxT("invalid cell coords") );
if ( m_selection )
m_selection->DeselectBlock(wxGridBlockCoords(row, col, row, col));
}
bool wxGrid::IsSelection() const