Update grid row/column sizes when switching DPI
Because the size of the text (usually) shown in the grid changes, the size of its columns/rows should change as well when DPI changes. Scale them by the DPI ratio if necessary, i.e. if any of them were set to non-default values to achieve this. Note that this is not ideal because it can result in rounding errors and hence in slight change of row/column size when moving the grid window to another display with a different DPI and then back, but to prevent this from happening we'd need to store the column/rows sizes in DIPs inside wxGrid and convert them to actual physical pixels everywhere, which would require much more changes. Still, if the round trip problems turn out to be a real problem in practice, we probably will need to do this. Also note that this doesn't take care of the grid with a native header, but this will be addressed by upcoming commits.
This commit is contained in:
@@ -5354,9 +5354,50 @@ void wxGrid::OnDPIChanged(wxDPIChangedEvent& event)
|
|||||||
{
|
{
|
||||||
InitPixelFields();
|
InitPixelFields();
|
||||||
|
|
||||||
|
// If we have any non-default row sizes, we need to scale them (default
|
||||||
|
// ones will be scaled due to the reinitialization of m_defaultRowHeight
|
||||||
|
// inside InitPixelFields() above).
|
||||||
|
if ( !m_rowHeights.empty() )
|
||||||
|
{
|
||||||
|
int total = 0;
|
||||||
|
for ( unsigned i = 0; i < m_rowHeights.size(); ++i )
|
||||||
|
{
|
||||||
|
int height = m_rowHeights[i];
|
||||||
|
|
||||||
|
// Skip hidden rows.
|
||||||
|
if ( height <= 0 )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
height = height * event.GetNewDPI().x / event.GetOldDPI().x;
|
||||||
|
total += height;
|
||||||
|
|
||||||
|
m_rowHeights[i] = height;
|
||||||
|
m_rowBottoms[i] = total;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Similarly for columns.
|
||||||
|
if ( !m_colWidths.empty() )
|
||||||
|
{
|
||||||
|
int total = 0;
|
||||||
|
for ( unsigned i = 0; i < m_colWidths.size(); ++i )
|
||||||
|
{
|
||||||
|
int width = m_colWidths[i];
|
||||||
|
|
||||||
|
if ( width <= 0 )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
width = width * event.GetNewDPI().x / event.GetOldDPI().x;
|
||||||
|
total += width;
|
||||||
|
|
||||||
|
m_colWidths[i] = width;
|
||||||
|
m_colRights[i] = total;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
InvalidateBestSize();
|
InvalidateBestSize();
|
||||||
|
|
||||||
CalcWindowSizes();
|
CalcDimensions();
|
||||||
|
|
||||||
Refresh();
|
Refresh();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user