From: Vadim Zeitlin Date: Mon, 30 Aug 2010 22:18:52 +0000 (+0000) Subject: Add wxGrid::RefreshAttr() method to force attribute refresh. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/b99450eecb344b39cb8dc31e56d458e582a8eeba 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 --- diff --git a/include/wx/generic/grid.h b/include/wx/generic/grid.h index b42e57e7ca..e02f4848e1 100644 --- a/include/wx/generic/grid.h +++ b/include/wx/generic/grid.h @@ -1268,6 +1268,12 @@ public: void SetRowAttr(int row, 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 // doesn't have any yet or the existing one if it does // diff --git a/interface/wx/grid.h b/interface/wx/grid.h index 7e8c2584be..6203daa4db 100644 --- a/interface/wx/grid.h +++ b/interface/wx/grid.h @@ -3846,6 +3846,31 @@ public: */ 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. diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 34f232f3bd..a05a2d519a 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -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 { if ( attr != NULL )