samedi 24 octobre 2009

Cellules sélectionnées d'une wxGrid

J'ai bien cru péter un plomb! J'ai une wxGrid, et je veux savoir quelles sont les cellules sélectionnées. Quelque soit la méthode que j'utilise (GetSelectionBlockTopLeft / GetSelectionBlockBottomRight, GetSelectedCells, GetSelectedRows, GetSelectedCols), il m'en manquait toujours.

Tombant finalement sur le rapport de bug de chez wxWidgets, l'explication est arrivée: pour des raisons d'optimisation mémoire, différentes structures seront maintenues en fonction de la manière dont on sélectionne. Par exemple, lorsque l'on sélectionne une colonne entière, la grille gardera juste l'index de la colonne, lorsque l'on sélectionne un bloc, la grille sauvera le coin en haut à gauche et le coin en bas à droite, etc. Ce qui veux dire en fait qu'il faut utiliser les 4 méthodes pour trouver l'ensemble des sélections!

Cela donne quelque chose d'un peu comme ça:


std::set<std::pair<int, int> > getGridSelection(wxGrid & grid)
{
std::set<std::pair<int, int> > selection;

wxGridCellCoordsArray topLeft = grid.GetSelectionBlockTopLeft();
wxGridCellCoordsArray bottomRight = grid.GetSelectionBlockBottomRight();
for(size_t i = 0; i < std::min(topLeft.GetCount(), bottomRight.GetCount()); i++)
{
for(int row = topLeft.Item(i).GetRow(); row <= bottomRight.Item(i).GetRow(); row++)
{
for(int col = topLeft.Item(i).GetCol(); col <= bottomRight.Item(i).GetCol(); col++)
{
selection.insert(std::make_pair(row, col));
}
}
}

wxGridCellCoordsArray cellSelection = grid.GetSelectedCells();
for(size_t i = 0; i < cellSelection.GetCount(); i++)
{
selection.insert(std::make_pair(cellSelection.Item(i).GetRow(), cellSelection.Item(i).GetCol()));
}

wxArrayInt selectedRows = grid.GetSelectedRows();
for(size_t i = 0; i < selectedRows.GetCount(); i++)
{
for(int col = 0; col < grid.GetNumberCols(); col++)
{
selection.insert(std::make_pair(selectedRows.Item(i), col));
}
}

wxArrayInt selectedCols = grid.GetSelectedCols();
for(size_t i = 0; i < selectedCols.GetCount(); i++)
{
for(int row = 0; row < grid.GetNumberRows(); row++)
{
selection.insert(std::make_pair(row, selectedCols.Item(i)));
}
}

return selection;
}

Aucun commentaire: