Fix keyboard navigation in wxGrid with hidden columns.
The hidden columns (i.e. those whose size was set to 0) should be skipped when find the previous/next column to select when the user presses Left/Right cursor arrow keys in wxGrid, otherwise the focus could completely disappear as it was invisible when it was set to a hidden column. Closes #13281. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68303 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
3e88d48700
commit
b64bb3ca1b
@ -440,6 +440,7 @@ Major new features in this release
|
||||
All (GUI):
|
||||
|
||||
- Support float, double and file name values in wxGenericValidator (troelsk).
|
||||
- Fix keyboard navigation in wxGrid with hidden columns (ivan_14_32).
|
||||
|
||||
OSX:
|
||||
|
||||
|
@ -760,6 +760,12 @@ protected:
|
||||
return m_oper.GetLineAt(m_grid, pos);
|
||||
}
|
||||
|
||||
// Check if the given line is visible, i.e. has non 0 size.
|
||||
bool IsLineVisible(int line) const
|
||||
{
|
||||
return m_oper.GetLineSize(m_grid, line) != 0;
|
||||
}
|
||||
|
||||
|
||||
wxGrid * const m_grid;
|
||||
const wxGridOperations& m_oper;
|
||||
@ -777,14 +783,38 @@ public:
|
||||
{
|
||||
wxASSERT_MSG( m_oper.Select(coords) >= 0, "invalid row/column" );
|
||||
|
||||
return GetLinePos(coords) == 0;
|
||||
int pos = GetLinePos(coords);
|
||||
while ( pos )
|
||||
{
|
||||
// Check the previous line.
|
||||
int line = GetLineAt(--pos);
|
||||
if ( IsLineVisible(line) )
|
||||
{
|
||||
// There is another visible line before this one, hence it's
|
||||
// not at boundary.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// We reached the boundary without finding any visible lines.
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual void Advance(wxGridCellCoords& coords) const
|
||||
{
|
||||
wxASSERT( !IsAtBoundary(coords) );
|
||||
int pos = GetLinePos(coords);
|
||||
for ( ;; )
|
||||
{
|
||||
// This is not supposed to happen if IsAtBoundary() returned false.
|
||||
wxCHECK_RET( pos, "can't advance when already at boundary" );
|
||||
|
||||
m_oper.Set(coords, GetLineAt(GetLinePos(coords) - 1));
|
||||
int line = GetLineAt(--pos);
|
||||
if ( IsLineVisible(line) )
|
||||
{
|
||||
m_oper.Set(coords, line);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
virtual int MoveByPixelDistance(int line, int distance) const
|
||||
@ -794,6 +824,8 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
// Please refer to the comments above when reading this class code, it's
|
||||
// absolutely symmetrical to wxGridBackwardOperations.
|
||||
class wxGridForwardOperations : public wxGridDirectionOperations
|
||||
{
|
||||
public:
|
||||
@ -807,14 +839,32 @@ public:
|
||||
{
|
||||
wxASSERT_MSG( m_oper.Select(coords) < m_numLines, "invalid row/column" );
|
||||
|
||||
return GetLinePos(coords) == m_numLines - 1;
|
||||
int pos = GetLinePos(coords);
|
||||
while ( pos < m_numLines - 1 )
|
||||
{
|
||||
int line = GetLineAt(++pos);
|
||||
if ( IsLineVisible(line) )
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual void Advance(wxGridCellCoords& coords) const
|
||||
{
|
||||
wxASSERT( !IsAtBoundary(coords) );
|
||||
int pos = GetLinePos(coords);
|
||||
for ( ;; )
|
||||
{
|
||||
wxCHECK_RET( pos < m_numLines - 1,
|
||||
"can't advance when already at boundary" );
|
||||
|
||||
m_oper.Set(coords, GetLineAt(GetLinePos(coords) + 1));
|
||||
int line = GetLineAt(++pos);
|
||||
if ( IsLineVisible(line) )
|
||||
{
|
||||
m_oper.Set(coords, line);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
virtual int MoveByPixelDistance(int line, int distance) const
|
||||
|
Loading…
Reference in New Issue
Block a user