Add wxGrid::RefreshAttr() method to force attribute refresh.

A cached attribute may continue to be used even though the attribute returned
by a custom wxGridCellAttrProvider has changed so add a method to force wxGrid
to update the attribute by forgetting the cached copy.

Closes #12406.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65451 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-08-30 22:18:52 +00:00
parent bb612373c0
commit b99450eecb
3 changed files with 38 additions and 0 deletions

View File

@@ -1268,6 +1268,12 @@ public:
void SetRowAttr(int row, wxGridCellAttr *attr); void SetRowAttr(int row, wxGridCellAttr *attr);
void SetColAttr(int col, wxGridCellAttr *attr); void SetColAttr(int col, wxGridCellAttr *attr);
// the grid can cache attributes for the recently used cells (currently it
// only caches one attribute for the most recently used one) and might
// notice that its value in the attribute provider has changed -- if this
// happens, call this function to force it
void RefreshAttr(int row, int col);
// returns the attribute we may modify in place: a new one if this cell // returns the attribute we may modify in place: a new one if this cell
// doesn't have any yet or the existing one if it does // doesn't have any yet or the existing one if it does
// //

View File

@@ -3846,6 +3846,31 @@ public:
*/ */
bool InsertRows(int pos = 0, int numRows = 1, bool updateLabels = true); bool InsertRows(int pos = 0, int numRows = 1, bool updateLabels = true);
/**
Invalidates the cached attribute for the given cell.
For efficiency reasons, wxGrid may cache the recently used attributes
(currently it caches only the single most recently used one, in fact)
which can result in the cell appearance not being refreshed even when
the attribute returned by your custom wxGridCellAttrProvider-derived
class has changed. To force the grid to refresh the cell attribute,
this function may be used. Notice that calling it will not result in
actually redrawing the cell, you still need to call
wxWindow::RefreshRect() to invalidate the area occupied by the cell in
the window to do this. Also note that you don't need to call this
function if you store the attributes in wxGrid itself, i.e. use its
SetAttr() and similar methods, it is only useful when using a separate
custom attributes provider.
@param row
The row of the cell whose attribute needs to be queried again.
@param col
The column of the cell whose attribute needs to be queried again.
@since 2.9.2
*/
void RefreshAttr(int row, int col);
/** /**
Sets the cell attributes for all cells in the specified column. Sets the cell attributes for all cells in the specified column.

View File

@@ -7259,6 +7259,13 @@ void wxGrid::ClearAttrCache()
} }
} }
void wxGrid::RefreshAttr(int row, int col)
{
if ( m_attrCache.row == row && m_attrCache.col == col )
ClearAttrCache();
}
void wxGrid::CacheAttr(int row, int col, wxGridCellAttr *attr) const void wxGrid::CacheAttr(int row, int col, wxGridCellAttr *attr) const
{ {
if ( attr != NULL ) if ( attr != NULL )