From: Vadim Zeitlin Date: Sun, 27 Dec 2009 19:40:46 +0000 (+0000) Subject: Account for cells spanning multiple grid cells better when autosizing. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/774f6b312aaec96adf2884539c91b7c6ea43bc03 Account for cells spanning multiple grid cells better when autosizing. The total size of a multi-span cell was accounted for each row/column it covered, resulting in too much space being allocated to them. Only take into account the average size of each row/column computed by dividing the total cell size by number of rows/columns it occupies to fix this. Closes #11498. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63001 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 5825b3d907..45cfa65c3f 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -7812,22 +7812,40 @@ wxGrid::AutoSizeColOrRow(int colOrRow, bool setAsMin, wxGridDirection direction) HideCellEditControl(); SaveEditControlValue(); - // init both of them to avoid compiler warnings, even if we only need one + // initialize both of them just to avoid compiler warnings int row = -1, col = -1; - if ( column ) - col = colOrRow; - else - row = colOrRow; wxCoord extent, extentMax = 0; int max = column ? m_numRows : m_numCols; for ( int rowOrCol = 0; rowOrCol < max; rowOrCol++ ) { if ( column ) + { row = rowOrCol; + col = colOrRow; + } else + { + row = colOrRow; col = rowOrCol; + } + + // we need to account for the cells spanning multiple columns/rows: + // while they may need a lot of space, they don't need all of it in + // this column/row + int numRows, numCols; + const CellSpan span = GetCellSize(row, col, &numRows, &numCols); + if ( span == CellSpan_Inside ) + { + // we need to get the size of the main cell, not of a cell hidden + // by it + row += numRows; + col += numCols; + + // get the size of the main cell too + GetCellSize(row, col, &numRows, &numCols); + } wxGridCellAttr *attr = GetCellAttr(row, col); wxGridCellRenderer *renderer = attr->GetRenderer(this, row, col); @@ -7835,6 +7853,19 @@ wxGrid::AutoSizeColOrRow(int colOrRow, bool setAsMin, wxGridDirection direction) { wxSize size = renderer->GetBestSize(*this, *attr, dc, row, col); extent = column ? size.x : size.y; + + if ( span != CellSpan_None ) + { + // we spread the size of a spanning cell over all the cells it + // covers evenly -- this is probably not ideal but we can't + // really do much better here + // + // notice that numCols and numRows are never 0 as they + // correspond to the size of the main cell of the span and not + // of the cell inside it + extent /= column ? numCols : numRows; + } + if ( extent > extentMax ) extentMax = extent;